【问题标题】:registers/thread says 50 but they are actually 56寄存器/线程说 50 但实际上是 56
【发布时间】:2013-07-01 15:28:18
【问题描述】:

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

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

7168 / 128 = 56。

我没有使用纹理。

见下图:

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

    所有架构都有一个寄存器文件分配粒度。在实践中,这意味着每个 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 工具包附带的占用电子表格中查看所有这些数字。

    【讨论】:

    • Registers/Thread 来自编译器通过 CUDA 驱动程序输出。正如 Talonmies 所解释的,Registers/Block 解释了寄存器分配粒度,即 256 个寄存器/warp(8 个寄存器/线程)。第一个数字是代码使用的每个线程的寄存器。第二个是分配大小。在大多数情况下,这不会超过 RegisterAllocationGranualarityPerThread - 1。对于极其简单的内核,ABI 合规性可能导致至少 16 个寄存器/线程的寄存器分配。
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2015-07-29
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多