与工作组数量对应的计算单位数

rdo*_*eui 14 nvidia simd opencl

我需要一些澄清.我正在我的笔记本电脑上运行OpenCL,运行一个小型的nvidia GPU(310M).当我查询设备时CL_DEVICE_MAX_COMPUTE_UNITS,结果是2.我读取运行内核的工作组数量应该与计算单元的数量相对应(使用OpenCL进行异构计算,第9章,第186页),否则会浪费全球记忆力很强.

此外,芯片被指定具有16个cuda核心(对应于我认为的PE).这在理论上是否意味着,对于全局内存带宽,此gpu的最高性能设置是有两个工作组,每个工作项有16个工作项?

tal*_*ies 17

虽然将工作组的数量设置为相等CL_DEVICE_MAX_COMPUTE_UNITS,但在某些硬件上可能是合理的建议,但肯定不是在NVIDIA GPU上.

在CUDA架构,在OpenCL计算单元是多处理器(其可以有8,32个或48个内核)的等价物,并且这些被设计成能够simultanesouly运行多达8个工作组(在CUDA块)的每个.在较大的输入数据大小时,您可以选择运行数千个工作组,并且您的特定GPU可以在每个内核启动时处理多达65535 x 65535个工作组.

OpenCL具有另一个设备属性CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE.如果您在NVIDIA设备上查询它,它将返回32(这是"warp",或硬件的自然SIMD宽度).该值是您应该使用的工作组大小倍数; 工作组大小每个最多可以包含512个项目,具体取决于每个工作项消耗的资源.特定GPU的标准经验法则是,每个计算单元至少需要192个活动工作项(CUDA术语中每个多处理器的线程数),以涵盖架构的所有延迟,并可能获得全内存带宽或完全算术吞吐量,具体取决于关于代码的性质.

NVIDIA在CUDA工具包中发布了一份名为"CUDA架构的OpenCL编程指南"的好文档.您应该花些时间阅读它,因为它包含了NVIDIA OpenCL实现如何映射到其硬件功能的所有细节,它将回答您在此处提出的问题.