主题:【原创】GPU作超级计算,有那么美好吗? -- Highway
先说两句题外话。昨天晚上火箭大战尼克斯。我说好了的,如果火箭赢了,就写一篇。结果姚明及火箭一干人马还真争气,把尼克斯打得满地找牙。吾友姚明很是出彩。砍下35分,17个篮板,还有7个盖帽。不过失误多了些,有8个。休斯敦的两个解说员一黑一白,整场的就是夸姚明,肉麻的很,我都有些听不下去了。看来美国这地境儿,如果你真有两把刷子,不管哪儿来的,别人还是会对你可客客气气的(别小看休斯敦的解说员啊,黑哥是当年名动天下的老剑客德雷克斯勒,和乔丹有的一比)。
好了,言归正传,谈谈GPU作数学计算的问题。
GPU, 顾名思义,就是图形处理芯片(Graphic Processing Unit)。本来嘛,GPU的任务就是处理计算机图像信号。和网络芯片,声音芯片是一回事,是专门化的处理器。要说还得感谢那些永不满足的游戏发烧友,真是他们那些“无理”的要求使得图像芯片厂商绞尽了脑汁,不断地推出一代又一代的芯片。ATI和Nvidia两大厂家的轮番领跑,和CPU界的AMD, Intel两家的殊死格斗交相辉映,成了这几年芯片领域的最亮丽的一道风景。
发展着,发展着,突然间人们一回首,发现今天的GPU已经发展成了Monster。他的某些处理能力已经到了匪夷所思的地步。于是一个想法很自然的就产生了,那就是能不能把这Monster power利用起来,干点“正经事儿”。成天价弄些牛头马面,暴力火妞儿打打杀杀有什么意思?
那所谓Monster power到底是个什么概念呢?
比如说ATI 的Radeon R580芯片吧,浮点数运算能力高达360 gigaflops (每秒3600亿次浮点数计算)。而现在最牛的Intel 3.0GHz Core 2 Duo CPU,浮点数运算能力也只有48 gigaflops。差7,8倍不止。而最新的Nvidia的G80芯片比R580还要牛1-2倍不止,“我的个神呀!”
看起来很不错,是吧,但是真正要把这Monster power利用起来,问题也还是很多的。
首先,GPU是为了专门用途开发的,和CPU不一样。想直接在上面编程非常困难。也就是ATI,Nvidia内部写驱动程序的那帮家伙们知道GPU内部到底是怎们回事情。在GPU平台上开发游戏的人,用的是OpenGL或者是微软的DirectX API。这些东西写游戏行,但做科学计算却还有问题。把这Monster power展示给广大程序员,让他们方便的在上面开发程序不是件很容易的事情,到目前,好像只有PeakStream有相对成型的产品。
给大家简单介绍一下PeakStream的产品。PeakStream提供一个库函数,用户可以通过它的API来调用这些库函数。目前,它只支持C/C++。你的程序可以用C++编译器编译成x86机器代码。当你运行这个程序的时候,PeakStream的虚拟机就会启动,它会将你的x86机器代码现场翻译成GPU专用代码。这个过程很像Java,不同的是Java是将byte code演绎成机器码,而PeakStream的虚拟机是将机器码转换成GPU专用码。
这样做的目的是很明显的,那就是使程序有跨GPU的能力。如果当前环境是一块ATI图形卡,那么PeakStream的虚拟机就会将你的程序转换成ATI能执行的代码;如果当前环境是一块Nvidia图形卡,那么PeakStream的虚拟机就会将你的程序转换成Nvidia能执行的代码。这点和Java跨平台的机理是一样的。不过呢,PeakStream现在只支持Radeon R580一种芯片(也就是ATI Radeon 1900系列的显卡),别的显卡以后才会逐步支持。这里借用一下他们的插图来说明一下基本的工作原理。
看起来一起顺理成章,合情合理。好,让我们再看一个非常简单的例子。这个例子非常简单,是使用一种近似的算法来求圆周率。原理是围绕原点随机的产生一些点(x, y小于等于1),然后看这个点到原点的距离,距离大于1,表明落在圆外,距离小于等于1表明落在圆内。最后统计圆内的点和测试总点数来近似求出圆周率。
普通的C/C++ 程序可能是这样的。
使用了PeakStream以后,程序变成了这样
盯着这两段程序看个几分钟,你很快就会发现一些问题。
第一:两段程序相去甚远。原来的程序是sequential的,而新的程序是基于四个大的数组的。为什么要这样呢。
GPU浮点数能力强,其实更准确的说是吞吐量大,而并不是绝对速度快。以Radeon为例,它有48个Pixel Shader,每个这样的Shader都可以完成浮点数计算。也就是说虽然GPU运行的频率比CPU低(650MHz),但是架不住它的处理单元多。所以总体上来看,它还是有超强的处理能力的。但问题是,注意,真正的问题来了,很多的数学计算是不能并行展开的。对于这种问题,一大群处理单元一点忙也帮不上,还是高速的CPU更为合适。
打个比方来说,GPU好像是一群狼,CPU好像是一或两只虎。有些情况下,一群狼合适,而很多情况下,还是老虎更好使。计算机界有些问题天生就适合并行计算,比如我们这个例子,以及很多的数学模拟,但更多的问题很难把他们分割成一个个独立的小任务。现在计算机CPU的发展热点是多核,如何让计算机程序有效的利用这些多核,是计算机界最具挑战的一个任务,是块硬骨头,不好啃的。以后有空我们再聊聊这个话题。
第二:两段程序使用的都是float,而不是double。这点非常奇怪。因为在数学计算中,绝大部分场合都要求双精度浮点数,比如说Java的Math,全是double。Float只有32位,数值大小和精度都太可怜了,远远不够。
为什么不使用64位的double呢?原因很简单,因为GPU的专长是32位单精度浮点数的计算。双精度玩不转。很多著名的处理器处理单精度浮点数快的惊人,但一换到双精度,速度马上下降90%不止(比如IBM的Cell处理器, 单精度256 gigaflops,挺牛,但双精度马上就下降到25 gigaflops左右。所以说如果看到使用了Cell处理器的Playstation3多牛多牛市场宣传广告的时候,大家心里要有个数)。
GPU长于32位浮点数是很容易理解的。因为对于PC的图形渲染,32位已经足够了。今后几年是不是人们会逐渐要求GPU过渡到64位还不好说。三五年内我看不会。
既然GPU不能处理64位的计算,所以当遇到这样的问题 ,PeakStream还得请CPU出马,完成这样的计算。
据ATI人士宣称,支持64位对GPU不是什么难事,硬件稍作改动,然后放在64位OS上,以半速运行就可以了。不过话是这么说,到底对64位如何支持,速度如何还有待于进一步观察。
哦,对了,说了半天ATI的Radeon,Nvidia对这件事是怎么个看法呢?
据说Nvidia为他们最新的图形芯片G80开发了专门的Driver,希望能让广大程序员方便的使用GPU作普通计算。对于可以并行展开的计算,G80的性能优势还是很明显的。这个图是厂家给出的,看着牛X轰轰的。不过我没有try过,没法作进一步评价。
好了,总结一下。
GPU确实有它的特长,但是直接收获这样的Power却也非那样容易。你要修改你的程序,从算法上保证问题可以并行展开(不容易哦),另外,你还只能使用单精度浮点数,这个可能会是一个大问题,据我所知,不用double的科学计算并不常见。第三,现在支持的GPU很有限,即使支持,也只是一个GPU,这个可扩充性也是个问题。另外,GPU版载的内存只有512MB/1GB,在很多场合这点内存是不够的,这时候,可能要不停的和计算机主内存不停的交换数据,这可能会对性能有不小影响。比如说我们那个例子,如果我们要求做10亿次的模拟,普通算法没有一点问题(就是多花点时间嘛),而开四个10亿围的float数组,那乐子可大了,是不是?还好,Windows Vista支持GPU内存虚拟,GPU内存不够的时候,操作系统可以帮着安排到主内存上。不过这样大量数据来或“倒腾”,性能必然会下降。
本帖一共被 2 帖 引用 (帖内工具实现)
- 相关回复 上下关系8
😉【原创】GPU作超级计算,有那么美好吗?
🙂转眼四年过去啦,现在GPU计算热啊 1 马踏飞燕 字148 2011-01-05 07:23:13
🙂我的体会 1 青颍路 字104 2010-12-28 10:19:36
🙂MD是cpu intensive的程序 喜欢喝冰茶 字28 2010-12-28 13:20:16
🙂为什么只有两个GPU 不是老陈 字50 2010-12-28 11:25:16
🙂每个节点1个GPU配12个CPU 1 青颍路 字55 2010-12-28 11:56:56
🙂如何优化代码呢? 1 不是老陈 字150 2010-12-28 12:10:11
🙂CUDA GPU Acceleration 1 青颍路 字512 2010-12-28 12:27:22