服务器 频道

GPU不是一切!不适合使用GPU的十大场景

  【IT168 专稿】不管从哪个方面看,最近几年高性能计算领域GPU计算的出现已经取得了异乎寻常和空前的发展。GPU计算具有颠覆性技术的所有标记。它以追随者中一小部分骨干决意勇敢地将像Cg 和OpenGL's GLSL这类图形语言的复杂性引入通用计算开始。它被高性能计算的新军所拥护,在多数情况下相对传统的解决方案提供了比人们承认的更多数量级的性能提升,这是明显的不同之处。

  我们即将迎来NVIDIA CUDA发布四周年纪念日,开始争论GPGPU运动的新起点。有很多人已经了解,试用并采用该技术。但是由于各种原因更多人仍旧充当旁观者。在我们的工作中,已经遇到了很多旁观者,因此编辑了一份最常见的问题,关注以及断言的清单,抢先评估该技术。

  下文尝试罗列并解读这些反对意见,鉴于最近的发展重新考虑它们,而且我们猜测未来将如何发展。有一点要讲明,GPGPU不是所有高性能计算应用程序的解决方案,但是很多人已经发现该技术在地震成像、电磁学、分子动力学、财务评估、医疗成像以及其他领域性价比很高。

  1.我不想重写我的代码或学习新的语言

  确实为使用GPU你将不得不重写代码。然而如果你正基于大多数串行代码开发并行CPU实现,那么重写代码是不可避免的。唯一的问题是你的目标平台是什么。把多核CPU作为目标提供了在进程,线程以及处理器级别具有并行性的三层模型。在三个不同的级别你将分别使用MPI,OpenMP/pthreads以及SSE/AVX扩展。使用CUDA进行GPU编程不再困难,而且正如我们将要看到的那样,计算密集型和内存密集型代码的优势可能是重要的。

  如果你已经使用并行代码,你将从GPU端口获得什么好处?信封背面(Back-of-the-envelope)计算在芯片到芯片比较典型代码,获得了5倍到40倍的性能提升。这一度量标准我们也已经在许多有关应用程序开启GPU的论文中看到了。这些比较在最近几年保持相对不变,跨越了Intel和NVIDIA的两代产品。

  CUDA是C语言的一个扩展,可以相当容易的被有经验的编码者学会。距离将我们带到亿亿次的并行编程模型实现还很远,然而我相信最终的解决方案看起来将更像数据并行CUDA模型而不是任务并行CPU备选方案。在之前的HPCwire投稿中,我已经阐述了以下观点:通过强制开发者在他们的问题中考虑并行工作的束缚级别并映射到线程中,CUDA是一个更好的可扩展的并行编程模型,可以在单个节点的多个GPU或多个节点之间提供更加自然地扩展。

  这个方向的探索已经在进行中,例证从学术界在加速器通用内存(GMAC)方面出色的工作(GMAC由Universitat Politecnica de Catalunya和IMPACT研究小组在伊利伊诺大学联合开发)到商业界唯一具有可扩展能力的HUESPACE计算API(由基于奥斯陆初创公司HUE和它的姐妹公司,专注于石油和天然气的Headwave.提供)。

  2.我不知道期待哪种性能

  高性能计算代码或者是计算密集型或者是内存密集型。对于计算密集型代码我们比较NVIDIA Fermi M2090和Intel Westmere。Fermi有512个核心,主频大约为1.3GHz,而Westmere有6个核心,主频可以达到3.4GHz。总的核心频率大概相差32倍。如果你的CPU代码使用SSE指令是有效的,在CPU端可能提供额外的4倍的性能提升,减少GPU效能达8倍(接近GFLOPS峰值比率)。

  对于内存密集型代码,我们比较每个处理器在CPU板上提供的从177 GB/s到32 GB/s的 GPU主存带宽,速率大概是5.5倍。底线是如果你的代码是计算密集型,对于高度优化的SSE实现代码,期望GPU提升性能在5倍到20倍之间,对于典型的代码甚至更多。如果你的代码是内存密集型在芯片到芯片比较中将提升5倍性能。

  考虑并行解决方案时,按照边际成本思考问题是有帮助的。如果你的代码是内存密集型,那么你应该考虑最便宜的增加带宽选项。可以增加另一个GPU卡然后花大概15美元购买1GB/s的带宽。另一种选择是可以增加一个单独的节点,名目成本大概是1GB/s 80美元。后一个解决方案同时增加了计算覆盖范围和另一个O/S实例。

  对于计算密集型代码可以进行相似的计算得出GFLOPS的边际成本。对于混合了计算密集型和内存密集型的大多数代码,GPU通过欺骗成千上万的线程并持续计算这些线程(这些线程的数据寄存器填满了数据),很好的隐藏内存密集型部分的延迟。通过隐藏内存延迟,GPU能够更好的达到更高的计算密集型性能限制。

  3. PCIe带宽将扼杀我的性能

  基于PCIe带宽反对GPU计算的论证实际上是一个计算强度。计算强度有各种定义,但是为便于比较,让我们说它是数据传输的每个浮动执行的浮点运算的数目。为了使GPU计算能力是值得的,临界值必须应用到传输数据到GPU板的每个字节。

  举例来说,PCIe v2.0 16倍带宽实际上总计大概为6 GB/s,大约1s内它能填满M2090板上的6GB主存。双精度浮点运算峰值性能为6650亿次/s的M2090是一个浮点运算巨人,能够清晰地在秒级别进行大量处理并填满主板内存。举例来说,如果你想要PCIe传输时间不多于计算时间的10%,M2090必须在存储的数据冲掉前进行成千上万的浮点操作。因此GPU算法必须努力尽可能保留主板上的数据。

  另外,CUDA允许异步进行PCIe数据传输和计算。聪明的使用这一特性允许开发者隐藏后面计算的一些或者全部PCIe数据的传输时间。工作得很好的算法包括本地物理时间同步算法,比如时域有限差分(FDTD)或经典的分子动力学,其中N2粒子间的相互作用导致有效的数据重用和高计算强度。

  GPU隔离无效的算法,比如简单矢量点积的计算强度非常低。如果问题映射到多个GPU,它们应该最小化数据传输,比如在域分解中只传输边界数据。

  4.安达尔定律怎么样?

  安达尔定律在数量上表述一个事实,如果你打算加速一个大型串行代码的一部分,无论以何种方式,并行化或者魔法侏儒(magic gnomes),你最好加速一个重要的部分或者你将不会获得更多的好处。安达尔定律总是被当作一个护身符固守,反对任何代码性能能够通过并行化改进的建议。

  举例来说,想象你可能将一部分串行代码的运行时间减少到0。如果这部分代码占据运行时间的50%,那么总的加速比将是2倍。如果这部分代码占据了运行时间的90%,你的加速比将达到10倍。当然对于更加现实的加速,加速比要稍低。

  安达尔定律反对图形处理器计算最有效的是监视,现代架构的性能要求所有的代码被重写为高度并行性,将串行部分减少到最小…没有其他选择。在CPU平台和GPU平台这是真的。

  我们正在进行的唯一的高性能计算计算平台是巨大的并行而且安达尔定律同样应用于CPU实现。实际的问题是你将在哪儿运行代码的并行部分,在CPU还是GPU上?

0
相关文章