从零開始学习OpenCL开发(一)架构
多谢大家关注 转载本文请注明: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
从零開始学习OpenCL开发(一)架构的更多相关文章
- 開始学习swift开发
近期要開始学习swift开发了,接下来的日子,会记录学习swift的历程.
- 从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
iOSFoundation框架 当你着手为你的应用编写代码的时候,你会发现有很多可供使用的Objective-C的框架类,当中尤其重要的就是基础框架类.它为平台全部的应用提供基础服务.基础框架类中包括 ...
- 从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化
经过前面四个版本号的迭代.我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下: V1.0--简单页面滑动切换 V2.0--多页切换.透明过渡及交互指示 V3.0--增加lo ...
- 从零開始开发Android版2048 (四) 分数、重置、结束
这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存 首先,2048这个游戏的分数包含 ...
- 【React Native开发】React Native配置执行官方样例-刚開始学习的人的福音(8)
),React Native技术交流4群(458982758),请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...
- 从零開始学Swift之Hello World进化版
上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, s ...
- 关东升的《从零開始学Swift》即将出版
大家好: 苹果2015WWDC大会公布了Swift2.0,它较之前的版本号Swift1.x有非常大的变化.所以我即将出版<从零開始学Swift><从零開始学Swift>将在&l ...
- Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob
Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob 在正式的项目开发中,单client不能满足我们的需求,须要实现client与服务端的连接. 而在编写Android服务端代码 ...
- 《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹
<PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版 ...
随机推荐
- 如何将excel文件中的数百万条数据在1分钟内导入数据库?
在MYSQL里面,使用load data infile 命令就可以了. 步骤很简单 1.先将excel另存为csv格式的文本,csv是以逗号分隔各个字段数据的 2.在mysql中输入sql语句 loa ...
- java中完美打包
前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...
- mysql 父子结构排序
项目中常常会遇到父子结构显示的问题,不同的数据库有不同的写的方式,比方SqlServer中用with union 实现.而Mysql则没有这么方便的语句. 例如以下category表.食品有pizaa ...
- Swift - 列表项尾部附件点击响应(感叹号,箭头等)
列表单元格尾部可以添加各种样式的附件,如感叹号,三角箭头等.而且点击内容区域与点击附件的这两个响应事件是不同的,这样可以方便我们实现不同的功能(比如点击内容则查看详情,点击感叹号则编辑) 1 2 3 ...
- 【OpenMesh】Some basic operations: Flipping and collapsing edges
这一节中你将学到一些OpenMesh中早已提供的基础操作. 内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠. 三角形网格的翻转(Flipping edges) 考虑到两个邻接面的三角形网格中 ...
- PySide——Python图形化界面
PySide——Python图形化界面 PySide——Python图形化界面入门教程(四) PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your ...
- 如何获取本地html文件的标题
本文用于提取本地网页的标签元素如<TITLE></TITLE>,<IMG>,<A></A>...的内容,非常实用于批量文件的操作,这是按一般 ...
- 【ASP.NET Web API教程】5.1 HTTP消息处理器
原文:[ASP.NET Web API教程]5.1 HTTP消息处理器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.1 HTTP ...
- 如何配置Git支持大小写敏感和修改文件名中大小写字母呢?(转)
1. 在新建代码文件时,不注意把文件名应该小小写搞错了2. 文件已经push到远程了3. 在windows下面将文件名字改为全小写 改好后,在Git中没有任何反应,使用git status时,如果遇到 ...
- UVA 10313(完全背包变形)
Problem B Pay the Price Input: standard input Output: standard output Time Limit: 2 seconds Memory L ...