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

时间:2012-02-17 10:17:33

标签: opencl nvidia simd

我需要澄清一下。我正在笔记本电脑上运行OpenCL,运行一个小型的nvidia GPU(310M)。当我在设备中查询CL_DEVICE_MAX_COMPUTE_UNITS时,结果为2.我读取运行内核的工作组数应与计算单元数相对应(Heterogenous Computing with OpenCL,第9章,第186页)否则会浪费太多的全球记忆带宽。

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

2 个答案:

答案 0 :(得分:17)

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

在CUDA架构上,OpenCL计算单元相当于多处理器(可以有8个,32个或48个核心),这些单元的设计能够同时运行多达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实现如何映射到其硬件功能的所有细节,它将回答您在此处提出的问题。

答案 1 :(得分:2)

我甚至认为将您的工作组计数与计算单元相匹配对CPU来说是一个好主意。最好将内核超额预订几倍。这允许工作负载动态地(在工作组量子中)移动,因为各种处理器上线或者被其他工作分散注意力。工作组count = CL_DEVICE_MAX_COMPUTE_UNITS只能在一台机器上运行良好,这台机器绝对不会做任何事情并浪费大量精力保持未使用的核心处于唤醒状态。