五千年(敝帚自珍)

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

共:💬48 🌺77
分页树展主题 · 全看首页 上页
/ 4
下页 末页
  • 家园 【原创】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 帖 引用 (帖内工具实现)
    • 家园 转眼四年过去啦,现在GPU计算热啊

      天河啥的就不提了,cuda编程我也不会,但说我上次碰到一个给IDL做GPU运算库的公司,只要把库装上就能让GPU加速IDL,这对我等不准备深钻cuda的人是一大福音啊。

    • 家园 我的体会

      分子动力学(应算是Physics)运算一例:

      64 个 CPU ib 网络, 4.6 小时。

      2 个GPU (加 24个CPU), 3.7 小时。

      • 家园 MD是cpu intensive的程序

        你拿sequence alignment试试?

      • 家园 为什么只有两个GPU

        我很奇怪2个GPU,24个CPU是怎么配置的,24个CPU Core?

        • 家园 每个节点1个GPU配12个CPU

          每个节点1个GPU配12个CPU。GPU,CPU同时运算,综合其优点。

          • 家园 如何优化代码呢?

            是不是只是针对某些运算,调用GPU的接口(你们用的OpenCL还是什么?)你们用的什么样的系统,我现在做的cluster用的普通的刀片服务器,你们用的是特殊的系统吗?

            • 家园 CUDA GPU Acceleration

              我只用,不管代码或硬件,快就是好!

              是只是针对某些运算,调用GPU的接口。

              程序是:NAMD optimized for CUDA (NVIDIA's graphics processor programming platform) code.

              To benefit from GPU acceleration you will need a CUDA build of NAMD and a recent high-end NVIDIA video card. CUDA builds will not function without a CUDA-capable GPU. You will also need to be running the NVIDIA Linux driver version 195.17 or newer (NAMD 2.7b2 released binaries are built with CUDA 2.3, but can be built with 2.2 or 3.0 as well).

              • 家园 呵呵

                其实类似GPU运算的想法早就有了,一个问题是用硬件还是软件解决,也没有一定的界限。硬件快,贵,实现困难,软件慢,便宜,实现容易。

                GPU运算之所以现在火起来,是因为GPU把硬件贵这个缺点改了,搞HPC的全是吝啬鬼,要他们多掏一点钱要考虑来考虑去。现在用GPU,硬件开发费用绝大部分都由公众(gamers)承担了。

                当然,一分钱一分货。GPU虽然比CPU快,但还是不如专用的加速器。

                • 呵呵
                  家园 准确的说是全球游戏玩家在补贴HPC

                  玩家分摊了大部分的GPU研发费用,所以拿GPU做HPC很便宜。

    • 家园 GPU的并行和多CPU的并行好像不是一回事

      似乎GPU的指令是SIMD模式,象MMX类的指令。

      • 家园 是的

        GPU就是一个向量处理器(上体系结构课的时候记得老师就是这么说的,当时那节课讲向量处理器,记得老师说向量计算并没有消失,现在的GPU就是一种),NUDT之所以能用GPU做出天河,一个很大的原因就是他们就是靠向量计算机起家的(银河1,银河2),对向量计算轻车熟路。

    • 家园 GPU做专门计算

      看了看Nvidia给的那个Performance的图,琢磨着什么样的专门计算能用的上GPU,为什么Finance和Biology上的Gain出奇得高呢?他们做什么运算呢?大概顺着想下去,真能发现个有意思的应用和市场。

      花上先

      • 家园 GPU可以用来计算option的估价

        option对运算能力的要求特别高,不上GPU不行

        • 家园 可以啊,GPU算Option

          可能是最好的一种情况了。因为option的strike,forward,volatility等等都不是很大,用GPU的float足够了。等有空了我们在多聊聊。

分页树展主题 · 全看首页 上页
/ 4
下页 末页


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

Copyright © cchere 西西河