1. ホーム
  2. cuda

[解決済み] Cudamemcpy関数の使用法

2022-01-29 14:31:26

質問

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

解決方法は?

ホストとデバイス間でデータをコピーする際に、2重の下付き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);

もし、動的な大きさの(つまりコンパイル時にはわからない)二重添字配列を本当に扱いたいのであれば、次のように見直すことができます。 質問/回答 .