2012-02-09 77 views
11

考虑一个简单的例子:向量加法。OpenCL CPU设备vs GPU设备

如果我为CL_DEVICE_TYPE_GPU构建了一个程序,并且为CL_DEVICE_TYPE_CPU构建了相同的程序,它们之间的区别是什么(除了“CPU程序”在CPU上运行,“GPU程序”在GPU上运行)?

感谢您的帮助。

回答

35

设备类型有一些差异。对你的向量问题的简单回答是:对于大向量使用gpu,对于较小的工作负载使用cpu。

1)存储器复制。 GPU依靠您正在处理的数据传递给它们,并且结果稍后会读回主机。这是通过PCI-e完成的,对于版本2.0/2.1,这会产生大约5GB/s。 CPU可以使用“就地”缓冲区 - 在DDR3中 - 使用CL_MEM_ALLOC_HOST_PTR或CL_MEM_USE_HOST_PTR标志。看到这里:clCreateBuffer。这是许多内核的瓶颈之一。

2)时钟速度。时钟速度上,cpus目前在gpus上有很大的领先优势。对于大多数处理器而言,2Ghz处于低端,而对于大多数处理器来说,1GHz作为高端处理器。这是一个真正有助于CPU在小工作负载下“赢得”GPU的因素之一。

3)并发“线程”。高端gpus的计算单位通常比cpu对应的计算单位多。例如,6970 gpu(Cayman)有24个opencl计算单元,每个计算单元分为16个SIMD单元。大多数顶级桌面cpus有8个内核,而服务器cpus目前停止在16个内核。 (CPU核心映射1:1计算单元计数)opencl中的计算单元是设备的一部分,它可以执行与设备其余部分不同的工作。

4)线程类型。 gpus有一个SIMD架构,有很多面向图形的指令。 cpus有很多专门用于分支预测和一般计算的区域。一个CPU可能在每个核心中都有一个SIMD单元和/或浮点单元,但是我上面提到的Cayman芯片有1536个单元,并且每个单元都可以使用gpu指令集。 AMD称它们为流处理器,每个上述SIMD单元有4个(24x16x4 = 1536)。除非制造商想要切断一些高速缓冲存储器或分支预测硬件,否则任何cpu都不会有那么多的sin(x)或dot-product-capable单位。 gpus的SIMD布局可能是大型矢量添加情况下最大的“胜利”。也做其他专业功能是一大奖励。

5)存储器带宽。 CPU与DDR3:〜17GB /秒。最新gpus> 100GB/s,速度超过200GB/s最近变得很普遍。如果您的算法不受PCI-e限制(请参阅#1),则gpu将在原始内存访问中超出CPU。 gpu中的调度单元可以通过仅运行未等待内存访问的任务来进一步隐藏内存延迟。 AMD称之为波阵面,Nvidia称之为扭曲。在程序重用数据的情况下,cpus有一个大而复杂的缓存系统来帮助隐藏他们的内存访问时间。对于你的矢量增加问题,你可能会受到更多PCI-e总线的限制,因为这些矢量通常只使用一次或两次。

6)功率效率。一个gpu(正确使用)通常比cpu电效率更高。由于CPU在主频方面占主导地位,真正降低功耗的唯一方法之一是降低芯片的时钟频率。这显然导致更长的计算时间。绿色500列表中的许多顶级系统都加速了gpu。看到这里:green500.org