我正在使用 CUDA 5.5、VS2010 和参数 compute_35 和 sm_35。我有一个 GFX 泰坦。
我有一个内核,Registers/Thread 说它使用 50 个寄存器,每个块的线程是 128,寄存器/块是 7168。
7168 / 128 = 56。
我没有使用纹理。
见下图:
如果我将寄存器使用量限制为 48,我会得到:47 个寄存器/线程,但实际使用量是每个线程 48 个
我正在使用 CUDA 5.5、VS2010 和参数 compute_35 和 sm_35。我有一个 GFX 泰坦。
我有一个内核,Registers/Thread 说它使用 50 个寄存器,每个块的线程是 128,寄存器/块是 7168。
7168 / 128 = 56。
我没有使用纹理。
见下图:
如果我将寄存器使用量限制为 48,我会得到:47 个寄存器/线程,但实际使用量是每个线程 48 个
所有架构都有一个寄存器文件分配粒度。在实践中,这意味着每个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 工具包附带的占用电子表格中看到所有这些数字。