2013-05-14 77 views
0

所以我一直在這個問題上停留了一段時間。我的結構看起來像這樣:CUDA,動態數組+數組。 malloc和copy

typedef struct 
{ 
int size; 
int dim[DIMENSIONS]; 
float *data; 

}matrix; 

現在,我的問題是如何malloc和memcpy。這是我如何做它:

matrix * d_in; 
matrix * d_out; 
const int THREADS_BYTES = sizeof(int) + sizeof(int)*DIMENSIONS + sizeof(float)*h_A->_size; 
cudaMalloc((void **) &d_in, THREADS_BYTES); 
cudaMemcpy(d_in, h_A, THREADS_BYTES, cudaMemcpyHostToDevice); 

編輯:我這是怎麼分配的h_a:

matrix A; // = (matrix*)malloc(sizeof(matrix)); 
A._dim[0] = 40; 
A._dim[1] = 60; 
A._size = A._dim[0]*A._dim[1]; 
A._data = (float*)malloc(A._size*sizeof(float)); 
matrix *h_A = &A; 

哪裏h_A是我分配的矩陣。我打電話給我的內核是這樣的:

DeviceComp<<<gridSize, blockSize>>>(d_out, d_in); 

然而,在我的內核我不能從結構,只有數組和變量到達的任何數據。

回答

0

這是一個常見問題。當您在主機上進行malloc操作(對於h_a-> data)時,您分配的主機數據不可從設備訪問。

This answer詳細描述了發生了什麼以及如何解決這個問題。

在你的情況,這樣的事情應該工作:

matrix A; // = (matrix*)malloc(sizeof(matrix)); 
A._dim[0] = 40; 
A._dim[1] = 60; 
A._size = A._dim[0]*A._dim[1]; 
A._data = (float*)malloc(A._size*sizeof(float)); 
matrix *h_A = &A; 

float *d_data; 
cudaMalloc((void **) &d_data, A._size*sizeof(float)); 


matrix * d_in; 
matrix * d_out; 
const int THREADS_BYTES = sizeof(int) + sizeof(int)*DIMENSIONS + sizeof(float)*h_A->_size; 
cudaMalloc((void **) &d_in, THREADS_BYTES); 
cudaMemcpy(d_in, h_A, THREADS_BYTES, cudaMemcpyHostToDevice); 

cudaMemcpy(&(d_in->data), &d_data, sizeof(float *), cudaMemcpyHostToDevice); 

注意,這實際上並不在data面積從A主機拷貝複製到設備複製。它只是使設備可訪問的區域data區域的大小與主機data區域相同。如果您還想複製data區域,則需要使用另一個cudaMemcpy操作,使用h_a->datad_data

+0

非常感謝!這實際上解決了我的問題! – Saph 2013-05-15 07:48:14