一 从零开始学习OpenCL开发架构【转】( 二 )


2.关于在GPU上写代码的那些事儿
也是通过在GPU上写代码来加速,只不过他把CPU、GPU、其他什么芯片给统一封装了起来,更高了一层,对开发者也更友好 。说到这里突然很想赘述一些在GPU上写代码的那些历史 。。
其实最开始显卡是不存在的,最早的图形处理是放在CPU上,后来发现可以再主板上放一个单独的芯片来加速图形绘制,那时还叫图像处理单元,直到把这东西做强做大,并且第一给它改了个NB的称呼,叫做GPU,也叫图像处理器,后来GPU就以比CPU高几倍的速度增长性能 。
开始的时候GPU不能编程,也叫固定管线的,就是把数据按照固定的通路走完
【一从零开始学习OpenCL开发架构【转】】和CPU同样作为计算处理器,顺理成章就出来了可编程的GPU,但是那时候想在GPU上编程可不是容易的事,你只能使用GPU汇编来写GPU程序,GPU汇编?听起来就是很高级的玩意儿,所以那时使用GPU绘制很多特殊效果的技能只掌握在少数图形工程师身上,这种方式叫可编程管线 。
很快这种桎桍被打破,GPU上的高级编程语言诞生,在当时更先进的一些显卡上(记忆中应该是3代显卡开始吧),像C一样的高级语言可以使程序员更加容易的往GPU写代码,这些语言代表有和微软一起创作的CG,微软的HLSL,的GLSL等等,现在它们也通常被称为高级着色语言( ),这些目前已经被广泛应用于我们的各种游戏中 。
在使用 的过程中,一些科研人员发现很多非图形计算的问题(如数学、物理领域的并行计算)可以伪装成图形问题利用 实现在GPU上计算,而这结果是在CPU上跑速度的N倍,人们又有了新的想法,想着利用GPU这种性能去解决所有大量并行计算的问题(不只图形领域),这也叫做通用处理的GPU(GPGPU),很多人尝试这样做了,一段时间很多论文在写怎样怎样利用GPU算了哪个东东 。。。但是这种工作都是伪装成图形处理的形式做的,还没有一种天然的语言来让我们在GPU上做通用计算 。这时又是带来了革新,09年前后推出的GUDA架构,可以让开发者在他们的显卡上用高级语言编写通用计算程序,一时CUDA热了起来,直到现在N卡都印着大大的CUDA logo,不过它的局限就是硬件的限制 。
则突破了硬件的壁垒,试图在所有支持的硬件上搭建起通用计算的协同平台,不管你是cpu还是gpu通通一视同仁,都能进行计算,可以说的意义在于模糊了主板上那两种重要处理器的界限,并使在GPU上跑代码变得更容易 。
架构
3.1 硬件层:
上面说的都是关于通用计算以及是什么,下面就提纲挈领的把的架构总结一下:
以下是硬件层的抽象

一  从零开始学习OpenCL开发架构【转】

文章插图
它是一个Host(控制处理单元,通常由一个CPU担任)和一堆 (计算处理单元,通常由一些GPU、CPU其他支持的芯片担任),其中 切分成很多 (这是独立参与单数据计算的最小单元,这个不同硬件实现都不一样,如GPU可能就是其中一个,而CPU可能是一个Core,我猜的 。。因为这个实现对开发者是隐藏的),其中很多个 可以组成组为一个 Unit,一个Unit内的之间可以方便的共享,也只有一个Unit内的可以实现同步等操作 。
3.2 内存架构
一  从零开始学习OpenCL开发架构【转】

文章插图
其中Host有自己的内存,而在 上则比较复杂,首先有个常量内存,是所有人能用的,通常也是访问最快的但是最稀少的,然后每个有自己的,这是的,一个组内的有他们共用的一个local。仔细分析,这是一个高效优雅的内存组织方式 。数据可以沿着Host-》-》local-》的通道流动(这其中可能跨越了很多个硬件) 。