考慮這3個微不足道的小內核。他們的註冊使用量是,比我預期的要高很多。爲什麼?cuda - 最小的例子,註冊表使用率高
答:
__global__ void Kernel_A()
{
//empty
}
對應PTX:
ptxas info : Compiling entry function '_Z8Kernel_Av' for 'sm_20'
ptxas info : Function properties for _Z8Kernel_Av
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 2 registers, 32 bytes cmem[0]
B:
template<uchar effective_bank_width>
__global__ void Kernel_B()
{
//empty
}
template
__global__ void Kernel_B<1>();
對應PTX:
ptxas info : Compiling entry function '_Z8Kernel_BILh1EEvv' for 'sm_20'
ptxas info : Function properties for _Z8Kernel_BILh1EEvv
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 2 registers, 32 bytes cmem[0]
C:
template<uchar my_val>
__global__ void Kernel_C
(uchar *const device_prt_in,
uchar *const device_prt_out)
{
//empty
}
相應PTX:
ptxas info : Compiling entry function '_Z35 Kernel_CILh1EEvPhS0_' for 'sm_20'
ptxas info : Function properties for _Z35 Kernel_CILh1EEvPhS0_
16 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 10 registers, 48 bytes cmem[0]
問:
爲什麼空內核A和B使用2個寄存器? CUDA總是使用一個隱式的寄存器,但爲什麼有2個額外的顯式的寄存器被使用?內核C更令人沮喪。 10個寄存器?但只有2個指針。這爲指針提供了2 * 2 = 4個寄存器。即使還有另外2個神祕的寄存器(由Kernel A和Kernel B建議),這總共會有6個寄存器。 仍然遠遠少於10!
如果你有興趣,這裏是內核A的ptx
代碼內核B中的ptx
代碼是完全一樣的,模整數值和變量名。
.visible .entry _Z8Kernel_Av(
)
{
.loc 5 19 1
func_begin0:
.loc 5 19 0
.loc 5 19 1
func_exec_begin0:
.loc 5 22 2
ret;
tmp0:
func_end0:
}
而對於內核的c ...
.weak .entry _Z35Kernel_CILh1EEvPhS0_(
.param .u64 _Z35Kernel_CILh1EEvPhS0__param_0,
.param .u64 _Z35Kernel_CILh1EEvPhS0__param_1
)
{
.local .align 8 .b8 __local_depot2[16];
.reg .b64 %SP;
.reg .b64 %SPL;
.reg .s64 %rd<3>;
.loc 5 38 1
func_begin2:
.loc 5 38 0
.loc 5 38 1
mov.u64 %SPL, __local_depot2;
cvta.local.u64 %SP, %SPL;
ld.param.u64 %rd1, [_Z35Kernel_CILh1EEvPhS0__param_0];
ld.param.u64 %rd2, [_Z35Kernel_CILh1EEvPhS0__param_1];
st.u64 [%SP+0], %rd1;
st.u64 [%SP+8], %rd2;
func_exec_begin2:
.loc 5 836 2
tmp2:
ret;
tmp3:
func_end2:
}
- 爲什麼它首先聲明一個本地內存變量(
.local
)? - 爲什麼兩個指針(作爲函數參數給出)存儲在寄存器中?他們沒有特別的參數空間嗎?
- 也許這兩個函數參數指針屬於寄存器 - 這解釋了兩條線
.reg .b64
。但是.reg .s64
是什麼?爲什麼在那裏?
它變得更糟的是:
d:
template<uchar my_val>
__global__ void Kernel_D
(uchar * device_prt_in,
uchar *const device_prt_out)
{
device_prt_in = device_prt_in + blockIdx.x*blockDim.x + threadIdx.x;
}
給出
ptxas info : Used 6 registers, 48 bytes cmem[0]
所以操縱該參數(指針)降低爲10〜6寄存器?
我刪除了調試「-G」和「-g」從編譯器標誌...然後我得到了輸出相同你爲內核C. – cmo
我不能相信它。這是真的嗎? – cmo
它會出現這樣。同樣,PTX不會告訴你你想知道什麼 - 調試器的支持會導致彙編器發出更多的設置代碼。這可能是額外寄存器的來源。 – talonmies