CUDA基础介绍

一、GPU简介

1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi被IDC评选为图形芯片工业的市场领导者,但那时候这种芯片还没有GPU的称号,很长的一段时间ATi都是把图形处理器称为VPU,直到AMD收购ATi之后其图形芯片才正式采用GPU的名字。

NVIDIA公司在1999年发布GeForce 256图形处理芯片时首先提出GPU的概念。GPU使显卡削减了对CPU的依赖,并实现部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬体T&L(Transform and Lighting,多边形转换和光源处理)、立方环境材质贴图与顶点混合、纹理压缩及凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术能够说是GPU的标志。

GPU(Graphics Processing Unit)即图形处理器,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上作图像运算工作的微处理器。

显卡作为电脑主机里的一个重要组成部分,承担输出显示图形的任务。显卡的处理器称为图形处理器(GPU),它是显卡的”心脏”,与CPU类似,只不过GPU是专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染所必需的。

时下的GPU多数拥有2D或3D图形加速功能。有了GPU,CPU就从图形处理的任务中解放出来,可以执行其他更多的系统任务,这样可以大大提高计算机的整体性能。

GPU会产生大量热量,所以它的上方通常安装有散热器或风扇。

GPU是显示卡的”大脑”,GPU决定了该显卡的档次和大部分性能,同时GPU也是2D显示卡和3D显示卡的区别依据。2D显示芯片在处理3D图像与特效时主要依赖CPU的处理能力,称为软加速。3D显示芯片是把三维图像和特效处理功能集中在显示芯片内,也就是所谓的”硬件加速”功能。显示芯片一般是显示卡上最大的芯片(也是引脚最多的)。时下市场上的显卡大多采用NVIDIA和 AMD-ATI 两家公司的图形处理芯片。

GPU已经不再局限于3D图形处理了,GPU通用计算技术发展已经引起业界不少的关注,在浮点运算、并行计算等部分计算方面,GPU可以提供数十倍乃至于上百倍于CPU的性能。

GPU通用计算方面的标准目前有OpenCL、CUDA、AMD APP、DirectCompute。

二、GPU通用计算编程

对GPU通用计算进行深入研究从2003年开始,并提出了GPGPU概念,前一个GP则表示通用目的(General Purpose),所以GPGPU一般也被称为通用图形处理器或通用GPU。

GPU通用计算通常采用CPU+GPU异构模式,由CPU负责执行复杂逻辑处理和事务处理等不适合数据并行的计算,由GPU负责计算密集型的大规模数据并行计算。

OpenCL(Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,AMD-ATI、NVIDIA时下的产品都支持OpenCL。目前,OpenCL最新版本为2.2.

CUDA(Compute Unified Device Architecture)是一种将GPU作为数据并行计算设备的软硬件体系,硬件上NVIDIA GeForce 8系列以后的GPU(包括GeForce、ION、Quadro、Tesla系列)已经采用支持CUDA的架构,软件开发包上CUDA也已经发展到CUDA Toolkit 8.0,并且支持Windows、Linux、MacOS三种主流操作系统。CUDA采用比较容易掌握的类C语言进行开发。

         AMD APP(AMD Accelerated Parallel Processing)是AMD加速并行处理技术。是AMD针对旗下图形处理器(GPU)所推出的通用并行计算技术。利用这种技术可以充分发挥AMD GPU的并行运算能力,用于对软件进行加速运算或进行大型的科学运算。AMD APP技术的前身称作ATI Stream。2010年10月,随着AMD Radeon HD6800系列显卡的发布,ATI品牌正式被AMD取代。ATI Stream技术也随着技术升级并更名为AMD APP技术。目前,AMD APP SDK最新版本为3.0.

         DirectCompute是一种用于GPU通用计算的应用程序接口,由Microsoft(微软)开发和推广,集成在Microsoft DirectX内。目前,最新的DirectX版本为DirectX 12,安装在windows 10上。DirectX 11内集成DirectCompute 5.0,那DirectX 12内应该是集成DirectCompute 6.0吧。

         其中OpenCL、DirectCompute、AMD APP(基于开放型标准OpenCL开发)是开放标准,CUDA是私有标准。

三、NVIDIA 显卡系列

NVIDIA(英伟达)创立于1993年1月,是一家以设计智核芯片组为主的无晶圆(Fabless)IC半导体公司。

NVIDIA已经开发出了五大产品系列,以满足特定细分市场需求,包括:GeForce、Tegra、ION、Quadro、Tesla。

Geforce系列主要面向家庭和企业的娱乐应用,该系列又可以分为面向性能的GTX系列,面向主流市场的GTS和GT系列,已经具有高性价比的GS系列。

Quadro系列主要应用于图形工作站中,对专业领域应用进行了专门优化。

Tesla系列是专门用于高性能通用计算的产品线。

Tegra系列是NVIDIA为便携式和移动领域推出的全新解决方案,在极为有限的面积上集成了通用处理器、GPU、视频解码、网络、音频输入输出等功能,并维持了极低的功耗。

针对Geforce显卡系列,NVIDIA各代显卡都遵循了由高至低命名规则:GTX>GTS>GT>GS

从GTX 500系开始,为避免命名复杂带来的产品线识别困扰,NVIDIA显卡将取消GTS级别的显卡,中高端全部使用GTX命名,而低端使用GT命名,带Ti后缀为更高一级显卡,如GTX 560 Ti > GTX 560.

         NVIDIA显卡末尾数字解读,以GeForce GTX 980M:GTX代表是高端显卡的意思;980M:第一位数字9,代表第几代的意思(9是高端显卡第九代的意思,如果末尾数字有四位,则前两位表示是第多少代的意思,如GeForce GTX 1080)。第二位至关重要,因为显卡分高端显卡,中端显卡,入门级显卡就是取决于第二位数字的。第二位数字是1-2代表是入门级显卡;第二位数字是3-5代表是中端显卡;第二位数字是6-9代表是高端显卡。第三位数字是一个特殊的标志,几乎能在市场上买到的显卡都是0结尾的,如果第三位数字为5的显卡一般都是OEM显卡,即只给大厂子做品牌机的特供。数字越大,性能越好。显卡数字后缀Ti,代表加强。

如果用显卡来进行各种运算,衡量显卡性能的参数可包括:(1)、核心数目;(2)、显存带宽(GPU计算能力太强,很多时候瓶颈都在数据传输上);(3)、峰值单精度浮点计算能力;(4)、峰值双精度浮点计算能力;(5)、时钟频率;(6)、架构版本。

四、CUDA基础

1.      简介

CUDA(Compute Unified Device Architecture,统一计算设备架构),是显卡厂商NVIDIA在2007年推出的并行计算平台和编程模型。它利用图形处理器(GPU)能力,实现计算性能的显著提高。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题,从而能通过程序控制底层的硬件进行计算。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员可以使用C/C++/C++11语言来为CUDA架构编写程序。CUDA提供host-device的编程模式以及非常多的接口函数和科学计算库,通过同时执行大量的线程而达到并行的目的。

3.0以下版本仅支持C编程,从3.0版本开始支持C++编程,从7.0版本开始支持C++11编程。

CUDA仅能在有NVIDIA显卡的设备上才能执行,并不是所有的NVIDIA显卡都支持CUDA,目前NVIDIA的GeForce、ION、Quadro以及Tesla显卡系列上均可支持。根据显卡本身的性能不同,支持CUDA的版本也不同。

2.      安装

(1)、在windows上的安装可以参考:http://blog.csdn.net/fengbingchun/article/details/53892997

(2)、在ubuntu上的安装可以参考:http://blog.csdn.net/fengbingchun/article/details/53840684

3.      使用CUDA C编写代码的前提条件

(1)、支持CUDA的图形处理器:从2007年开始,NVIDIA新推出的并且显存超过256MB的GPU都可以用于开发和运行基于CUDAC编写的代码。

(2)、NVIDIA设备驱动程序:NVIDIA提供了一些系统软件来实现应用程序与支持CUDA的硬件之间的通信,即显卡驱动程序。要确保安装匹配的驱动程序,选择与开发环境相符的图形卡和操作系统。

(3)、CUDA开发工具箱:CUDA Toolkit,注意选择与操作系统相匹配的CUDA Toolkit。

(4)、标准C编译器:由于CUDA C应用程序将在两个不同的处理器上执行计算,因此需要两个编译器。其中一个编译器为GPU编译代码,而另一个为CPU编译代码。下载并安装CUDA Toolkit后,就会获得一个编译GPU代码的编译器。对于CPU编译器,Windows推荐使用Visual Studio,Linux使用GNU C编译器(gcc),Mac使用Xcode。

4.      设备计算能力

设备计算能力的版本描述了一种GPU对CUDA功能的支持程度。计算能力版本中小数点前的第一位用于表示设备核心架构,小数点后的第一位则表示更加细微的进步,包括对核心架构的改进以及功能的完善等。例如,计算能力1.0的设备能够支持CUDA,而计算能力1.1设备加入了对全局存储器原子操作的支持,计算能力1.2的设备则可以支持warp vote函数等更多功能,而计算能力1.3的设备又加入了对双精度浮点运算功能。

GeForce GTX 970型号计算能力为5.2,GeForce GT 640M型号计算能力为3.0,目前GeForce系列最高的计算能为6.1,可在https://developer.nvidia.com/cuda-gpus中查找各种系列型号的计算能力以及查找指定的显卡型号是否支持CUDA。

5.      软件体系

CUDA的软件堆栈由三层构成,如下图,CUDA Library、CUDA runtimeAPI、CUDA driver API. CUDA的核心是CUDA C语言,它包含对C语言的最小扩展集和一个运行时库,使用这些扩展和运行时库的源文件必须通过nvcc编译器进行编译。

CUDA C语言编译得到的只是GPU端代码,而要管理GPU资源,在GPU上分配显存并启动内核函数,就必须借助CUDA运行时API(runtime API)或者CUDA驱动API(driver API)来实现。在一个程序中只能使用CUDA运行时API与CUDA驱动API中的一种,不能混合使用

原文地址:https://www.cnblogs.com/allcloud/p/7686183.html