にデバイスデータをコピー:私はデバイス行列の内容をコピーする必要がありCUDA:私のように宣言されたHostMatrix有する2Dホストアレイ
float **HostMatrix
を、2次元のホストマトリックスHostMatrix
devicePointer
によって指さ
私はこの
for (int i=0; i<numberOfRows; i++){
cudaMemcpy(HostMatrix[i], devicePointer, numberOfColumns *sizeof(float),
cudaMemcpyDeviceToHost);
devicePointer += numberOfColumns;// so as to reach next row
}
を試してみました。しかし、私はホスト機能の内部でこれをやっているので、これは間違っているだろう、とdevicePointerは最後の行でやっているようにホスト機能で直接操作することはできません。
これを達成する正しい方法は何でしょうか?
編集
ああ、実際にこれが正常に動作します!しかし、問題は、my earlier question: CUDA: Invalid Device Pointer error when reallocating memoryで議論されているようにメモリの割り当てを解除する際に発生します。したがって、基本的には以下のようになります
for (int i=0; i<numberOfRows; i++){
cudaMemcpy(HostMatrix[i], devicePointer, numberOfColumns *sizeof(float),
cudaMemcpyDeviceToHost);
devicePointer += numberOfColumns;// so as to reach next row
}
cudaFree(devicePointer); //invalid device pointer
試しましたか?私のために良いと思われる。 devicePointerはデバイスメモリを指していますが、それでもホスト上の変数です。** devicePointer + = numberOfColumnsを実行できます。 – leo
「 '' devicePointer'はホスト機能で直接操作できません」という意味は?ポインタは、秘密と神秘的な性質を持つ魔法のユニコーンではありません。それらは、メモリ内のアドレスの値を保持するのに十分なビットを持つ符号なし整数です。それ以上のことはありません。もちろん、ホストコードで "操作する"ことができます。その値はホストメモリ空間内の有効なアドレスではないので、実行できないことはすべて参照解除されます。 – talonmies
@talonmies私は混乱して申し訳ありません。今それは明らかです。私はちょうど私が今割り当てられたメモリを解放する方法を知りたいです。私がcudaFreeを使用すると、エラーが発生します。 – user3891236