2011-05-11 47 views
1

我一直在試圖分配一個可以被每個內核函數訪問的變量。 我的嘗試是下面附加的代碼,但它不會編譯,因爲內核無法查看dArray。在C++中,您可以將變量放在頂部,或聲明靜態,以便在程序中的每個範圍內訪問。CUDA在設備上靜態分配數據

__global__ void StoreThreadNumber() 
{ 
    dArray[threadIdx.x] = threadIdx.x; 
} 

int main(int argc, char** argv) 
{ 
    unsigned __int8 Array[16] = { 0 }; 
    unsigned __int8 dArray[16]; 

    for(__int8 Position = 0; Position < 16; Position++) 
     cout << Array[Position] << " "; 
    cout << endl; 

    cudaMalloc((void**) dArray, 16*sizeof(__int8)); 
    cudaMemcpy(dArray, Array, 16*sizeof(__int8), cudaMemcpyHostToDevice); 

    StoreThreadNumber<<<1, 16>>>(); 

    cudaMemcpy(Array, dArray, 16*sizeof(__int8), cudaMemcpyDeviceToHost); 

    for(__int8 Position = 0; Position < 16; Position++) 
     cout << Array[Position] << " "; 
    cout << endl; 

    cudaFree(dArray); 
} 

回答

5

您可以在CUDA中使用全局變量,類型爲__device____constant__

__constant__ int* dArrayPtr; 

__global__ void StoreThreadNumber() 
{ 
    dArrayPtr[threadIdx.x] = threadIdx.x; 
} 

只要確保你正確地從你的主機初始化dArrayPtr:因此,舉例來說,如果你初始化一個__constant__指針變量使用cudaMemcpyToSymbol()設備指針的地址,然後你可以通過__constant__變量訪問指針運行內核之前的代碼。

2

你不行。您必須將指向dArray的指針傳遞給內核。

我有同樣的問題,必須傳遞大量的全球數據到GPU。我最終把它全部包裝在一個結構中,並傳遞給它一個指針。