我覺得CUDA將會嘗試在寄存器分配標量,並在費米級GPU,每個線程有63個寄存器。 我的代碼是這樣的:標量變量和寄存器:CUDA
__global__ void test20 (double a)
{
double i1=1.0;
double i2=2.0;
double i3=3.0;
double i4=4.0;
double i5=5.0;
double i6=6.0;
double i7=7.0;
double i8=8.0;
double i9=9.0;
double i10=10.0;
...
a = i1+i2+i3 ... i20
}
但是,當我看到使用NVVP每線程寄存器的數量,我只看到2個寄存器每個線程分配的,當我希望更高的數字。即使我將變量減少到10,分配的寄存器數量也保持不變。爲什麼會發生這種情況,如何確保我有n個變量,CUDA使用n個寄存器(考慮到每個變量可以存儲在一個寄存器中)?
編輯:
繼建議,我已經修改了代碼:
__global__ void test (double *a)
{
double reg1;
double reg2;
double reg3;
double reg4;
double reg5;
double reg6;
double reg7;
double reg8;
....till 40
reg1 = log10f(a[0]);
reg2 = log10f(a[1]);
reg3 = log10f(a[2]);
reg4 = log10f(a[3]);
reg5 = log10f(a[4]);
reg6 = log10f(a[5]);
reg7 = log10f(a[6]);
reg8 = log10f(a[7]);
reg9 = log10f(a[8]);
....till 40
a[0] = reg1;
a[1] = reg2;
a[2] = reg3;
a[3] = reg4;
a[4] = reg5;
a[5] = reg6;
a[6] = reg7;
a[7] = reg8;
}
我memcpy
-ing陣列a
回到主機。我現在看到每個線程使用全部63個寄存器:ptxas info : Used 62 registers, 40 bytes cmem[0]
。雖然我通過的變量比寄存器中可以容納的要多得多,但是我沒有看到任何溢出到本地內存中;我認爲NVCC正在優化代碼以僅使用寄存器。
它的編譯器優化。編譯器可以預先計算結果並替換一個常量。 – talonmies
你能建議如何防止這種情況發生? – Sayan
使用在編譯時無法評估的表達式。 – talonmies