1 异构盘算、GPGPU与OpenCL
OpenCL是前当一个通用的由很多公司和组织同共起发的多CPU\GPU\其他片芯 异构盘算(heterogeneous)的标准,它是跨平台的。旨在充分利用GPU壮大的并行盘算能力以及与CPU的协同任务,更高效的利用硬件高效的成完大规模的(尤其是并行度高的)盘算。在从前利用GPU对像图渲染行进减速的术技非常成熟,但是我们晓得GPU的片芯构结长擅大规模的并行盘算(PC级的GPU可能就是CPU的上万倍),CPU则长擅逻辑控制,因此不只范围与像图渲染,人们望希将这类盘算能力扩展到更多域领,所以这也被称为GPGPU(即通处用盘算处置的GPU)。
简略的说,我们的CPU不并合适盘算,它是多指令单数据流(MISD)的系体构结,更加长擅的是做逻辑控制,而数据处置基本是单流水线的,所以我们的代码for(i=0;...;i++)这类在CPU上要重复代迭的跑很多遍,但是你的显卡GPU则不是这样,GPU是典范的单指令多数据(SIMD)的系体构结,它不长擅逻辑控制,但是确切生天的向量盘算呆板,对于for(i=0;...;i++)这样的代码偶然只需要跑一遍,所以形图界世中那么多的顶点、段片才能速快的并行在显卡中渲染处置
GPU的晶体管可以到几十亿个,而CPU常通只有几个亿,
如上图是NVidia Femi100的构结,它有着大批的并行盘算单元。
所以人们就想如何将更多的盘算代码搬到GPU上,让他不知做rendering,而CPU只担任逻辑控制,这类一个CPU(控制单元)+几个GPU(偶然可能再加几个CPU)(盘算单元)的构架就是所谓的异构程编(heterogeneous),在这里面的GPU就是GPGPU。异构程编的远景和效率是非常振奋人心的,在很多域领,尤其是高并行度的盘算中,效率升提的数量级不是几倍,而是百倍千倍。
其实NVIDIA在很早就退出了利用其显卡的GPGPU盘算 CUDA构架,事先的影响是很大的,将很多盘算任务(学科盘算、像图渲染、游戏)的题问提高了几个数量级的效率,记得那时NVIDIA来浙大绍介CUDA,演示了实时的ray tracing、大批刚体的互相碰撞等例子,还是激昂了一下的,CUDA在现乎似经已展发到了5.0,而且是NVDIA主力推的通用盘算构架,但是CUDA大最的范围就是它只能应用N家自己的显卡,对于宽大的A卡用户力所不及。OpenCL则在以后应运而生,它由极大主流片芯商、作操系统、件软开辟者、学术机构、间中件提供者等公司合联起发,它最初由Apple提出起发标准,随后Khronos Group建立任务组,调协这些公司同共维护这套通用的盘算语言。Khronos Group听起来较比悉熟吧,像图绘制域领有名的软硬件接口API标准有名的OpenGL也是这个组织维护的,其实他们还维护了很多多媒体域领的标准,可能也是类似于Open***起名的(所以刚听到OpenCL的时候就在想它与OpenGl有啥系关),OpenCl没有一个特定的SDK,Khronos Group只是指定标准(你可以懂得为他们义定头文件),而详细的implementation则是由不同介入公司来做,这样你会现发NVDIA将OpenCL做了实现后即成到它的CUDA SDK中,而AMD则将其实现后放在所谓是AMD APP (Accelerated Paral Processing)SDK中,而Intel也做了实现,所以前目的主流CPU和GPU都支撑OpenCL构架,虽然不同公司做了不同的SDK,但是他们都遵照样同的OpenCL标准,也就是说原则上如果你用标准OpenCl头中义定的那些接口的话,应用NVIDIA的SDK编的程序可以跑在A家的显卡上的。但是不同的SDK会有针对他们片芯的特定扩展,这点类似于标砖OpenGL库和GL库扩展的系关。
OpenGL的现出使得AMD在GPGPU域领于终上赶头迎的NVIDIA,但是NVIDIA虽为OpenCL的一员,但是他们乎似更加重看自己的独门器武CUDA,所以N家对OpenCL实现的扩展也要比AMD少,AMD由于同时做CPU和GPU,还有他们的APU,乎似对OpenCL更来劲一些。
2.关于在GPU上写代码的那些事儿
OpenCL也是通过在GPU上写代码来减速,只不过他把CPU、GPU、其他什么片芯给一统封装了起来,更高了一层,对开辟者也更友爱。说到这里忽然很想赘述一些在GPU上写代码的那些历史。。
其实最开始显卡是不存在的,最早的形图处置是放在CPU上,后来现发可以再主板上放一个独自的片芯来减速形图绘制,那时还叫像图处置单元,直到NVIDIA把这西东做强做大,并且第一给它改了个NB的称谓,叫做GPU,也叫像图处置器,后来GPU就以比CPU高几倍的速度增加性能。
开始的时候GPU不能程编,也叫定固线管的,就是把数据按照定固的路通走完
和CPU样同作为盘算处置器,牵强附会就出来了可程编的GPU,但是那时候想在GPU上程编可不是轻易的事,你只能应用GPU编汇来写GPU程序,GPU编汇?听起来就是很高等的儿意玩,所以那时应用GPU绘制很多特殊效果的能技只握掌在多数形图工程师身上,这类式方叫可程编线管。
很快这类桎桍被攻破,GPU上的高等程编语言生诞,在事先更先进的一些显卡上(记忆中应该是3代显卡开始吧),像C一样的高等语言可以使程序员更加轻易的往GPU写代码,这些语言代表有nvidia和微软起一创作的CG,微软的HLSL,openGl的GLSL等等,在现它们也常通被称为高等着色语言(Shading Language),这些shader前目经已被泛广应用于我们的各种游戏中。
在应用shading language的过程当中,一些科研人员现发很多非形图盘算的题问(如数学、物理域领的并行盘算)可以伪装成形图题问利用Shading Language实在现GPU上盘算,而这结果是在CPU上跑速度的N倍,人们又有了新的法想,想着利用GPU这类性能去处理全部大批并行盘算的题问(不只形图域领),这也叫做通处用置的GPU(GPGPU),很多人试尝这样做了,一段时间很多论文在写怎样怎样利用GPU算了哪个东东。。。但是这类任务都是伪装成形图处置的情势做的,还没有一种然天的语言来让我们在GPU上做通用盘算。这时又是NVIDIA带来了改革,09年前后推出的GUDA构架,可以让开辟者在他们的显卡上用高等语言编写通用盘算程序,一时CUDA热了起来,直到在现N卡都印着大大的CUDA logo,不过它的范围就是硬件的制约。
OpenCL则突破了硬件的壁垒,试图在全部支撑的硬件上搭建起通用盘算的协同平台,不管你是cpu还是gpu通通等量齐观,都能行进盘算,可以说OpenCL的意思在于模糊了主板上那两种要重处置器的界限,并使在GPU上跑代码变得更轻易。
岭上娇艳的鲜花,怎敌她美丽的容颜?山间清澈的小溪,怎比她纯洁的心灵?
3 OpenCL构架
3.1 硬件层:
面上说的都是关于通用盘算以及OpenCL是什么,面下就提纲挈领的把OpenCL的构架总结一下:
以下是OpenCL硬件层的抽象
它是一个Host(控制处置单元,常通由一个CPU担负)和一堆Computer Device(盘算处置单元,常通由一些GPU、CPU其他支撑的片芯担负),其中Compute Device切分红很多Processing Element(这是立独介入单数据盘算的最小单元,这个不同硬件实现都不一样,如GPU可能就是其中一个Processor,而CPU多是一个Core,我猜的。。因为这个实现对开辟者是藏隐的),其中很多个Processing Element可以构成组为一个Computer Unit,一个Unit内的element之间可以便利的同享memory,也只有一个Unit内的element可以实现同步等作操。
3.2 内存构架
其中Host有自己的内存,而在compute Device上则较比复杂,首先有个常量内存,是全部人能用的,常通也是问访最快的但是最少稀的,然后每一个element有自己的memory,这是private的,一个组内的element有他们共用的一个local memery。仔细分析,这是一个高效优雅的内存组织式方。数据可以沿着Host-》gloabal-》local-》private的道通动流(这其中可能逾越了很多个硬件)。
3.3件软层面的构成
这些在SDK中都有对应的数据型类
setup关相:
Device:对应一个硬件(标准中别特明说多core的CPU是一个个整Device)
Context:环境上下文,一个Context包括几个device(单个Cpu或GPU),一个Context就是这些device的一个系联纽带,只有在一个Context上的那些Device才能彼此流交任务,你的呆板上可以同时存在很多Context。你可以用一个CPu建创context,也可以用一个CPU和一个GPU建创一个。
Command queue:这是个给每一个Device提交的指令序列
内存关相:
Buffers:这个好懂得,一块内存
Images:毕竟并行盘算大多数的应用远景在形图像图上,所以原生带有几个型类,表现各种维度的像图。
gpu代码行执关相:
Program:这是全部代码的合集,可能包括Kernel是和其他库,OpenCl是一个态动编译的语言,代码编译后生成一个间中文件(可实现为虚拟机代码或者编汇代码,看不同实现),在应用时连接进入程序读入处置器。
Kernel:这是在element跑的核函数及其参数组和,如果把盘算设备看作好多人同时为你做一个情事,那么Kernel就是他们每一个人做的那个情事,这个情事每一个人都是样同的做,但是参数多是不同的,这就是所谓的单指令多数据系体。
WorkI tem:这就是代表硬件上的一个Processing Element,最基本的盘算单元。
同步关相:
Events:在这样一个分布式盘算的环境中,不同单元之间的同步是一个大题问,event是用来同步的
他们的系关如下图
面上就是OpenCL的入门绍介,其实说实话在10年右左就跟踪过GPGPU关相的西东,那时很多关相术技还存在于实验室,后来的CUDA现出后,也激昂过,学习过一阵,不过CUDA适度依赖于特定硬件,业产应用远景不并好,只能做做工程实验,你总不能让用户装个游戏的同时,让他便顺换个高配的N卡吧。所以一度也对这个域领不太感兴趣,近来看到OpenCL的现出,现发可能这个构架还是有很好的应用远景的,也是多众厂商前目协力力推的一个西东。想想一下一个代迭10000次的for循环一遍过,还是很激昂的一件事。
在游戏域领,OpenCL经已有了很多功成的实际,乎似EA的F1就经已应用了OpenCL,还有一些做洋海的lib应用OpenCL(海面水波的FFT运算在从前是非常慢的),另外还有的库索性利用OpenCL去直接修改现有的C代码,减速for循环等,甚至还有OpenCl本版的C++ STL,叫thrust,所以我得觉OpenCL可能会真正的给我们带来些什么~
以下是一些关于OpenCL较比要重的资源:
http://www.khronos.org/opencl/ 组织的主页
https://developer.nvidia.com/opencl N家的主页
http://developer.amd.com/resources/heterogeneous-computing/opencl-zone/ A家的主页
http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/ 标准的reference
http://developer.amd.com/wordpress/media/2012/10/opencl-1.2.pdf 必看 最新的1.2本版标准
http://www.khronos.org/assets/uploads/developers/library/overview/opencl-overview.pdf 必看,入门的review
http://www.kimicat.com/opencl-1/opencl-jiao-xue-yi 一个学教网站
文章结束给大家分享下程序员的一些笑话语录: 刹车失灵
有一个物理学家,工程师和一个程序员驾驶着一辆汽车行驶在阿尔卑斯山脉 上,在下山的时候,忽然,汽车的刹车失灵了,汽车无法控制地向下冲去, 眼看前面就是一个悬崖峭壁,但是很幸运的是在这个悬崖的前面有一些小树 让他们的汽车停了下来, 而没有掉下山去。 三个惊魂未定地从车里爬了出来。
物理学家说, “我觉得我们应该建立一个模型来模拟在下山过程中刹车片在高 温情况下失灵的情形”。
工程师说, “我在车的后备厢来有个扳手, 要不我们把车拆开看看到底是什么 原因”。
程序员说,“为什么我们不找个相同的车再来一次以重现这个问题呢?”
http://www.cnblogs.com/xinyuyuanm/archive/2013/05/03/3057400.html