2013-05-17 171 views
3

cudaMemcpy函數在這種情況下如何工作?Cudamemcpy函數的用法

我已經聲明如下

float imagen[par->N][par->M]; 

一個矩陣,我想這樣我也把它複製到CUDA設備這

float *imagen_cuda; 

int tam_cuda=par->M*par->N*sizeof(float); 

cudaMalloc((void**) &imagen_cuda,tam_cuda); 
cudaMemcpy(imagen_cuda,imagen,tam_cuda,cudaMemcpyHostToDevice); 

請問這個副本的二維數組爲一維數組罰款?

如何複製到另一個二維數組?我可以改變這一點,它會工作嗎?

float **imagen_cuda; 
+1

首先,你爲什麼要爲你的二維數組使用棧?它總是會變小嗎?其次,二維數組存儲在一個連續的內存塊中,所以你可以使用一個'cudaMemcpy()'將數據複製到一維設備數組中。至於2D CUDA陣列,它有點複雜。你可以在Stack Overflow上找到一些信息和例子(例如[here](http://stackoverflow.com/a/9974989/1043187))。 – BenC

+0

另外,在編譯期間是否已知N和M? – BenC

+0

是的,他們是已知的,二維數組可能是1024 * 1024或更大 – Atirag

回答

3

這不是微不足道的複製主機和設備之間的數據時,以處理一個雙向下標數組c。在大多數情況下,cudaMemcpy(包括cudaMemcpy2D)需要一個普通的指針來源和目標,而不是指針指針。

最簡單的方法(我認爲)是「平坦」的二維數組,無論是在主機和設備,並使用索引運算來模擬二維座標:

float imagen[par->N][par->M]; 
float *myimagen = &(imagen[0][0]); 
float myval = myimagen[(rowsize*row) + col]; 

然後,您可以使用普通cudaMemcpy操作辦理轉讓(使用myimagen指針):

float *d_myimagen; 
cudaMalloc((void **)d_myimagen, (par->N * par->M)*sizeof(float)); 
cudaMemcpy(d_myimagen, myimagen, (par->N * par->M)*sizeof(float), cudaMemcpyHostToDevice); 

如果你真的想處理動態調整(即在編譯時不知道)雙標數組,你可以查看此question/answer

+0

不,我想我可以使用索引算術處理1d數組,因爲內存分配沒有區別。那謝謝啦! – Atirag