我编写了两个不同的 OpenCl 内核,使用 NVIDIA 分析工具获取了一些信息,并发现两者都使用了每个工作项 63 个寄存器。
我尝试了我所能想到的一切来降低这个数字(用 ushort 替换 int,在 {} 中声明变量以告诉编译器何时可以摆脱它们),但似乎不可能改变这个 63!
然后我找到了一个关于他编写的内核的另一个问题,它也使用了 63 个寄存器。
当然,这可能是纯粹巧合,但也可能有原因......可能是使用了特定的函数、硬件限制?有人知道吗?
我编写了两个不同的 OpenCl 内核,使用 NVIDIA 分析工具获取了一些信息,并发现两者都使用了每个工作项 63 个寄存器。
我尝试了我所能想到的一切来降低这个数字(用 ushort 替换 int,在 {} 中声明变量以告诉编译器何时可以摆脱它们),但似乎不可能改变这个 63!
然后我找到了一个关于他编写的内核的另一个问题,它也使用了 63 个寄存器。
当然,这可能是纯粹巧合,但也可能有原因......可能是使用了特定的函数、硬件限制?有人知道吗?
大多数最新硬件(例如GTX 480到GTX 770)最多可以使用63个寄存器。只有使用GTX 780或Tesla K20才能获得每个线程255个寄存器。
因此,当您的内核使用63个寄存器时,它很可能使用的寄存器数量超过了63个,但这些寄存器将被溢出到离线芯片私有内存(也称为CUDA本地内存)。例如,如果您的Nvidia分析器报告了128字节的本地内存,则表示您需要在降至63个硬件寄存器之前摆脱32个(溢出的)寄存器。
顺便说一句,“每个多处理器的8192个32位寄存器”意味着所有驻留在多处理器上的工作组都有8192个寄存器。但通常,工作组的数量受到工作组大小和内核所需寄存器数量的限制。例如,如果您的内核使用63个寄存器,并且您的工作组大小为16^2,则您会得到:63 * 16 ^ 2 = 16128个寄存器每个工作组。假设您每个多处理器有64K个寄存器,则每个多处理器可以有4个工作组驻留,这将产生25%的占用率。
ushort
而不是int
会减少寄存器的使用数量? - Grizzly