2012-09-22 57 views
2

什麼是內核中聲明的數組的內存空間?例如在下面的代碼中,我聲明瞭數組a。這個數組的位置在哪裏?我在本地內存和寄存器之間感到困惑?如果它在寄存器中,那麼它們的映射方式如何?CUDA內核中數組的內存空間

__device__ int ptr=0; 

__global__ void a() 
{ 
    int b[9][9];           
    atomicAdd(&ptr,1); 
    b[0][0]=ptr;          
    for(int i=1;i<9;i++) 
    { 
     for(int j=1;j<9;j++) 
     { 
      b[i][j]=b[i-1][j-1]+1; 
     } 
    } 
    ptr=b[7][7]+1;             
}  

int main() 
{ 
    a<<<1,1>>>(); 
    return 0; 
} 

一般情況下,有沒有辦法通過.ptx文件,以瞭解各變量的存儲空間? 我編譯了這個--ptxas-options=-v但沒有有用的信息。我看着.o文件,但它不包含我想要的。我想要的只是內核中使用的變量的位置。

+3

這樣的數組是線程本地數據,因此默認情況下將存儲在本地內存中。取決於訪問模式和大小,並受制於編譯器優化,它可以放置在寄存器中。對於寄存器中的數據,所有訪問必須使用編譯時常量索引,並且數組必須是「小」的,這由編譯器啓發式確定。 – njuffa

+0

如何知道這些分配的實際位置? –

+3

看看PTX(您可以使用--keep ro保存中間PTX)。您將看到來自本地內存的加載或註冊訪問。再次想到,註冊分配也可能發生在將PTX轉換爲SASS機器代碼的編譯器後端。你可以用cuobjdump --dump-sass檢查生成的SASS。 – njuffa

回答

1

線程的私有數組肯定是保存在本地的存儲空間,在DRAM現成的芯片,並在存儲層次,也許緩存。通常,非數組變量被視爲PTX中的虛擬寄存器,並且PTX中的寄存器數量是無限的。但是,顯然所有這些虛擬寄存器都沒有映射到物理寄存器。 PTX後處理器根據爲NVCC指定的微架構標誌將一些寄存器溢出到本地空間,並優化寄存器使用情況。

1

我回答了這個問題,因爲我已經從GTC的演示文稿中確認了一個視圖。因此,如果編譯器足夠小,編譯器會嘗試將這些數組放入寄存器中。如果他們無法在寄存器文件中容納,它將被傳播到本地內存。但主存儲區域是寄存器!