4

この場合、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);

これは 2 次元配列を 1 次元配列にうまくコピーできますか?

また、別の 2 次元配列にコピーするにはどうすればよいですか? これを変更できますか?

float **imagen_cuda;
4

1 に答える 1

4

ホストとデバイス間でデータをコピーするときに、二重添字付きの C 配列を処理するのは簡単ではありません。ほとんどの場合cudaMemcpy(を含むcudaMemcpy2D)、ポインターからポインターではなく、ソースと宛先の通常のポインターが必要です。

最も簡単な方法 (私が思うに) は、ホストとデバイスの両方で 2D 配列を「平坦化」し、インデックス演算を使用して 2D 座標をシミュレートすることです。

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

動的にサイズ変更された (つまり、コンパイル時に不明な) 二重添字付き配列を本当に処理したい場合は、この質問/回答を確認できます。

于 2013-05-17T19:44:28.283 に答える