寄存器/线程说50但实际上是56

时间:2013-07-01 15:28:19

标签: cuda

我正在使用CUDA 5.5,VS2010和参数compute_35和sm_35。我有一个GFX Titan。

我有一个内核,寄存器/线程表示它使用50个寄存器,每个块的线程数为128,寄存器/块为7168。

7168/128 = 56。

我没有使用纹理。

见下图:

registers

如果我将寄存器使用限制为48,我会得到: 47个寄存器/线程但实际使用量是每个线程48个

1 个答案:

答案 0 :(得分:8)

所有体系结构都具有寄存器文件分配粒度。实际上,这意味着每个warp或块分配的寄存器数必须向上舍入到寄存器页面大小的下一个最大倍数。

对于GTX titan,寄存器文件分配大小为256个寄存器,分配单位为每个warp。所以使用你的例子:

50 registers per thread = 50 * 32 = 1600 registers per warp
1600 registers per warp / 256 registers per page = 7 pages per warp
7 pages per warp = 7 * 256 = 1792 registers per warp
128 threads per block = 4 warps per block = 4 * 1792 = 7168 registers per block

因此,你的内核的一个块需要7168个寄存器,即使每个线程的寄存器数*每个块的线程数仅提供6400个寄存器。您可以在每个版本的CUDA工具包随附的占用电子表格中查看所有这些数字。