主题:【原创】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 帖 引用 (帖内工具实现)
不懂,照花!
现在流体模拟经常在cluster上跑。基本上现在有名的商业包都支持多CPU平行计算。
如果GPU并行能力很强,是不是可以看作是一个小型的cluster? 如此一来,其客观的计算能力可以得到充分发挥。
浮点位数的确比较麻烦。不过流体力学计算,单精度在很多情况下也够用了。精度主要靠迭代收敛保证。截断误差如果算法弄得好,不会是大麻烦的。
现在的GPU也玩多核,一个主板上又可以上2-4块Video card。比如说如果你上了两块8800 GTX Video card,每个卡上两个GPU,每个GPU上128个处理器单元(运行@1.35GHz),这样一个PC内就拥有512个处理器单元。这个比买上百台计算机划算多了,是不是?
并且,GPU的内存速度奇快,和计算机主内存间的带宽也很大(Windows Vista支持虚拟GPU内存)所以这种cluster比一堆用网络连接起来的计算机要快几个数量级(就相互间通讯而言)。优势还是很明显的。
所以说,那几个主要问题解决了,GPU作大规模并行计算还是有优势的。
好文,花!现在姚明的确是发挥越来越稳定,越来越成熟,堪称队中中流砥柱。
以前看过一些GPU计算的相关报道,不过总的来讲这样会使问题变得非常复杂。写程序困难,调试困难,性能是不是真的能够提高那么多?也是个疑问。我非常怀疑在真实的计算环境中,速度是否能比CPU快。毕竟是为完全不同的应用设计的。
GPU提高性能的并行处理的方法,应该在常规的CPU上面也能够实现,现在的双核和多核CPU,甚至以前的CPU的很多设计也正是如此。同时使用GPU和CPU大概只能把问题搞复杂。
并不针对具体的视频音频或者其他具体的处理任务。
可以由用户自行决定具体处理的数据内容,这样声卡显卡视频卡就可以统一了。而不需要很强数据处理能力的用户用最基本的机器,有特殊需求的用户可以很容易的扩展自己的处理能力。
现在对计算机不满的就是CPU了 因为太慢
数值模拟的,可以是90%以上时间耗费在几条循环语句上。将这几条循环语句并行化,程序复杂性不会增加太多。
一般都会调用专门的程序库,进行非常复杂的计算。真正的程序,自己写得很有限,主要调用已经积累下来的数以万行,十万行原码的程序。此外,对内存的要求也很高,我们这里一个典型的作业,要求1GB内存,一般一个双CPU节点同时运行两个作业。
是由开发程序的人来做。如果是项目组后来的人接手,首先要看懂前面人的程序。问题是,编这类科学计算程序的人,大多不是出身于软件行业,而是理工科相应专业出身的,所以程序编的一塌糊涂,要看懂非常不容易。
这种程序,耗时间主要在几个循环语句上,而耗的内存主要是几个数组占用的。
但是内存使用,收敛速度都是研究课题。当初还发过论文论述通过改善边界条件加快收敛速度。