今天,GPU已经不再局限于3D图形处理,在通用方面也逐渐崭露头角,事实也证明在浮点运算、并行计算等部分计算方面,GPU可以提供数十倍 乃至于上百倍于CPU性能。今天如果还把GPU称作“显卡”或“图形处理器”就不确切了。准确的说,现在的GPU应该称为“大规模多线程并 行处理器”或叫“GPU计算机”,GPU可以看成是“GeneralProcessingUnit,通用处理器”的缩写。 CPU中大量的晶体管用作高速缓存(cache)、逻辑控制单元(Control),只有少量的用作计算单元(ALU)。而GP U则把更多的晶体管用作了计算单元,只有少量晶体管用作了高速缓存(Cache)和逻辑控制单元,这使得GPU比CPU更适合完成 密集计算任务,如图2。高效的并行性这一功能主要是通过GPU多条绘制流水线的并行计算来体现的。在目前主流的GPU 中,配置多达16个片段处理流水线,6个顶点处理流水线。多条流水线可以在单一控制部件的集中控制下运行,也可以独立运行。GPU的顶点处 理流水线使用MIMD方式控制,片段处理流水线使用SIMD结构。相对于并行机而言,GPU提供的并行性在十分廉价的基础上,为很多适合于 在GPU上进行处理的应用提供了一个很好的并行方案。GPU的优势在于天生的并行计算的体系机构。目前,GPU已经达到240核,1 4亿晶体管,浮点运算能力可达到1万亿次/每秒,而四核CPU的浮点运算能力.07TFLOPS(700亿次/每秒)。 TelsaS10701U机架服务器,共有4个GPU卡,共960个内核,性能达到4万亿次每秒,功耗只有700瓦。而如果要达 到相同计算性能,需要一个服务器集群才能实现,而功耗可能达到几万瓦。CUDA表示ComputeUnifiedDeviceA rchitecture(统一计算设备架构),是NVIDIA为自家的GPU编写了一套编译器及相关的库文件。作为一种新型的硬件和软件架 构,用于将GPU上作为数据并行计算设备在GPU上进行计算的发放和管理,而无需将其映射到图像API。是一个并行编程模型和一个软件编程 环境,它主要就是为了帮助广大的程序员来更好的开发平滑扩展的并行程序。对于许多熟悉标准编程语言,如C语言的程序员来说,是很容易掌握的 。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更 高的密集数据计算解决方案。CUDA是业界的首款并行运算语言,而且其非常普及化,目前有高达8千万的PC用户可以支持该语言。 CUDA编程模型中,将CPU作为主机(host),GPU作为协处理器或者设备(device)。在这个模型中CPU和GP U协同工作,各司其职。CPU负责逻辑性强的事务处理和串行运算,GPU则专注于高度线程化的并行处理任务。CUDA架构下的程 序是GPU和CPU的混合代码,它首先由NVIDIA软件包中的C编译器nvcc进行编译。经过编译后,GPU和CPU的代码将被分离,G PU的代码被编译成GPU计算的机器码,而CPU的C代码由标准的C编译器进行编译。CUDA的代码分成两部分,一部分在host (CPU)上运行,是普通的C代码;另一部分在device(GPU)上运行,是并行代码,称为kernel,由nvcc进行编译。?? ????Kernel产生的所有线程成为Grid。在并行部分结束后,程序回到串行部分即到host上运行。在理想情况下,CPU 串行代码的作用应该只是清理上一个内核函数和启动下一个内核函数。??????在CUDA中,host和device有不同的内 存空间。所以在device上执行kernel时,程序员需要把hostmemory上的数据传送到分配的devicememory上 。在device执行完以后,需要把结果从device传送回host,并释放devicememory。CUDAruntimes ystem提供了API给程序员做这些事情。1、在这里我们可以拿古时候的军队作为一个例子来理解这里的程序执行模型。每一 个线程,就相当于我们的每一个士兵,在没有当兵之前,大家都不知道自己做什么。2、当要执行某一个大的军事任务的时候,大将军发 布命令,大家来要把对面的敌人部队的n个敌人消灭了。然后把队伍分成M个部分,每一个部分完成自己的工作,有的是做侦查的工作,有的是做诱 敌的工作,有的是做伏击的工作,有的是做后备的工作,有的是做后勤的工作……反正把一个大任务按照不同的类别,不同的流程不同,分别由M个 部分来完成。这里我们可以把大将军看着是Host,它把这次军事行动分解成一个一个的kernel:kernel_1,kernel_ 2……kernel_M,每一个kernel就交给每一个Grid来完成。(副将?千户?就看管的人多人少了,如果GPU硬件支持少一点, 那就是千户;要是GPU硬件高级一些,管理的人多一些,那就副将?戚家军也不过四五千人,咱也不能太贪心,一下子就想统军百万,再说了,敢 问世上韩信一样的将才又哪有那么多啦?)当要执行这些任务的时候,每一个Grid又把任务分成一部分一部分的,毕竟人太多,他一个官不 过来,他只要管理几个团队中间的高级军官就可以了。Grid又把任务划分为一个个的Block(百户?),这里每一个Grid管理的Blo ck也是有限的,(人就那么多……想管多少得看硬件的支持)。毕竟显卡上的GPU硬件还是很少,Thread(线程)相对于真正的军队来说 人还是少了很多。所以到Block这个层的时候,就直接管理每一个Thread(士兵)。由于古代通信不是很方便(从GPU的发展史来 看,如果按照中国的历史,现在的GPU也就还处在战国时代吧……),所以每一个Block(百户)内部的Thread(士兵)才能方便的通 信,按照既定的规则进行同步;而各个block之间就没那么方便了,大家不能互相通讯。不过同一个(千户)Grid管理的block之间是 共享同一个任务分配的资源的。每一个Grid都可以从大将军那里分配到一些任务,和一些粮食,同一个Grid的block都可以分到这个G rid分配到的粮食。而每一个(千户)Grid本身的任务就不一样,所以Grid除了知道自己做的事情外,其他的Grid他都不会知道了。 ----这差不多就是一个运行模型。看到这张图,我们可以对应来讲解我们的Thread部队。一个大将军Host,分配了任务中的两个 任务(Kernel1,Kernel2)给了千户(Grid1,Grid2)来完成。千户Grid1里面把自己的队伍分成了6个百户Bl ock,然后每一个百户又把任务分配给了自己的士兵(Thread)来具体完成。这里得说明的是,由于千户拿到的任务Kernel是定了的 ,所以到每个士兵(Thread)也就那里就只会埋头做同样的事情。运行在GPU上的程序称为kernel内核函数。 线程块(block): 在GPU中并行运算的最小单位是线程(thread),一定数量的线程可以组成一个线程块。特点: 每个线程由线程ID(threadID)标识,即线程块中的线程号。为了便于线程ID的寻址,应用程序将线程块指定为一定大小的二维数 组(threadIdx.x,threadIdx.y)或三维数组(threadIdx.x,threadIdx.y,threadIdx .z)。块网格(grid): 在由于每个线程块所能包含的线程数目是有限的,不过执行相同程序的线程块,可以组成块网格 。这个模式则可以让程序不受GPU实际能同时执行线程数目的限制,使单个内核调用中启动的线程总数变得更大。 特点: 每个块网格中 由线程块ID(blockID)标识,即块网格中的线程块号。为了便于线程块ID的寻址,应用程序还可以将块网格指定为一定大小的二维数 组(blockIdx.x,blockIdx.y)CUDA架构自身对线程的建立也有一些限制:每个线程块的线程数目不能超过512 个;每个线程块中的线程维度(Dx,Dy,Dz)分别不能超过512,512,64;每个块网格中线程块的维度都不能超过65535。 GPU与CPU线程的区别GPU的线程非常轻量,线程切换~1cycle,而CPU需要~1000cycleGPU上 的线程数>1000时才能有效利用GPU的计算能力GPU和CUDAGPU和CUDA1GP U简介3GPU优势4CUDA简介2GPU的工作原理5CUDA编程 模型6CUDA编程实例GPU(GraphicProcessingUnit):“图形处理器”。NVIDIA公 司在1999年发布GeForce256图形处理芯片时首先提出GPU的概念。GPUGeForce256GPU简介 GPU——大规模多线程并行处理器/通用处理器(GeneralProcessingUnit)GPU是加速科学计算最快的并行处 理器。GPU简介GPU与CPU硬件架构的对比CPU:更多资源用于缓存及流控制GPU:更多资源用于数据计算适合具备可预测 、针对数组的计算模式CacheALUControlALUALUALUDRAMCPUDRAMGPU图XGP U与CPU的微结构示意图(GPU将更多的晶体管用于数据处理)GPU工作原理CPU工作过程: CPU的工作原理就像一个工厂对产品的加工过程:进入工厂的原料(程序指令),经过物资分配部门(控制单元)的调 度分配,被送往生产线(逻辑运算单元),生产出成品(处理后的数据)后,再存储在仓库(存储单元)中,最后等着拿到市场上去卖(交由应用程 序使用)。GPU工作原理GPU工作过程:GPU最初的设计就能够执行并行指令,从一个GPU核心收到一组多 边形数据,到完成所有处理并输出图像可以做到完全独立。由于最初GPU就采用了大量的执行单元,这些执行单元可以轻松的加载并行处理,而不 像CPU那样的单线程处理GPU工作原理一、更快的计算能力与带宽GPU的明显优势二、更高的能源效率GPU的明 显优势三、节省大量空间GPU的明显优势GPU优势总结:GPU的明显优势GPU的优势高效的并行性 这一功能主要是通过GPU多条绘制流水线的并行计算来体现的。高密集的运算GPU通常具有128位或256位的 内存位宽,因此GPU在计算密集型应用方面具有很好的性能。超长图形流水线。GPU超长图形流水线的设计以吞吐量的最 大化为目标(如NVIDIAGeForce3流水线有800个阶段),因此GPU作为数据流并行处理机,在对大规模的数据流并行处理方 面具有明显的优势。GPU的应用1、并行计算行业2、生命科学研究在癌症研究中重碳酸盐跟踪数据工作,为了跟踪这些数据, 如果使用原有CPU运算,以常见项目为例可能需要一周左右时间,而这还必须是高性能计算机多个CPU集群完成,而GPU可以成百倍的速度来 完成整个工作,相对现有HPC来说,占地面积极小(不可能让医院拥有一个HPC,一个8GPU的1U大小基于Tesla的服务器显然空间占 用上更合理。同时,从运算速度和能耗来说,也绝对优于CPU为主的HPC。3、地理信息系统地理信息系统数据集已经变得越来越复杂,并 且常常会涉及到许多千兆字节的交互式地图。在这种压力下,我们推出了能够快速、高效并准确处理这些数据集的产品。有了CUDA的帮助,从前 需要20分钟才能完成的运算现在只需30秒即可完成,而从前需要30到40秒钟完成的运算现在能够实现实时运算。4、医疗成像在成像技 术中,一个非常有趣的领域就是裸眼立体成像技术,。东京大学的TakeyoshiDohi教授与他的同事研究了NVDIA的CUDA并行 计算平台之后认为,医疗成像是这种平台非常有前途的应用领域之一。根据小组的研究,NVIDIA的GPU比最新的多核CPU至少要快70倍 。另外,测试显示,对于较大规模的体纹理数据,GPU的性能更为突出。5、专业音频处理和视频压缩视频编码的转化是令人非常头疼的一件 事,一款顶级的处理器在转换容量巨大的视频文件的时候,真的是慢如蜗牛。目前,NVIDIA与许多软件开发商在推广支持GPU加速的视频压 缩软件,在GPU群核并行处理的巨大优势下,NVIDIA开发的CUDA技术可以实现众多GPU计算功能,包括并行数据高速缓存器,让最新 一代的多个GPU流处理器之间能够在执行复杂计算任务时互相协作,实现高速运算。6、GPU应用行业总结只要是涉及到密 集型数据处理和并行数据计算的行业都可以通过GPU来实现!CUDA简介 ComputeUnifiedDeviceAr chitecture 统一计算架构模型CUDA?是一种由NVIDIA推出的通用并行计算架构,该架构使G PU能够解决复杂的计算问题。使用经过扩展的C语言来为CUDA?架构编写程序CUDA表示使用CUDA可以发挥显卡的大规模并行 计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种 效率更高的密集教据计算解决方案。CUDA简介1主机与设备2Kernel函数的定义与调用3线程结构 4CUDAC语言五CUDA编程模型CPU、GPU协同工作利用此工作方式将处理速度提升了很多倍五CUDA编程模型 1主机与设备主机(host):CPU设备(Device):GPUCPU负责进行逻辑性强的事物处理和串行计算;GP U则专注于执行高度线程化的并行处理任务。在一个系统中可以存在一个主机和若干个设备。CUDA对内存的操作和一般的C程序基本相同, 但是增加了一种新的pinnedmemory。五CUDA编程模型一个完整的CUDA程序是由一系列的设备端kernel 函数并行执行的步骤和主机端的串行处理步骤共同组成的。运行在CUDA并行计算的函数称为kernel(内核函数)。一个时刻只能运行 一个kernel。CPU串行代码完成的工作包括:在启动kernel前进行数据准备和设备初始化的工作以及在kernel之间进行一些 串行计算。一个kernel中存在两个层次的并行,即Grid中的block间的并行和block中的thread间的并行。1主机 与设备2kernel函数的定义与调用五CUDA编程模型运行在GPU上的程序称为kernel内核函数。//kernel定 义__global__voidVecAdd(floatA,floatB,floatC){}Intmai n(){//kernel的调用VecAdd<<<1,N>>>(A,B,C)}这段代码中VecAdd<<<1,N>>>(A, B,C)完成了对内核函数VecAdd的调用。运算符<<<1,N>>>中是内核函数执行参数,这里表示Kernel的Grid中有 1个block,每个block中有N个thread。A,B,C代表函数参数。线程(thread):CUDA中的基本执行单 元;硬件支持,开销很小;所有线程执行相同的代码(STMD)单指令多线程每个线程有一个唯一的标识ID——threadIdx 若干线程还可以组成块(Block)GPU与CPU线程的区别GPU的线程非常轻量,线程切换~1cycle,而CPU需要~100 0cycleGPU上的线程数>1000时才能有效利用GPU的计算能力线程块可以呈一维、二维或者三维结构DeviceGr id1Block(0,0)Block(1,0)Block(2,0)Block(0,1)Block(1 ,1)Block(2,1)Block(1,1)Thread(0,1)Thread(1,1)Thread (2,1)Thread(3,1)Thread(4,1)Thread(0,2)Thread(1,2)T hread(2,2)Thread(3,2)Thread(4,2)Thread(0,0)Thread(1, 0)Thread(2,0)Thread(3,0)Thread(4,0)3线程结构五CUDA编程模型五 CUDA编程模型3线程结构五CUDA编程模型4CUDAC语言CUDA对C的扩展包括:引入函数类型限定符。_ _device__、__host__和__global__,用于规定函数是在主机还是设备上执行,以及这个函数是从主机还是设备调用。 引入变量类型限定符。__device__、__shared__、__constant__,用于规定变量被存放在哪类存储器上 。引入内置矢量类型。如:char4,ushort3,double2等,它们是由基本的整型和浮点型构成的矢量类型,通过X、Y、Z 、W访问飞一个放量,在设备端代码中各矢量类型有不同的对齐要求。引入了四个内建变量。blockIdx和threadIdx用于索引 线程块和线程;girdDim和blockDim用于表示线程网格和线程块的维度。引入<<<>>>运算符。用于指定线程网格和线程块 的维度,传递执行参数。引入一些函数:同步函数、数学函数、测时函数等。分配内存空间和显存空间初始化内存空间将要计算的数据 从内存上复制到显存上执行kernel计算将计算后显存上的数据复制到内存上处理复制到内存上的数据五CUDA编程 模型5CUDA程序的基本模式目的:将两个数组中对应元素分别相加,然后将结果存入到另外一个数组中。 首先,准备数据 :intdata_size=100;floatA=newfloat[data_size], B=newfloat[data_size],C=newfloat[data_size];fo r(inti=0;ii;}六CUDA程序实例实例一:数组相加传统在CPU中完成数组相加的C语言代码voidadd_v ector_cpu(floatA,floatB,floatC,intsize){for(in ti=0;i序实例实例一:数组相加CUDA版本:在GPU中建立100个线程,每个线程中都运行一次这个函数,其中threadIdx.x是线 程代号为0到99__global__voidVectorAdd(floatA,floatB,floatC ){intidx=threadIdx.x;C[idx]=A[idx]+B[idx];} CPU和GPU程序对比1、设备上运行的程序__global__voidVectorAdd(floatarrayA,f loatarrayB,floatoutput){int idx=threadIdx.x;ou tput[idx]=arrayA[idx]+arrayB[idx];}2、主机上运行的程序voidadd_vect or_gpu(floata,floatb,floatc,intsize){intsize=100 ;intdata_size=sizesizeof(float);//part1,在设备上申请存储空间 float dev_A, dev_B, dev_C;cudaMalloc((void)&dev_A, data_size);cudaMalloc((void)&dev_B,data_size);cud aMalloc((void)&dev_C,data_size);//part2,复制数据到设备内存中cud aMemcpy(dev_A,a,data_size,cudaMemcpyHostToDevice);cudaM emcpy(dev_B,b,data_size,cudaMemcpyHostToDevice);//part 3,运行核函数VectorAdd<<<1,size>>>(dev_A,dev_B,dev_C); //part4,从设备内存中复制出结果cudaMemcpy(c,dev_C,data_size,cudaM emcpyDeviceToHost);//part5,释放设备内存空间cudaFree(dev_A); cudaFree(dev_B);cudaFree(dev_C);}六CUDA程序实例实例一:数组相加 分配内存空间和显存空间初始化内存空间将要计算的数据从内存上复制到显存上执行kernel计算将计算后显存上的数据 复制到内存上处理复制到内存上的数据五CUDA编程模型实例一:数组相加Thankyou!GPU的出现将CP U从每年的图形运算中解放出来。如今,NVIDIA新推出的一种名为CUDA的技术又计划让GPU编程成为今后的主流——传统的开发工作都 是使用CPU,而如今NVIDIA称“通过CUDA,开发人员可以使用GPU来编程。”???CUDA,英文全称为ComputeU nifiedDeviceArchitecture,意为“统一计算设备架构”,它是业界首个GPU用的C开发环境。在实际应用上,C UDA等类似技术可让我们在很多方面感受到它所带来的巨变。CUDA:让人人都拥有超级计算机????这么多年来,或许有很多朋友 都在幻想,如果自己的计算机是台超级计算机,那该有多厉害啊。如果有了CUDA,这个愿望就能轻易实现。比如TeslaC870GPU 可凭借其128个流处理器、CUDAC语言开发环境和开发工具以及一系列已经问世的应用程序,让专业人员能够更快地开发应用程序和解决一 些以前只能通过访问共享服务器群集来解决的问题。特别是通过CUDA和其强大的多线程处理器架构,让人们在工作站上即可解决以前需要用大型 服务器集群或超级计算机去处的计算难题,让普通计算机进行万亿次的前景非常光明。???再如,人的身体由数十亿个细胞组成,而其中只要 有那么一个出现病变,并且经过不断的分裂和复制,这个小小的细胞就有可能引起致命的癌症。要想知道一个细胞是如何发生眷恋的,并且采取何种 措施去它继续,以免产生不良后果,以前单凭CPU为中心的计算机要模拟这些变异很困难,而现在科学工作者们正在运用CUDA这类全新的工具 来组成具有超强性能的计算机来模拟正常细胞的代谢过程。???在游戏中,特别是在3D游戏中,真实性往往需要高性能的硬件设备才能济运 行。在3D技术发展早期,图形芯片只能完成常规的渲染操作,而的建模和光照运算必须以软件模拟的方式由CPU来完成,这让游戏难以获得更真 实的画面。而随着CUDA和PhysX物理引擎厂商的“联姻”,它可以更好地解决游戏设计及运行中的物理模拟问题,可以更使得地创建和编辑 高级人体、材质和建模、支持连续碰撞检测等等,从而最终让玩家在游戏中获得更真实更震撼的游戏体验。CUDA的出现无疑将促成GPU不再仅 局限于图形去处方面,还可以GPU来解决商业、工业、军事以及科学方面的复杂计算问题。GPU是英文GraphicPro cessingUnit的缩写,即图形处理器。早期的计算机也需要处理图形,但是那时候图形的处理相对简单,多数工作都交由中央处理器C PU来完成。GPU的计算能力在近10年间有了飞速的发展,同时可编程性也有了本质的提升,因此针对GPU编写一些复杂的计算程序成为了可 能。GPU的出现将CPU从每年的图形运算中解放出来。如今,NVIDIA新推出的一种名为CUDA的技术又计划让GPU 编程成为今后的主流——传统的开发工作都是使用CPU,而如今NVIDIA称“通过CUDA,开发人员可以使用GPU来编程。”??? CUDA,英文全称为ComputeUnifiedDeviceArchitecture,意为“统一计算设备架构”,它是业界首个 GPU用的C开发环境。在实际应用上,CUDA等类似技术可让我们在很多方面感受到它所带来的巨变。CUDA:让人人都拥有超级计算机 ????这么多年来,或许有很多朋友都在幻想,如果自己的计算机是台超级计算机,那该有多厉害啊。如果有了CUDA,这个愿望就能轻易 实现。比如TeslaC870GPU可凭借其128个流处理器、CUDAC语言开发环境和开发工具以及一系列已经问世的应用程序,让 专业人员能够更快地开发应用程序和解决一些以前只能通过访问共享服务器群集来解决的问题。特别是通过CUDA和其强大的多线程处理器架构, 让人们在工作站上即可解决以前需要用大型服务器集群或超级计算机去处的计算难题,让普通计算机进行万亿次的前景非常光明。???再如, 人的身体由数十亿个细胞组成,而其中只要有那么一个出现病变,并且经过不断的分裂和复制,这个小小的细胞就有可能引起致命的癌症。要想知道 一个细胞是如何发生眷恋的,并且采取何种措施去它继续,以免产生不良后果,以前单凭CPU为中心的计算机要模拟这些变异很困难,而现在科学 工作者们正在运用CUDA这类全新的工具来组成具有超强性能的计算机来模拟正常细胞的代谢过程。???在游戏中,特别是在3D游戏中, 真实性往往需要高性能的硬件设备才能济运行。在3D技术发展早期,图形芯片只能完成常规的渲染操作,而的建模和光照运算必须以软件模拟的方 式由CPU来完成,这让游戏难以获得更真实的画面。而随着CUDA和PhysX物理引擎厂商的“联姻”,它可以更好地解决游戏设计及运行中 的物理模拟问题,可以更使得地创建和编辑高级人体、材质和建模、支持连续碰撞检测等等,从而最终让玩家在游戏中获得更真实更震撼的游戏体验 。CUDA的出现无疑将促成GPU不再仅局限于图形去处方面,还可以GPU来解决商业、工业、军事以及科学方面的复杂计算问题。 GPU是英文GraphicProcessingUnit的缩写,即图形处理器。早期的计算机也需要处理图形,但是那时候图形的处 理相对简单,多数工作都交由中央处理器CPU来完成。GPU的计算能力在近10年间有了飞速的发展,同时可编程性也有了本质的提升,因此针 对GPU编写一些复杂的计算程序成为了可能。今天,GPU已经不再局限于3D图形处理,在通用方面也逐渐崭露头角,事实也 证明在浮点运算、并行计算等部分计算方面,GPU可以提供数十倍乃至于上百倍于CPU性能。今天如果还把GPU称作“显卡”或“图形处理器 ”就不确切了。准确的说,现在的GPU应该称为“大规模多线程并行处理器”或叫“GPU计算机”,GPU可以看成是“General ProcessingUnit,通用处理器”的缩写。CPU中大量的晶体管用作高速缓存(cache)、逻辑控制单元( Control),只有少量的用作计算单元(ALU)。而GPU则把更多的晶体管用作了计算单元,只有少量晶体管用作了高速缓存(Ca che)和逻辑控制单元,这使得GPU比CPU更适合完成密集计算任务,如图2。高效的并行性这一功能主要是通 过GPU多条绘制流水线的并行计算来体现的。在目前主流的GPU中,配置多达16个片段处理流水线,6个顶点处理流水线。多条流水线可以在 单一控制部件的集中控制下运行,也可以独立运行。GPU的顶点处理流水线使用MIMD方式控制,片段处理流水线使用SIMD结构。相对于并 行机而言,GPU提供的并行性在十分廉价的基础上,为很多适合于在GPU上进行处理的应用提供了一个很好的并行方案。GPU的优势在 于天生的并行计算的体系机构。目前,GPU已经达到240核,14亿晶体管,浮点运算能力可达到1万亿次/每秒,而四核CPU的浮点运 算能力.07TFLOPS(700亿次/每秒)。TelsaS10701U机架服务器,共有4个GPU卡,共96 0个内核,性能达到4万亿次每秒,功耗只有700瓦。而如果要达到相同计算性能,需要一个服务器集群才能实现,而功耗可能达到几万瓦。 CUDA表示ComputeUnifiedDeviceArchitecture(统一计算设备架构),是NVIDIA为自家的GP U编写了一套编译器及相关的库文件。作为一种新型的硬件和软件架构,用于将GPU上作为数据并行计算设备在GPU上进行计算的发放和管理, 而无需将其映射到图像API。是一个并行编程模型和一个软件编程环境,它主要就是为了帮助广大的程序员来更好的开发平滑扩展的并行程序。对 于许多熟悉标准编程语言,如C语言的程序员来说,是很容易掌握的。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力 ,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。CUDA是业界的首款并行运算语言,而且其非常 普及化,目前有高达8千万的PC用户可以支持该语言。CUDA编程模型中,将CPU作为主机(host),GPU作为协处理 器或者设备(device)。在这个模型中CPU和GPU协同工作,各司其职。CPU负责逻辑性强的事务处理和串行运算,GPU则 专注于高度线程化的并行处理任务。CUDA架构下的程序是GPU和CPU的混合代码,它首先由NVIDIA软件包中的C编译器n vcc进行编译。经过编译后,GPU和CPU的代码将被分离,GPU的代码被编译成GPU计算的机器码,而CPU的C代码由标准的C编译器 进行编译。CUDA的代码分成两部分,一部分在host(CPU)上运行,是普通的C代码;另一部分在device(GPU)上运 行,是并行代码,称为kernel,由nvcc进行编译。??????Kernel产生的所有线程成为Grid。在并行部分结束后,程 序回到串行部分即到host上运行。在理想情况下,CPU串行代码的作用应该只是清理上一个内核函数和启动下一个内核函数。 ??????在CUDA中,host和device有不同的内存空间。所以在device上执行kernel时,程序员需要把host memory上的数据传送到分配的devicememory上。在device执行完以后,需要把结果从device传送回host,并 释放devicememory。CUDAruntimesystem提供了API给程序员做这些事情。1、在这里我们 可以拿古时候的军队作为一个例子来理解这里的程序执行模型。每一个线程,就相当于我们的每一个士兵,在没有当兵之前,大家都不知道自己做什 么。2、当要执行某一个大的军事任务的时候,大将军发布命令,大家来要把对面的敌人部队的n个敌人消灭了。然后把队伍分成M个部 分,每一个部分完成自己的工作,有的是做侦查的工作,有的是做诱敌的工作,有的是做伏击的工作,有的是做后备的工作,有的是做后勤的工作… …反正把一个大任务按照不同的类别,不同的流程不同,分别由M个部分来完成。这里我们可以把大将军看着是Host,它把这次军事行动分 解成一个一个的kernel:kernel_1,kernel_2……kernel_M,每一个kernel就交给每一个Grid来完成。 (副将?千户?就看管的人多人少了,如果GPU硬件支持少一点,那就是千户;要是GPU硬件高级一些,管理的人多一些,那就副将?戚家军也 不过四五千人,咱也不能太贪心,一下子就想统军百万,再说了,敢问世上韩信一样的将才又哪有那么多啦?)当要执行这些任务的时候,每一 个Grid又把任务分成一部分一部分的,毕竟人太多,他一个官不过来,他只要管理几个团队中间的高级军官就可以了。Grid又把任务划分为 一个个的Block(百户?),这里每一个Grid管理的Block也是有限的,(人就那么多……想管多少得看硬件的支持)。毕竟显卡上的 GPU硬件还是很少,Thread(线程)相对于真正的军队来说人还是少了很多。所以到Block这个层的时候,就直接管理每一个Thre ad(士兵)。由于古代通信不是很方便(从GPU的发展史来看,如果按照中国的历史,现在的GPU也就还处在战国时代吧……),所以每 一个Block(百户)内部的Thread(士兵)才能方便的通信,按照既定的规则进行同步;而各个block之间就没那么方便了,大家不 能互相通讯。不过同一个(千户)Grid管理的block之间是共享同一个任务分配的资源的。每一个Grid都可以从大将军那里分配到一些任务,和一些粮食,同一个Grid的block都可以分到这个Grid分配到的粮食。而每一个(千户)Grid本身的任务就不一样,所以Grid除了知道自己做的事情外,其他的Grid他都不会知道了。----这差不多就是一个运行模型。看到这张图,我们可以对应来讲解我们的Thread部队。一个大将军Host,分配了任务中的两个任务(Kernel1,Kernel2)给了千户(Grid1,Grid2)来完成。千户Grid1里面把自己的队伍分成了6个百户Block,然后每一个百户又把任务分配给了自己的士兵(Thread)来具体完成。这里得说明的是,由于千户拿到的任务Kernel是定了的,所以到每个士兵(Thread)也就那里就只会埋头做同样的事情。运行在GPU上的程序称为kernel内核函数。线程块(block): 在GPU中并行运算的最小单位是线程(thread),一定数量的线程可以组成一个线程块。特点: 每个线程由线程ID(threadID)标识,即线程块中的线程号。为了便于线程ID的寻址,应用程序将线程块指定为一定大小的二维数组(threadIdx.x,threadIdx.y)或三维数组(threadIdx.x,threadIdx.y,threadIdx.z)。块网格(grid): 在由于每个线程块所能包含的线程数目是有限的,不过执行相同程序的线程块,可以组成块网格。这个模式则可以让程序不受GPU实际能同时执行线程数目的限制,使单个内核调用中启动的线程总数变得更大。 特点: 每个块网格中由线程块ID(blockID)标识,即块网格中的线程块号。为了便于线程块ID的寻址,应用程序还可以将块网格指定为一定大小的二维数组(blockIdx.x,blockIdx.y)CUDA架构自身对线程的建立也有一些限制:每个线程块的线程数目不能超过512个;每个线程块中的线程维度(Dx,Dy,Dz)分别不能超过512,512,64;每个块网格中线程块的维度都不能超过65535。GPU与CPU线程的区别GPU的线程非常轻量,线程切换~1cycle,而CPU需要~1000cycleGPU上的线程数>1000时才能有效利用GPU的计算能力 |
|