神奇的OpenCl寄存器数量

Ist*_*oki 6 nvidia opencl

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

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

然后我发现了另一个关于他编写的内核的问题,它再次使用了63个寄存器.

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

Hug*_*ell 5

63 个寄存器是最大值。在大多数最近的硬件(例如 GTX 480 到 GTX 770)上的数量。只有使用 GTX 780 或 Tesla K20,您才能获得每个线程 255 个寄存器。

因此,当您的内核使用 63 个寄存器时,很可能会使用 63 个以上的寄存器,但它们将溢出到片外专用内存(也称为 CUDA 本地内存)。例如,如果您的 nvidia 分析器报告 128 字节的本地内存,则意味着您需要摆脱 32 个(溢出)寄存器,然后才能获得低于 63 个硬件寄存器。

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