一 学习OpenCL开发架构

本文将作为我《从零开始做开发》系列文章的第一篇 。
1 异构计算、GPGPU与
是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算()的标准,它是跨平台的 。旨在充分利用GPU强大的并行计算能力以及与CPU的协同工作,更高效的利用硬件高效的完成大规模的(尤其是并行度高的)计算 。在过去利用GPU对图像渲染进行加速的技术非常成熟,但是我们知道GPU的芯片结构擅长大规模的并行计算(PC级的GPU可能就是CPU的上万倍),CPU则擅长逻辑控制,因此不只局限与图像渲染,人们希望将这种计算能力扩展到更多领域,所以这也被称为GPGPU(即通用处计算处理的GPU) 。
简单的说,我们的CPU并不适合计算,它是多指令单数据流(MISD)的体系结构,更加擅长的是做逻辑控制,而数据处理基本是单流水线的,所以我们的代码for(i=0;...;i++)这种在CPU上要重复迭代的跑很多遍,但是你的显卡GPU则不是这样,GPU是典型的单指令多数据(SIMD)的体系结构,它不擅长逻辑控制,但是确实天生的向量计算机器,对于for(i=0;...;i++)这样的代码有时只需要跑一遍,所以图形世界中那么多的顶点、片段才能快速的并行在显卡中渲染处理

一  学习OpenCL开发架构

文章插图
GPU的晶体管可以到几十亿个,而CPU通常只有几个亿,
一  学习OpenCL开发架构

文章插图
如上图是 的结构,它有着大量的并行计算单元 。
所以人们就想如何将更多的计算代码搬到GPU上,让他不知做,而CPU只负责逻辑控制,这种一个CPU(控制单元)+几个GPU(有时可能再加几个CPU)(计算单元)的架构就是所谓的异构编程(),在这里面的GPU就是GPGPU 。异构编程的前景和效率是非常振奋人心的,在很多领域,尤其是高并行度的计算中,效率提升的数量级不是几倍,而是百倍千倍 。
其实在很早就退出了利用其显卡的GPGPU计算 CUDA架构,当时的影响是很大的,将很多计算工作(科学计算、图像渲染、游戏)的问题提高了几个数量级的效率,记得那时来浙大介绍CUDA,演示了实时的ray 、大量刚体的互相碰撞等例子,还是激动了一下的,CUDA现在好像已经发展到了5.0,而且是NVDIA主力推的通用计算架构,但是CUDA最大的局限就是它只能使用N家自己的显卡,对于广大的A卡用户鞭长莫及 。则在之后应运而生,它由极大主流芯片商、操作系统、软件开发者、学术机构、中间件提供者等公司联合发起,它最初由Apple提出发起标准,随后 Group成立工作组,协调这些公司共同维护这套通用的计算语言 。Group听起来比较熟悉吧,图像绘制领域著名的软硬件接口API规范著名的也是这个组织维护的,其实他们还维护了很多多媒体领域的规范,可能也是类似于Open***起名的(所以刚听到的时候就在想它与有啥关系),没有一个特定的SDK,Group只是指定标准(你可以理解为他们定义头文件),而具体的则是由不同参与公司来做,这样你会发现NVDIA将做了实现后即成到它的CUDA SDK中,而AMD则将其实现后放在所谓是AMD APP ( Paral )SDK中,而Intel也做了实现,所以目前的主流CPU和GPU都支持架构,虽然不同公司做了不同的SDK,但是他们都遵照同样的规范,也就是说原则上如果你用标准头中定义的那些接口的话,使用的SDK编的程序可以跑在A家的显卡上的 。但是不同的SDK会有针对他们芯片的特定扩展,这点类似于标砖库和GL库扩展的关系 。
的出现使得AMD在GPGPU领域终于迎头赶上的,但是虽为的一员,但是他们似乎更加看重自己的独门武器CUDA,所以N家对实现的扩展也要比AMD少,AMD由于同时做CPU和GPU,还有他们的APU,似乎对更来劲一些 。