聊聊GPU通用计算
夏昆冈 于 2012.12.19 23:16:54 | 源自:www.soomal.com | 版权:原创 | 平均/总评分:09.55/277

大家可能会很奇怪,为什么Soomal上会出现一篇GPU加速相关的文章,难道Soomal要涉足显卡内容了?并非如此,GPU加速已经成为现代操作系统的一种关键技术,包括我们用到桌面、移动设备的系统,了解这些知识,会有助于您的消费,就算不消费,用来哄哄技术妹也是可以的。

什么是GPU加速?

说起GPU,游戏迷肯定津津乐道,GPU的性能高低,基本决定了3D游戏的体验质量。GPU承接了CPU的图形运算工作,降低了CPU运算负担,从而实现加速。这最典型的GPU加速应用类型。

什么是通用计算?

所谓通用,是相对于专用而言,GPU用于游戏加速,属于专用处理器,在普通软件的运用中,GPU的计算资源是闲置的,而承担运算工作的是CPU,CPU就是典型的通用计算处理器。能不能像游戏那样,CPU+GPU协调工作?让GPU参与到通用计算当中来?

答案是可以的,能计算图形数据当然也可以计算其他数据。

为什么要通用计算?

衡量处理器的浮点运算能力用FLOPS这个单位,它表示每秒运行浮点运算的次数,什么是浮点运算?浮点运算就是小数的加减乘除等[程序员更喜欢称之为实数,根据精度,又分为单精度和双精度类型],那么常见的CPU和GPU的浮点运算能力为多少呢?

    • Intel Xeon 3.6 GHz: <1.8 GFLOPS
      Intel Pentium 4 HT 3.6Ghz: 7 GFLOPS
      Intel Core 2 Duo E4300 14 GFLOPS
      Intel Core 2 Duo E8400 24 GFLOPS
      AMD Phenom 9950: 29.05 GFLOPS
      Intel Core 2 Quad Q8200 37 GFLOPS
      Intel Core 2 QX9770: 39.63 GFLOPS
      AMD Phenom II x4 955: 42.13 GFlopS
      Intel Core i7-965: 69.23 GFLOPS
      Intel Core i7-980 XE : 107.6 GFLOPS
      IBM POWER7: 264.96GFLOPS[2]
      nVIDIA Geforce 8800 Ultra(G80-450 GPU):393.6 GFLOPS
      nVIDIA Geforce GTX 280(G200-300 GPU):720 GFLOPS
      AMD Radeon HD 3870(RV670 GPU):497 GFLOPS
      AMD Radeon HD 4870(RV770 GPU):1008 GFlops
      nVIDIA Geforce GTX 580(GF110-375 GPU):2370 GFLOPS
      AMD Radeon HD 6990(R900 GPU):4980 GFLOPS
      [以上数据引自维基百科]

    我们从网上找来一些资料,可以看到GPU在浮点运算方面大大的超越了CPU。现在在售的顶级intel CPU,性能也不过150G不到,而顶级的GPU接近5T。主流GPU与CPU之间,有着数倍甚至数十倍的性能差距。

    这么强悍的运算性能在普通应用中用不上,本身就是一种很大的资源浪费。

    ATI Stream 和nVIDIA CUDA

  • 在PC领域,最先提出GPU通用运算概念的是ATI,而nVIDIA却干得来劲。两家分别发布了Stream和CUDA技术,它们都是编程框架,程序员可以透过这些技术来实现GPU的通用计算。CUDA的计算更为成熟全面一些,因此也获得了更多开发者的支持,intel为此还眼红了一把,提出GPU运算并没有传说中的那么好之类的话。

    确实,两家的技术都有着明显的局限性,它们只对自家的GPU提供支持,通用计算的方法却不能在一个通用的平台上运行,这本身就是致命的短板。但这类技术的出现,说明了一个趋势,两家最重要的GPU厂商都认同了GPU通用计算的可行性,包括吐槽的intel在后来也在积极推进GPU通用运算。这些观点也在逐渐改变他们的产品路线图,例如AMD推出了APU[整合了CPU和GPU的处理器],各家都在提高GPU双精度浮点的运算能力以适用更多的通用计算需求[以前的GPU单精度浮点运算能力大大超过双精度浮点运算能力,而通用计算中,双精度浮点运用更多]。此时的GPU已经进化成了GPGPU[General-Purpose computation on Graphics Processing Units]。

    OpenCL

  • OpenCL [Open Computing Language,开放计算语言]适时出现了,OpenCL的是由苹果提出的框架,迅速的得到了AMD、IBM、intel、nVIDIA、高通、三星、创新等重量级厂商支持,但微软不在其列。苹果不是OpenCL的管理者,OpenCL项目由独立的非盈利的Khronos组织负责维护。OpenCL最新版本发展到了1.2。

    OpenCL支持所有的GPGPU,不管是AMD还是nVIDIA,还是集成在多种ARM处理器中的PowerVR GPU,均能使用统一的API进行编程,PowerVR的应用范围也非常广泛,iOS设备采用的即是PowerVR核心。它还是一个跨平台方案,支持Windows、MAC OS、iOS以及Android。但OpenCL也有着其弊端,它基于C语言,可以视为是C的一个扩展。在开发上,并没有C++那么方便。

    DirectX中的DirectCompute子集

    在GPU通用运算日趋火热的时候,微软在干什么?微软的态度非常重要,两家最大的GPU厂商,非常依赖微软的Windows环境。微软并没有闲着,它在更新DirectX。DirectX,游戏玩家不会陌生,它也是微软的一个传奇,DirectX发展至今,一路上碾死了诸多大神,例如3dfx、Aureal,也成就了nVIDIA、Creative的辉煌。

    DirectX发展到10时,做了诸多修改,有个不起眼的子集被加入,被称为DirectCompute,这个子集允许利用GPU做通用运算。DX10随Vista一起发布,但Vista系统比较失败,DirectCompute的作用并没有引起用户的主意。

  • Windows 7是一个成功的操作系统,它的体验比Vista流畅,随同Win7一起发布的是DX11,DX11包括了最新版的DirectCompute。Win7有个特点就是支持GPU加速界面,这其实就是利用DirectCompute来实现通用计算。

    而前些时候发布的Windows8,所集成的DX已经升级至11.1,以对DirectCompute再次改进。Windows在各种组件上加大了DirectCompute的应用,提供了比Win7更为流畅快速的体验,IE10酣畅的渲染速度令人印象深刻,这均是DirectCompute在起到巨大作用,根据微软的说法,某些界面的加速可以达到近五倍的提升,这就是GPU加速的好处。

    C++ AMP

    Visual Studio对于程序员的分量不亚于女朋友,在最新的VS2012中,集成了C++ AMP[C++ Accelerated Massive Parallelism],AMP的意思即加速大规模并行计算的意思。C++ AMP是一个利用DirectCompute进行GPU通用计算的C++扩展,也支持操控CPU和GPU的代码统一编译,因此使用上会比OpenCL更容易上手。可以预见的是,使用C++ AMP调用DirectCompute来实现GPU加速的应用程序会越来越多。

    技术还不够友好

    不管是CUDA、OpenCL还是DirectCompute和C++ AMP,它们均无法做到彻底的硬件无关,即便是最方便的C++AMP,也一样需要在CPU GPU之间把数据搬来搬去,程序员需要显式操作,它还无法做到彻底的设备无关性,就像现在编程,完全不要考虑CPU是几核的那样。也因为如此,移植尚且做不到只需重新编译那么简单,技术上还可以更加友好。

    移动设备操作系统中的GPU加速应用现状

    有编程爱好者发现,iOS[5.0起]的私有框架[Private Frameworks]中包含有OpenCL,有理由相信iOS内部有一定数量的组件在使用OpenCL调用GPU做通用运算,最为典型的是Safari,iOS6中的Safari比之前的版本明显更快,New iPad在CPU性能几乎无变化以及渲染面积提高4倍之后,浏览器渲染速度并没有受到影响,其他界面的普通操控也同样流畅[不包括第三方应用],常规技术不可能做到。关于在iOS中公开提供OpenCL的支持,苹果显得羞羞答答,这和Win7时代的微软有点相似,悄悄的进村,打枪的不要。

    Android长期以来受到了“不流畅”的困扰,Android4.0起,加入了黄油计划[Project Butter],这个项目的主要目标就是实现更为流畅和灵敏的操控,其实现原理是预判加缓冲来提升效率,经过我们测试,Android4.2开始能实现近乎iOS一样的平滑操控。但它还不是基于GPU加速实现的,在第一次载入界面时,它依然会有点卡,它也需要占用更多的内存来确保流畅性。4.0起同时加入了GPU加速选项,但目前只是作为“开发者选项”选用,在强制开启GPU运算后,有的程序会无法正常工作。这个GPU加速,应该就是OpenCL调用GPU来进行通用计算。估计到Android5,GPU加速会正式被运用。

    Windows Phone 8采用与Win8一样的系统核心,也集成了DirectX,在GPU加速上不存在技术问题,遗憾的是,我们还没有体验过WP8手机,不方便发表太多看法。从WP7的流畅体验来说,WP8应该会更好。[WP7是何种加速技术不好说,不能确定是GPU加速]

    Windows RT,本质上就是ARM版的Windows8,它的系统架构与Win8完全一样,也集成了DX11.1,从技术上说,它也支持GPU加速。基于WinRT的Surface平板,提供了良好的加速体验,其内置的IE10以及大量的组件,同样基于GPU加速,系统流畅度令人满意。

    梦想照进现实

    从ATI Stream、nVIDIA CUDA到OpenCL、DirectCompute和C++ AMP,从技术探讨到操作系统大范围应用,几年前,GPU作为通用处理器还只是纸上谈兵的事情,但现在,GPU加速已经实实在在的为改善体验而服务了。CPU GPU到底谁重要的话题其实不重要,如何挖掘硬件性能最重要,升级到8核CPU可能还不如用好双核CPU+GPU通用运算,这可能成为区分系统性能和体验的重要手段。这也是我们为什么要写这篇文章的原因,任何能改善体验的技术,我们都想去关注。

    请评分
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    069.197.***.***
    069.197.***.***
    68
    120.083.039.***
    120.083.039.***
    发表于2013.07.21 22:32:37
    67
    060.176.047.***
    060.176.047.***
    发表于2013.04.19 09:15:14
    66
    116.225.153.***
    116.225.153.***
    发表于2013.04.16 20:02:53
    65
    124.077.***.***
    124.077.***.***
    PCIE总线延迟太厉害,而且内存分层太复杂,移植性也差,这东西目前只能玩玩
    发表于2012.12.23 18:49:22
    63
    03
    现在还用XP呢。

    支持下技术文!
    发表于2012.12.22 21:06:28
    62
    060.002.236.***
    060.002.236.***
    发表于2012.12.22 15:51:13
    60
    123.138.***.***
    123.138.***.***
    我记得WPF就是GPU加速,所以WP->Silverlight->WPF的关系来看...
    另外,通用并行计算理论上是个耗电的技术
    发表于2012.12.22 11:49:44
    59
    122.239.018.***
    122.239.018.***
    发表于2012.12.22 09:35:20
    58
    没想到这么多年,inte浮点计算还这么弱
    发表于2012.12.22 08:43:06
    57
    123.120.084.***
    123.120.084.***
    发表于2012.12.21 20:48:28
    55
    03
    科研方面,GPGPU已经应用了不少了。英伟达的CUDA现在是市场领先地位,希望AMD也能把自家技术做好,毕竟GCN架构在通用计算方面的进步也是挺大的。
    发表于2012.12.21 15:02:40
    54
    03
    发表于2012.12.21 01:51:16
    52
    GPU取代CPU只是早晚的事儿而已
    发表于2012.12.20 21:36:54
    51
    03
    本来想HD3850够用了呢
    发表于2012.12.20 20:25:27
    50
    升级到8核CPU可能还不如用好双核CPU+GPU通用运算,说的有理
    发表于2012.12.20 20:22:39
    49
    提示
    本贴不可匿名回复,回复等级为:1 ,您现在正处在潜水状态
    回复
    验证码
    3621 为防止广告机贴垃圾,不得已而为之
    表情
    正文