如何以非常好的的方式利用MultiGPU机器?
泡泡网显卡频道11月15日 借助单颗GPU,GPU技术实现的速度提升可比传统CPU高出几个数量级。如果在工作站或计算节点上插入两颗或四颗GPU,那么其运算应用或游戏的性能可分别翻一番和翻两番。在一个系统中,主处理器的多核功能与GPU的协同作用可使性能提升更多。
虽然这一点非常诱人,但多GPU和混合型CPU+GPU的性能在很大程度上依赖于供应商计算机主板上的PCIe总线装置。留心供应商会在PCIe总线上偷工减料!配备了合适的PCIe芯片组,multiGPU应用可以根据系统中GPU的数量相应地提高性能。如果系统内的芯片组不恰当,在multiGPU上的投资就不会有成效。为什么要浪费资金?确保PCIe芯片组能令您的GPU实现所有的性能!
英伟达最近发布的CUDA4.0包含了一系列特性,能简化工作站或计算节点内多GPU的使用。爱尔兰高端计算中心(ICHEC)phiGEMM库利用CUDA4.0特性实现了同时使用多GPU和主处理器的矩阵乘法计算。phiGEMM的性能提升非常显著,单个GPU+CPU的性能与LinpackHPL矩阵乘法相等,后者用于评估世界前500强超级计算机。在四个GPU和一个主处理器之间运行单个矩阵乘法时,phiGEMM可实现超过1万亿次浮点/秒(10710亿次浮点/秒)的双精度矩阵乘法计算,其所在矩阵比任何一个GPU的内存都要大!
图片1:phiGEMM的性能效果
图片1展示了对于一个25000x25000矩阵所实现的性能,两个2.93GHzIntelX5670处理器12个核心的运算速度可稳定在1300亿次浮点/秒。在没有Intel核心带来性能提升的情况下,4颗英伟达GPU性能可达9420亿次64位浮点运算/秒。换言之,相比单个CPU,4核GPU的性能提高了3.4倍。phiGEMM库支持免费下载。
性能不良的PCIe总线芯片组造成的影响非常显著。例如,同样的phiGEMM矩阵乘法在共用PCIe总线上会慢17%,因为传送数据用的时间会更长。也就是说,每个GPU由于共用总线而只得到一半数据带宽。矩阵乘法是展现多GPU性能的良好平台,因为随着矩阵规模的增加,运行时间会受限于浮点性能而非数据传送。
很多供应商宣称他们的系统支持多高速x16PCIe插槽,这在某些性能假设下是符合事实的。为节省资金,某些供应商使用只在一个设备激活时才能实现全部性能的PCIe芯片组。
图片2,摘自我的书《CUDAApplicationDesignandDevelopment》,说明了某些PCIe装置会区分对待多个GPU中的某一个。从英伟达VisualProfiler的图形输出上可以看到,粉色和红色区域表示数据传输在第二个设备Device_1:Context_1上用的时间显著增长。
英伟达VisualProfiler输出显示,在用一条劣质PCIe总线连接的多GPU之间运行3-D快速傅里叶变换(FFT)时,性能降低接近60%。性能之所以有如此显著的下降,是因为相比矩阵乘法,快速傅里叶变换每传送一个数据所进行的计算量要少。更少的计算量意味着相比计算吞吐量数据传输速度对应用的制约更明显。
性能不良的PCIe总线对这类应用运行时间的影响更加大。性能下降60%意义重大,因为这能抵消多GPU带来的优势。ThrustC++数据并行应用程序接口在CUDA4.0版中为标准配置。3借助类属编程和仿函数(类似于函数的C++对象),可编写C++应用,在CUDA矢量和阵列中以高性能大规模并行方式运行。Thrust令CUDA编程变得简单,因为任何懂得C++的人已经知道如何为GPU编写程序。
图片2:英伟达VisualProfile的输出
从multiGPU和混合型CPU+GPU编程的角度看比较值得关注的是,Thrust可产生既能在多核处理器上又能在GPU上运行的代码!提供了两个分类符“__device____host__”。这告诉编译器为仿函数产生既能在主机上又能在GPU设备上运行的代码。我使用Thrust功能编写的应用可利用一个工作站内所有可用的计算资源。
对于这些应用,我喜欢使用基于主机的仿函数和OpenMP(OpenMultiProcessing)指令明确指定主处理器的并行性。作为一种应用程序接口,OpenMP可被大多数编译器支持,可用来创建支持多核处理器的并行应用。注意基于Thrust的应用可被透明编译,因而可全部在主多核处理器上运行。无需变更代码!相反,恰当地定义了一个特殊变量“THRUST_DEVICE_BACKEND”以指明一个OpenMP后端。Thrust的编写方式是,编译器产生的代码能在主多核处理器上并行运行而无需GPU。关于更多信息请访问Thrust网站。使用MPI接口的程序员可使用该基于Thrust的功能创建分布式应用,在系统每个GPU和主处理器上运行一个单独的MPI过程。注意,分布式应用也可在很大程度上使用PCIe总线,也可像前面讨论过的multiGPU那样暴露供应商PCIe装置的缺点。
所有这些信息都指向一个简单、易懂的解决方案:从供应商那里购买性能良好的PCIe总线。寻找完全支持向多GPU传送数据的高性能PCIe总线。即使您的应用暂时用不到多GPU,也要为潜在的应用设想。可以通过添加额外的GPU把性能提升二到四倍。
对于那些运行计算集群的人,性能欠佳的PCIe总线会对性能产生负面影响。使用phiGEMM库、我列举的快速傅里叶变换或您自己的多GPU示例进行的基准测试都应立即暴露出任何问题。不要依赖衡量PCIe到单个设备的带宽的结果。只有同时使用多个设备的基准测试才会暴露PCIe装置的缺陷。■