考虑一个简单的例子:向量加法。
如果我为CL_DEVICE_TYPE_GPU构建程序,并为CL_DEVICE_TYPE_CPU构建相同的程序,它们之间有什么区别(除了“CPU程序”在CPU上运行,“GPU程序”在GPU上运行)? / p>
感谢您的帮助。
答案 0 :(得分:37)
设备类型之间存在一些差异。对向量问题的简单回答是:对大型向量使用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个内核,服务器cpu当前停在16个内核。 (cpu核心映射1:1计算单位计数)opencl中的计算单元是设备的一部分,可以完成与设备其余部分不同的工作。
4)线程类型。 gpus有一个SIMD架构,有许多面向图形的指令。 cpus有很多专门用于分支预测和一般计算的区域。 cpu可能在每个内核中都有一个SIMD单元和/或浮点单元,但我上面提到的Cayman芯片有1536个单元,每个单元都有gpu指令集。 AMD将它们称为流处理器,并且上述每个SIMD单元中有4个(24x16x4 = 1536)。除非制造商想要削减一些高速缓冲存储器或分支预测硬件,否则没有cpu将具有那么多sin(x)或具有点积的单元。 gpus的SIMD布局可能是大型矢量添加情况下最大的“胜利”。那也做其他专业功能是一个很大的好处。
5)内存带宽。 DDR3的cpus:~17GB / s。高端gpus> 100GB / s,速度超过200GB / s最近变得普遍。如果您的算法不受PCI-e限制(参见#1),则gpu将超过原始内存访问中的cpu。通过仅运行不等待内存访问的任务,gpu中的调度单元可以进一步隐藏内存延迟。 AMD称之为波前,Nvidia称之为扭曲。 cpus有一个庞大而复杂的缓存系统,可以在程序重用数据时帮助隐藏内存访问时间。对于矢量添加问题,PCI-e总线可能会受到更多限制,因为矢量通常只使用一次或两次。
6)电源效率。一个gpu(使用得当)通常比cpu更有效。因为cpus在时钟速度上占主导地位,所以真正降低功耗的唯一方法之一就是降低芯片的时钟频率。这显然会导致更长的计算时间。 Green 500列表中的许多顶级系统都是大量加速的。见这里:green500.org