2012-09-21 190 views
0

我覺得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正在優化代碼以僅使用寄存器。

+0

它的編譯器優化。編譯器可以預先計算結果並替換一個常量。 – talonmies

+0

你能建議如何防止這種情況發生? – Sayan

+4

使用在編譯時無法評估的表達式。 – talonmies

回答

1

如果按照@talonmies建議,使用不能在運行時計算的表達式,你可能仍然無法獲得每一個申報登記(或在這種情況下,2個寄存器來保存雙)。您可能還必須保持該變量在整個持續時間內保持活動狀態。

__global__ void test20 (double a) 
{ 
    double i1=1.0 * a; 
    double i2=2.0 * i1; 
    double i3=3.0 * i2; 
    double i4=4.0 * i3; 
    double i5=5.0 * i4; 

    a = i1+i2+i3+i4+i5; 

    printf("a = %f = %f + %f + %f + %f + %f\n", a, i1, i2, i3, i4, i5); 
} 

這是在瀏覽器中編寫的示例代碼。目標是保留寄存器中的值。此示例沒有實際應用,因爲編譯器的目標是使用最少的寄存器。唯一的價值在於調試使變量在其範圍內保持活動狀態。

如果您想了解寄存器的使用,你應該使用cuobjump -sass轉儲爲內核的彙編代碼。

+0

值得注意的是,如果沒有的printf調用,全局存儲器寫入涉及所有雙值的值將需要防止相同的優化問題。 – talonmies

+0

我想我會用一個數組,而不是變量@ArchaeaSoftware建議縮短代碼 – Sayan

+0

@sayan:確保你明白* ArchaeaSoftware的一切都在這種情況下評論。 – talonmies