我正在尝试使用 NVCC 选项
--ptxas-options=v
在我的 CUDA 内核中获取有关注册表使用情况的一些信息功能一切正常,我自
ptxas info : Used N registers
输出中缺少行。我尝试使用noinline关键字并将它们保存在另一个文件中,与调用全局函数有关,因为我认为 NVCC 报告了全局函数的完整寄存器用法,包括被调用的设备内联后但没有任何变化。我可以获得有关设备功能的寄存器使用情况的信息,只将它们定义为全局。
你有什么建议吗?
谢谢!
答案 0 :(得分:3)
据我了解,ptxas
(设备汇编程序)仅在其链接的代码上输出寄存器计数。汇编器不链接独立的__device__
函数,只编译它们。因此,汇编器不会为器件功能发出寄存器计数值。我不相信有解决方法。
但是,仍然可以通过使用__device__
从汇编程序输出转储elf数据来获取cuobjdump
函数的寄存器占用空间。您可以按如下方式执行此操作:
$ 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个寄存器。这是我了解检查器件功能寄存器占用空间的唯一方法。
答案 1 :(得分:1)
我不知道何时添加它,但是我的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