多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012

本文将作为我《从零開始做OpenCL开发》系列文章的第一篇。

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上编程可不是easy的事,你仅仅能使用GPU汇编来写GPU程序,GPU汇编?听起来就是非常高级的玩意儿,所以那时使用GPU绘制非常多特殊效果的技能仅仅掌握在少数图形project师身上,这样的方式叫可编程管线。

非常快这样的桎桍被打破,GPU上的高级编程语言诞生,在当时更先进的一些显卡上(记忆中应该是3代显卡開始吧),像C一样的高级语言能够使程序猿更加easy的往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上跑代码变得更easy。

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过度依赖于特定硬件,产业应用前景并不好,仅仅能做做project试验,你总不能让用户装个游戏的同一时候,让他顺便换个高配的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  一个教学站点

从零開始学习OpenCL开发(一)架构的更多相关文章

  1. 開始学习swift开发

    近期要開始学习swift开发了,接下来的日子,会记录学习swift的历程.

  2. 从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用

    iOSFoundation框架 当你着手为你的应用编写代码的时候,你会发现有很多可供使用的Objective-C的框架类,当中尤其重要的就是基础框架类.它为平台全部的应用提供基础服务.基础框架类中包括 ...

  3. 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化

    经过前面四个版本号的迭代.我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下: V1.0--简单页面滑动切换 V2.0--多页切换.透明过渡及交互指示 V3.0--增加lo ...

  4. 从零開始开发Android版2048 (四) 分数、重置、结束

    这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存          首先,2048这个游戏的分数包含 ...

  5. 【React Native开发】React Native配置执行官方样例-刚開始学习的人的福音(8)

    ),React Native技术交流4群(458982758),请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...

  6. 从零開始学Swift之Hello World进化版

    上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, s ...

  7. 关东升的《从零開始学Swift》即将出版

    大家好: 苹果2015WWDC大会公布了Swift2.0,它较之前的版本号Swift1.x有非常大的变化.所以我即将出版<从零開始学Swift><从零開始学Swift>将在&l ...

  8. Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob

    Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob 在正式的项目开发中,单client不能满足我们的需求,须要实现client与服务端的连接. 而在编写Android服务端代码 ...

  9. 《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹

    <PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版 ...

随机推荐

  1. hdu 4687 Boke and Tsukkomi

    Dancing link twice. Find the maximum combination numbers in the first time. Enumerate each node, dan ...

  2. .net三步配置错误页面,让你的站点远离不和谐的页面

    假设你的站点出现一堆让人看不懂的报错,那么你就不是一个合格的程序猿.也不是一个合格的站长. 以下的方面能够帮助你的站点远离让人头大的页面. 第一步:配置web.config 打开web.config, ...

  3. [计算机基础]URI与URL

    URI : uniform resource identifier统一资源标示符用于指定Web资源的字符串,它定义了Web资源中的各个不同的部分.ex:http://example.org/absol ...

  4. iframe动态创建及释放内存

    近期參与一个项目的开发,因为项目是基于浏览器的胖client(RIA)应用程序,页面中大量调用iframe.后期測试发现浏览器内存一直居高不下,并且打开iframe页面越多内存占用越大.在IE系列浏览 ...

  5. hadoop集群空间使用情况报告脚本

    近期集群空间有点紧张,总是操心空间不足而崩溃,近期扩容又不太现实,经与集群用户沟通发现:集群上存储了非常多没用的历史数据,能够删除,这样就能够通过一个crontab脚本每天生成集群空间使用报告,当使用 ...

  6. sha256

    SHA-512 (这些有时候也被称做 SHA-2). 简介 SHA 家族 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技 ...

  7. Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计)

    Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计) 本篇博客介绍Cocos2d-x的第一个实例--重力加速计測试.效果图(注:这里无法模拟重力感应): --[ ...

  8. hdu2066一个人的旅行(dijkstra)

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

  9. UVA796- Critical Links(无向图中的桥梁)

    题目链接 题意: 给出一个无向图,按顺序输出桥 思路:求出全部的桥,然后按顺序输出就可以 代码: #include <iostream> #include <cstdio> # ...

  10. 提领NULL指针

    通常之中导致程序崩溃的最重要的原因是试图取消引用NULL指针.正如在以前的文章中指出,智能指针RefCountPtr和ScopedPtr它提供了一个诊断的执行时间. 但,并不是所有的指针是所有的对象都 ...