OpenCL CPU设备与GPU设备

K0n*_*71n 12 opencl

考虑一个简单的例子:向量加法.

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

谢谢你的帮助.

mfa*_*mfa 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单元.大多数顶级桌面cpu都有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