7

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

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

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

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

4

2 回答 2

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% 的占用率。

于 2013-09-22T10:45:17.403 回答
0

最大。寄存器/线程的数量受硬件限制,并且取决于设备的“计算能力”。查看 Compute Capabilities表。

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

于 2013-05-14T05:10:24.957 回答