2008-11-07 27 views
5

我試圖利用常量內存,但我很難搞清楚如何嵌套數組。我擁有的是一系列數據,這些數據可以用於內部數據,但每個條目的數據都不相同。所以基於以下簡化代碼,我有兩個問題。首先,我不知道如何分配數據結構成員指向的數據。其次,由於我不能將cudaGetSymbolAddress用於常量內存,我不確定是否可以傳遞全局指針(無法用普通的__device__內存)。CUDA中的常量內存動態分配


struct __align(16)__ data{ 
int nFiles; 
int nNames; 
int* files; 
int* names; 
}; 

__device__ __constant__ data *mydata; 

__host__ void initMemory(...) 
{ 
    cudaMalloc((void **) &(mydata), sizeof(data)*dynamicsize); 
    for(int i=; i lessthan dynamicsize; i++) 
    { 
     cudaMemcpyToSymbol(mydata, &(nFiles[i]), sizeof(int), sizeof(data)*i, cudaMemcpyHostToDevice); 
     //... 
     //Problem 1: Allocate & Set mydata[i].files 
    } 
} 

__global__ void myKernel(data *constDataPtr) 
{ 
    //Problem 2: Access constDataPtr[n].files, etc 
} 

int main() 
{ 
    //... 
    myKernel grid, threads (mydata); 
} 

感謝您提供的任何幫助。 :-)

回答

0

爲什麼不使用所謂的「打包」數據表示?這種方法允許您將所需的所有數據放入一維字節數組中。例如,如果你需要存儲

struct data 
{ 
    int nFiles; 
    int nNames; 
    int* files; 
    int* names; 
} 

您可以將此數據這樣只是存儲在陣列中:

[struct data (7*4=28 bytes) 
    [int nFiles=3 (4 bytes)] 
    [int nNames=2 (4 bytes)] 
    [file0 (4 bytes)] 
    [file1 (4 bytes)] 
    [file2 (4 bytes)] 
    [name0 (4 bytes)] 
    [name1 (4 bytes)] 
] 
1

我覺得常量內存爲64K和動態使用CudaMalloc你不能分配它。它必須被聲明爲常量,比如說,

__device__ __constant__ data mydata[100]; 

同樣,你也不需要釋放它。此外,您不應該通過指針傳遞引用,只需將其作爲全局變量進行訪問即可。我試着做類似的事情,它給了我segfault(在devicemu中)。

1

不,你不能做到這一點。

恆定內存(最大64KB)只能在編譯之前進行硬編碼。

但是,您可以隨時在設備上緩存中分配紋理內存。