【问题标题】:NVCC register usage report in __device__ function__device__ 函数中的 NVCC 寄存器使用报告
【发布时间】:2018-02-07 23:17:55
【问题描述】:

我正在尝试使用 NVCC 选项
--ptxas-options=v 在我的 CUDA 内核中获取有关寄存器使用情况的一些信息,而使用全局函数时一切正常,自

以来,我在设备方面遇到了一些困难

ptxas info : Used N registers

输出中缺少行。关于调用全局函数,我尝试使用 noinline 关键字并将它们保存在另一个文件中,因为我认为 NVCC 正在报告全局函数的完整寄存器使用情况,包括被调用的设备函数在内联之后,但没有任何变化。我可以获取有关仅将它们定义为全局的设备功能的寄存器使用情况的信息。

你有什么建议吗?

谢谢!

【问题讨论】:

    标签: cuda gpu nvcc ptxas


    【解决方案1】:

    据我了解,ptxas(设备汇编程序)仅在其链接的代码上输出寄存器计数。独立的__device__ 函数不被汇编器链接,它们只被编译。因此,汇编器不会为设备函数发出寄存器计数值。我不相信有解决方法。

    但是,仍然可以通过使用 cuobjdump 从汇编器输出中转储 elf 数据来获取 __device__ 函数的寄存器占用空间。你可以这样做:

    $ cat vdot.cu
    __device__  __noinline__ float vdot(float v1, float v2) {
        return (v1 * v2);
    }
    
    __device__ __noinline__  float vdot(float2 v1, float2 v2) {
        return (v1.x * v2.x) + (v1.y * v2.y);
    }
    
    __device__ __noinline__ float vdot(float4 v1, float4 v2) {
        return (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z) + (v1.w * v2.w);
    }
    
    $ nvcc -std=c++11 -arch=sm_52 -dc -Xptxas="-v" vdot.cu
    ptxas info    : 0 bytes gmem
    ptxas info    : Function properties for cudaDeviceGetAttribute
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for _Z4vdotff
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for cudaOccupancyMaxActiveBlocksPerMultiprocessor
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for _Z4vdot6float4S_
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for cudaMalloc
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for cudaGetDevice
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for _Z4vdot6float2S_
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Function properties for cudaFuncGetAttributes
        0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    

    这里我们在一个设备对象文件中有一组单独编译的三个__device__ 函数。在其上运行cuobjdump 会产生大量输出,但在其中您将获得每个函数的寄存器计数:

    $ cuobjdump -elf ./vdot.o
    
    Fatbin elf code:
    ================
    arch = sm_52
    code version = [1,7]
    producer = cuda
    host = linux
    compile_size = 64bit
    compressed
    
    <---Snipped--->
    
    
    .text._Z4vdotff
    bar = 0 reg = 6 lmem=0  smem=0
    0xfec007f1  0x001fc000  0x00570003  0x5c980780  
    0x00470000  0x5c980780  0x00370004  0x5c680000  
    0xffe007ff  0x001f8000  0x0007000f  0xe3200000  
    0xff87000f  0xe2400fff  0x00070f00  0x50b00000
    

    在设备函数dot(float, float) 的输出的第二行中,您可以看到该函数使用了6 个寄存器。这是我知道的检查设备功能寄存器足迹的唯一方法。

    【讨论】:

    • 我还有一个与我的代码分析相关的问题。我正在尝试使用 nvvp/nvprof,但我只能获得全局函数的输出。是否有任何工具、编译标志等。我应该使用它来获取内核调用的每个设备函数的详细分析结果?到目前为止我想出的唯一解决方案是将设备功能更改为全局功能并单独调用它们。你认为有更好的策略吗?
    • cuobjdump -elf ./vdot.o | c++filt 怎么样?
    【解决方案2】:

    我不知道它是什么时候添加的,但我的 CUDA 10 cuobjdump-res-usage 标志,显示如下:

    $ cuobjdump -res-usage .../cuda_compile_1_generated_VisualOdometry.cu.o
    
    Fatbin elf code:
    ================
    arch = sm_61
    code version = [1,7]
    producer = cuda
    host = linux
    compile_size = 64bit
    identifier = /home/mad/automy-system/vision/src/VisualOdometry.cu
    
    Resource usage:
     Common:
      GLOBAL:0 CONSTANT[3]:24
     Function _Z17vo_compute_systemPfS_P6float4S_jS0_S0_f:
      REG:39 STACK:32 SHARED:168 LOCAL:0 CONSTANT[0]:404 CONSTANT[2]:80 TEXTURE:0 SURFACE:0 SAMPLER:0
     Function _Z13vo_pre_filterP6float4PfPjPK5uint2iijff:
      REG:16 STACK:0 SHARED:8 LOCAL:0 CONSTANT[0]:372 TEXTURE:0 SURFACE:0 SAMPLER:0
    

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      相关资源
      最近更新 更多