2011-11-25 96 views
1

是否可以將指針數組傳遞給cuda內核?
我期待這樣的事情:CUDA中的指針陣列

__global__ void Kernel(int **arr) 
{ 
    int *temp = arr[blockDim.x]; 
    temp[blockIdx.x] = blockIdx.x; 
} 

我如何分配CUDA內存這樣的結構?

+0

[CUDA分配數組的數組]的可能重複(http://stackoverflow.com/questions/1835537/cuda-allocating-array-of-arrays) – talonmies

+1

這個問題的正確解決方案可以找到[在這個答案](http://stackoverflow.com/q/1887312/681865) – talonmies

回答

3

這種數組的內存分配不是問題,你可以通過cudaMalloc(sizeof(void *)* SIZE)來完成。但是,寫入正確的值是主要問題。只有從主機函數更改設備內存中的值的方法實際上是將信息從主機內存複製到設備內存(cudaMemcpy()或cudaMemcpyToSymbol())。因此,要將設備指針寫入設備內存,我們必須在主機內存中有指向設備內存的指針,我認爲這是不可能的。 (存儲在由cudaMalloc()分配的主變量中的指針不是設備內存中的實際指針)。所以,在數組中寫入正確值的唯一方法是內核,這使得指針數組非常不方便。 我建議使用索引而不是指針,它會好得多。基本上,如果在您寫入{4,3,0,1,2}的索引數組中,它意味着第一個元素指向索引4中的某個數組,第二個元素指向第三個元素,依此類推。如果你想指向多個數組,你應該通過一些規則進行索引,在這個規則中你將填充索引數組,並且你將從內核訪問內存。

1

我在CUDA目前正在做一些圖像處理工作,我建議您只分配一個線性內存緩衝區,並使用索引方案而不是處理指針數組。這是我的經驗,方式更簡單。我的2c。