a****a 发帖数: 5763 | 1 http://bbs.weiphone.com/read-htm-tid-556999.html
上篇讲到OpenCL的好处, 但是如果要让Mac用户的日常应用切实的体验到这些优势和影
响, 就需要程序员把OpenCL技术加入到他们的程序中去. 而历来, GPGPU的编程语音一
直没有在传统的桌面程序中得到广泛的应用. 这当中有几个原因.
最初, 针对GPU的编程需要用汇编语言, 而汇编语言跟传统用于桌面程序开发的语言的
差别很大. 在桌面程序的开发上, 广泛应用GUI, API等工具. 即使后来出现的类似C语
音的一些编程语言, 保留了一些针对图形的特性. 但大部分的开发者对于这部分东西仍
然感到很头痛, 像一门他们不太懂的外语一样避而远之.
其次, 即使使用GPU能在很大程度上提高速度, 但依赖于GPU来进行通用计算还是一个问
题, 就是会让程序本身的兼容性变得比较狭窄. 很多老款的GPU, 特别是笔记本上的,
无法运行像CUDA这样的语言.
而苹果在设计OpenCL的时候,有一个很关键的决定就是要让OpenCL不仅能运行在GPU上,
而且还要运行在CPU上. 一个OpenCL程序可以自己探测硬件, 把所有支持OpenCL的硬件
CPU, GPU都罗列出来, 如目前支持OpenCL的有两个GPU,两个CPU, 然后程序可以自己给
这些支持OpenCL的硬件发派任务.
让OpenCL的程序能同时运行在CPU或者GPU上的好处是显而易见的. 所有安装了雪豹系统
的Mac, 不仅仅是最近的新款, 都能运行含有OpenCL代码的程序.
事实上, 某些算法运行在多核的CPU上要比运行在GPU上要快很多, 即使是最快的GPU也
是如此. 2009年的WWDC上, Electronic Art的一个工程师展示了一个游戏中一部分
OpenCL程序, 该程序运行在一个四核的Mac Pro上的速度要比运行在NVIDIA GeForce
GTX285要快四倍. 但很多时候, 用户要求的只是系统能正常稳定的运行, 在这种情况下
, 我们的目标仍然是好好的利用好CPU的资源.
此外, 用以前的方法来给Intel的CPU写代码依然是个很头痛的事情, 因为像一系列的指
令集, 如MMX, SSE2, SSE3还有SSE4需要去处理, 他们都有略微的区别. 很多程序员写
出来的代码就像这样:
OpenCL天生支持这样的代码:
OpenCL支持未声明的并行运算, 这可以很简单的就发挥出多核CPU的优势. 好比以前,
你需要先把你的数据作拆分, 然后把它们分发给并行的硬件, 但现在OpenCL中的代码只
要你把这块数据一起给硬件, 请求并行, 剩下的就不用管了.
这种方式在传统的图形编程中被认为是理所当然的. 在图形编程中, 一些图形的纹理或
者多边形的形成, 其实是每个像素都在执行代码. 程序员要做的只是用一种内部循环的
方式编写代码. 一个支持类似并行运算, 并且能同时运行在CPU和GPU上的API, 就可以
使得这两者看起来似乎没什么区别.
利用OpenCL技术写的代码是与时俱进的. 就像OpenGL的代码会变得越来越快, 因为新的
, 更为强劲的GPU被不断开发出来. OpenCL也一样, 只要CPU和GPU变的越来越快, 用
OpenCL写的代码也变得越来越快. OpenCL中有一个抽象的特别层让这一切变得可能. 就
好比, 几年前使用MMX技术写的代码现在变得更快, 因为CPU的速度变快了.
随着越来越强大的指令集和支持并行运算的硬件的到来, 苹果也在不断的完善OpenCL,
以便充分的利用这些硬件的性能. 就像GPU制造商和操作系统的设计者在不断的更新
OpenGL的驱动, 以便充分利用越来越强大的GPU. 然而, 程序的开发者写代码的方式却
不需要什么改变.甚至很多程序都不需要重新编译.
到这里, 你可能会有疑问, 那如果一个编译过的代码可以运行在SSE2指令集的CPU上,
那它运行在SSE3的CPU呢? 如果在NVIDIA的显卡上可以, 那在ATI的显卡上又如何呢? 要
做到这一点, 就必须把独立于具体硬件的OpenCL代码转变成适合目标硬件的指令. 运行
在GPU上的时候, 则要实时把代码编译为GPU能读懂的指令;而运行在CPU上的时候, 则要
根据具体的代码为并行运算创建和分送线程.
你知道吗? 苹果已经有两项技术来解决这个现实中面临的问题.
这就是LLVM, 苹果在Leopard中使用了这项技术. 而现在的OpenCL其实从LLVM发展而来
的. LLVM为每个指令集写一个代码生成器并将其全部集中在一个代码优化器中, 这样做
有一个好处, 它是独立于硬件的. 这可以免去了许多的重复工作, 只要使用一个编译器
来生成一个静态的可执行文件然后需要的时候实时编译就可以了.
还有一个就是Core Image. 这是另外一个API, 它可以实时的编译代码然后让其在像
GPUs或者多核的CPU这类并行的硬件上. 在雪豹上, 苹果重写了Core Image, 使用了
OpenCL技术, 使得性能上有约25%的提升. |
|