__global__ void add(int *c, const int* a, const int* b)
{
int x = blockIdx.x;
int y = blockIdx.y;
int offset = x + y * gridDim.x;
c[offset] = a[offset] + b[offset];
}
在上述例子中,我想x
,y
,offset
被保存在寄存器中而什麼樣的變量消耗CUDA中的寄存器?
NVCC -Xptxas -v給出
4 registers, 24+16 bytes smem
分析器顯示4個寄存器
和頭部PTX文件:
.reg .u16 %rh<4>; .reg .u32 %r<9>; .reg .u64 %rd<10>; .loc 15 21 0 $LDWbegin__Z3addPiPKiS1_: .loc 15 26 0
任何人都可以澄清寄存器的使用情況如何?在Fermi中,每個線程的最大寄存器數爲63。在我的程序中,我想測試內核消耗太多寄存器的情況(因此變量可能必須自動存儲在本地內存中,從而導致性能下降)。然後在這一點上,我可以將一個內核分成兩個,這樣每個線程都有足夠的寄存器。假設SM資源足夠用於併發內核。
我不知道我是否正確。
是你的問題「爲什麼這個代碼使用4個寄存器而不是3個?」如果是這樣,答案是這樣的:爲了添加'a [offset]'和'b [offset]',必須獲取這兩個值。它必須存儲它在第一次獲取到的第一個地方,而它正在獲取另一個地方。所以還需要一個寄存器。 – 2012-07-14 12:20:43
謝謝您的回答,那麼我們可以說中間變量將被保存在寄存器中嗎? – user1525320 2012-07-14 12:37:46
必要時,是的。在需要的時候並不總是很容易辨別,甚至可能因硬件目標而異。 – 2012-07-14 12:38:15