0

そのため、私はしばらくこの問題に悩まされてきました。私の構造体は次のようになります。

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);

ただし、私のカーネルでは、構造体からのデータに到達できず、配列と変数のみに到達します。

4

1 に答える 1

0

これは一般的な問題です。ホストで malloc 操作を行ったとき (h_a->data 用)、デバイスからアクセスできないホスト データを割り当てました。

この回答では、何が起こっているのか、それを修正する方法について詳しく説明しています。

あなたの場合、次のようなものが機能するはずです:

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->dataなりd_dataます。

于 2013-05-14T14:00:42.253 に答える