cudaMalloc
メモリ割り当ては、GPU で最も時間のかかる操作の 1 つであるため、次のコードを使用して 1 回呼び出して 2 つの配列を割り当てたいと考えました。
int numElements = 50000;
size_t size = numElements * sizeof(float);
//declarations-initializations
float *d_M = NULL;
err = cudaMalloc((void **)&d_M, 2*size);
//error checking
// Allocate the device input vector A
float *d_A = d_M;
// Allocate the device input vector B
float *d_B = d_M + size;
err = cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
//error checking
err = cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
//error checking
元のコードは、cuda ツールキットの vectorAdd.cu という名前のサンプル フォルダー内にあるため、h_A、h_B が適切に開始され、変更を加えなくてもコードが機能すると想定できます。
その結果、2 番目の cudaMemcpy が無効な引数というメッセージでエラーを返しました。
デバイスメモリの動作が異なるため、操作「d_M +サイズ」は誰かが期待するものを返さないようですが、方法はわかりません。
私のアプローチ (cudaMalloc を 1 回呼び出して 2 つの配列にメモリを割り当てる) を機能させることは可能ですか? これが良いアプローチであるかどうかについてのコメント/回答も大歓迎です。
更新Robertとdreamcrash
の回答が示唆したように、バイト数であるサイズではなく、要素数(numElements)をポインターd_Mに追加する必要がありました。参考までに、目に見えるスピードアップはありませんでした。