__device__函数中的NVCC寄存器使用情况报告



我正试图使用NVCC选项
--ptxas-options=v获取CUDA内核中寄存器使用情况的一些信息,虽然使用全局功能一切正常,但由于

ptxas info : Used N registers

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

你有什么建议吗?

谢谢!

据我所知,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个寄存器。这是我所知道的检查设备功能寄存器封装的唯一方法。

我不知道它是什么时候添加的,但我的CUDA 10cuobjdump-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

最新更新