神奇的OpenCl寄存器数量

时间:2012-12-10 17:18:59

标签: opencl nvidia

我编写了两个不同的openCl内核,使用nvidia分析器获取有关它们的一些信息,发现每个工作项都使用了63个寄存器。

我尝试了所有我能想到的东西来降低这个数字(用ushort替换int,试图在{}中声明变量以显示编译器什么时候可以摆脱它们)但似乎不可能改变这个63! / p>

然后我发现another question关于他编写的内核使用了......再次使用63个寄存器。

当然这可能是纯粹的巧合,但也许有一个原因......使用了特定的功能,硬件限制?有谁知道吗?

2 个答案:

答案 0 :(得分:4)

63个寄存器是最大值。大多数最新硬件如GTX 480到GTX 770的数量。只有GTX 780或Tesla K20,每个线程才能获得255个寄存器。

因此,当您的内核使用63个寄存器时,它很可能使用超过63个寄存器,但它们将溢出到片外私有存储器(也称为CUDA本地存储器)。例如,如果您的nvidia分析器报告128字节的本地内存,则意味着您需要先删除32个(溢出的)寄存器,然后才能获得63个硬件寄存器。

BTW:“每个多处理器8,192个32位寄存器”表示驻留在多处理器上的所有工作组的8,192个寄存器。但通常工作组的数量受工作组大小和内核所需寄存器数量的限制。因此,例如,如果您的内核使用63个寄存器,并且您的工作组大小为16 ^ 2,则每个工作组得到63 * 16 ^ 2 = 16128个寄存器。假设每个多处理器有64K寄存器,那么每个多处理器上可以有4个工作组,占用率为25%。

答案 1 :(得分:0)

最大寄存器/线程的数量受hw限制,它取决于设备的“计算能力”。看看桌子 Compute Capabilities

(这适用于NVidia,其他供应商可能有其他限制)。