通用计算以及OpenCL究竟是什么?

opencl是当前一个通用的由很多公司和组织共同发起的多cpu\gpu\其他芯片 异构计算(heterogeneous)的标准,它是跨平台的。旨在充分利用gpu或者fpga强大的并行计算能力与cpu进行协同工作,更高效的利用硬件高效的完成大规模的(尤其是并行度高的)计算。
01
异构计算、gpgpu与opencl
利用gpu对图像渲染进行加速的技术非常成熟,但是gpu的芯片结构擅长大规模的并行计算,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架构,当时的影响是很大的,将很多计算工作(科学计算、图像渲染、游戏)的问题提高了几个数量级的效率,cuda是nvdia主力推的通用计算架构,但是cuda最大的局限就是它只能使用nvidia自的显卡,对于广大的amd卡用户鞭长莫及。
opencl则在之后应运而生,它由几大主流芯片商、操作系统、软件开发者、学术机构、中间件提供者等公司联合发起,它最初由apple提出发起标准,随后khronos group成立工作组,协调这些公司共同维护这套通用的计算语言。khronos group听起来比较熟悉吧,图像绘制领域著名的软硬件接口api规范著名的opengl也是这个组织维护的,其实他们还维护了很多多媒体领域的规范,可能也是类似于open***起名的(所以刚听到opencl的时候就在想它与opengl有啥关系),opencl没有一个特定的sdk,khronos group只是指定标准(你可以理解为他们定义头文件),而具体的实现则是由不同参与公司来做,这样你会发现nvdia将opencl做了实现后集成到它的cuda sdk中,而amd则将其实现后放在所谓是amd app (accelerated paral processing)sdk中,而intel也做了实现,所以目前的主流cpu和gpu都支持opencl架构,虽然不同公司做了不同的sdk,但是他们都遵照同样的opencl规范,也就是说原则上如果你用标准opencl头中定义的那些接口的话,使用nvidia的sdk编的程序可以跑在amd的显卡上的。但是不同的sdk会有针对他们芯片的特定扩展,这点类似于标砖opengl库和gl库扩展的关系。
opengl的出现使得amd在gpgpu领域终于迎头赶上的nvidia,但是nvidia虽为opencl的一员,但是他们似乎更加看重自己的独门武器cuda,所以n家对opencl实现的扩展也要比amd少,amd由于同时做cpu和gpu,还有他们的apu,似乎对opencl更来劲一些。
02
opencl的诞生
opencl也是通过在gpu上写代码来加速,只不过他把cpu、gpu、其他什么芯片给统一封装了起来,更高了一层,对开发者也更友好。
其实最开始显卡是不存在的,最早的图形处理是放在cpu上,后来发现可以再主板上放一个单独的芯片来加速图形绘制,那时还叫图像处理单元,直到nvidia把这东西做强做大,并且第一给它改了个nb的称呼,叫做gpu,也叫图像处理器,后来gpu就以比cpu高几倍的速度增长性能。
开始的时候gpu不能编程,也叫固定管线的,就是把数据按照固定的通路走完和cpu同样作为计算处理器,顺理成章就出来了可编程的gpu,但是那时候想在gpu上编程可不是容易的事,你只能使用gpu汇编来写gpu程序,gpu汇编?听起来就是很高级的玩意儿,所以那时使用gpu绘制很多特殊效果的技能只掌握在少数图形工程师身上,这种方式叫可编程管线。
很快这种桎桍被打破,gpu上的高级编程语言诞生,在当时更先进的一些显卡上,像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上跑代码变得更容易。
01
opencl架构
上面说的都是关于通用计算以及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可以实现同步等操作
02
内存架构
其中host有自己的内存,而在compute device上则比较复杂,首先有个常量内存,是所有人能用的,通常也是访问最快的但是最稀少的,然后每个element有自己的memory,这是private的,一个组内的element有他们共用的一个local memery。仔细分析,这是一个高效优雅的内存组织方式。数据可以沿着host-》gloabal-》local-》private的通道流动(这其中可能跨越了很多个硬件)
03
软件层面的组成
这些在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的入门介绍, 在游戏领域,opencl已经有了很多成功的实践,好像ea的f1就已经应用了opencl,还有一些做海洋的lib应用opencl(海面水波的fft运算在过去是非常慢的),另外还有的库干脆利用opencl去直接修改现有的c代码,加速for循环等,甚至还有opencl版本的c++ stl,叫thrust,所以我觉得opencl可能会真正的给我们带来些什么

一文知道信号滤波器的安装位置
线性稳压器的基本概念及主要类型
一种基于深度学习的系统教会机器人仅通过观察人类行为就能完成任务
食品检测仪器产品说明及功能介绍
晶科电子携全新车规级光源新品亮相国际汽车灯具展
通用计算以及OpenCL究竟是什么?
数据科学家需要知道的5个基本统计概念,如何才能最有效地应用它们
Sony Xperia Pro的功能和价格
为什么不看好人形机器人?
IP安全,IP安全是什么意思
空客成功挑战抗雷击性能,仿真结果与现场测试结果高度吻合
第三届全国大学生电子设计竞赛即将举办
立讯精密:华为供应链首推标的
DEKRA德凯致力于为客户提供更完善的动力电池相关检测和认证服务
荣耀V20评测 2018年压轴旗舰
JL-21-A3低功耗雨量记录仪介绍
彩电市场日渐走出低端低价的怪圈 海信双11引爆高端市场
华盛顿大学研究出像蒲公英一样传播的微型传感器
射频电路设计规范、元器件封装的注意事项
2019年全国已经拥有超过4000家的人工智能企业