五千年(敝帚自珍)

主题:【原创】GPU作超级计算,有那么美好吗? -- Highway

共:💬48 🌺77
全看分页树展 · 主题
家园 【原创】GPU作超级计算,有那么美好吗?

先说两句题外话。昨天晚上火箭大战尼克斯。我说好了的,如果火箭赢了,就写一篇。结果姚明及火箭一干人马还真争气,把尼克斯打得满地找牙。吾友姚明很是出彩。砍下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内存不够的时候,操作系统可以帮着安排到主内存上。不过这样大量数据来或“倒腾”,性能必然会下降。

关键词(Tags): #GPU#PeakStream#CPU元宝推荐:四月一日,晨枫,

本帖一共被 2 帖 引用 (帖内工具实现)
全看分页树展 · 主题


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河