據我所知,ptxas
(設備彙編器)只輸出一個寄存器計數,它鏈接的代碼。獨立的__device__
函數沒有被彙編器鏈接,它們只被編譯。因此,彙編器不會爲器件功能發出寄存器計數值。我不相信這有一個解決方法。
但是,仍然可以通過使用cuobjdump
從彙編程序輸出中轉儲精靈數據來獲得__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寄存器。這是我知道檢查器件功能寄存器佔位情況的唯一方法。
謝謝,這解決了我的問題! – Christopher23
我會有一個額外的問題,與我的代碼分析有關。我試圖使用nvvp/nvprof,但是我只能得到我的全局函數的輸出。是否有任何工具,編譯標誌等。我應該使用獲取我的內核調用的每個設備函數的詳細分析結果?到目前爲止我唯一提出的解決方案是將設備功能更改爲全局設備並分別調用它們。你認爲有更好的策略嗎? – Christopher23