Cuda 寄存器/线程表示50,但实际上是56

Cuda 寄存器/线程表示50,但实际上是56,cuda,Cuda,我使用的是CUDA 5.5、VS2010和参数compute_35和sm_35。我有一个GFX泰坦 我有一个内核,寄存器/线程说它使用50个寄存器,每个块的线程数是128,寄存器/块数是7168 7168/128=56 我没有使用纹理 请参见下图: 如果我将寄存器使用限制为48,我会得到以下结果: 47个寄存器/线程,但实际上每个线程使用48个所有体系结构都有一个寄存器文件分配粒度。实际上,这意味着每个扭曲或块分配的寄存器数量必须向上舍入到寄存器页面大小的下一个最大倍数 对于GTX titan

我使用的是CUDA 5.5、VS2010和参数compute_35和sm_35。我有一个GFX泰坦

我有一个内核,寄存器/线程说它使用50个寄存器,每个块的线程数是128,寄存器/块数是7168

7168/128=56

我没有使用纹理

请参见下图:

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

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

对于GTX titan,寄存器文件分配大小为256个寄存器,分配单位为每个扭曲。以你的例子来说:

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工具包的每个版本附带的占用率电子表格中看到所有这些数字。

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

对于GTX titan,寄存器文件分配大小为256个寄存器,分配单位为每个扭曲。以你的例子来说:

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工具包的每个版本附带的占用率电子表格中看到所有这些数字。

寄存器/线程来自通过CUDA驱动程序的编译器输出。Talonmes解释的寄存器/块说明了寄存器分配粒度,即256个寄存器/扭曲(8个寄存器/线程)。第一个数字是代码使用的每个线程的寄存器。第二是分配规模。在大多数情况下,其变化幅度不会超过RegisterLocationGranualaryTyperThread-1。对于非常简单的内核,ABI合规性可能会导致最低16个寄存器/线程的寄存器分配。寄存器/线程通过CUDA驱动程序从编译器输出。Talonmes解释的寄存器/块说明了寄存器分配粒度,即256个寄存器/扭曲(8个寄存器/线程)。第一个数字是代码使用的每个线程的寄存器。第二是分配规模。在大多数情况下,其变化幅度不会超过RegisterLocationGranualaryTyperThread-1。对于非常简单的内核,ABI合规性可能导致最小寄存器分配为16个寄存器/线程。