2016-10-03 4 views
0

にデバイスデータをコピー:私はデバイス行列の内容をコピーする必要があり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 
+1

試しましたか?私のために良いと思われる。 devicePointerはデバイスメモリを指していますが、それでもホスト上の変数です。** devicePointer + = numberOfColumnsを実行できます。 – leo

+0

「 '' devicePointer'はホスト機能で直接操作できません」という意味は?ポインタは、秘密と神秘的な性質を持つ魔法のユニコーンではありません。それらは、メモリ内のアドレスの値を保持するのに十分なビットを持つ符号なし整数です。それ以上のことはありません。もちろん、ホストコードで "操作する"ことができます。その値はホストメモリ空間内の有効なアドレスではないので、実行できないことはすべて参照解除されます。 – talonmies

+0

@talonmies私は混乱して申し訳ありません。今それは明らかです。私はちょうど私が今割り当てられたメモリを解放する方法を知りたいです。私がcudaFreeを使用すると、エラーが発生します。 – user3891236

答えて

2

まず、すべての必要なメモリをdevicePointerに割り当てる必要があります。しかし、それをいつも増やすことは、最も簡単なアイデアではないかもしれません。それから、最後に自由が壊れるからです。 nCowsのサイズがnColの行があるとします。そして、これは(私もしようとしませんでしたが、アイデアは、[OK]をする必要があり)正常に動作する必要があります

float* dPtr; 
cudaMalloc(&dPtr, nRows * nCols); 
for (int i=0; i< nRows; i++){ 
    cudaMemcpy(HostMatrix[i], dPtr + i * nCols, nCols * sizeof(float), cudaMemcpyDeviceToHost); 
} 
// do whatever you want 
cudaFree(dPtr); 

問題は、DPTRを増加し続ける場合は、最後にcudaFreeは唯一の「最後になるということです行 "それは間違っているので。

意味がありますか?

+0

はい、メモリの割り当て/割り当て解除にエラーは発生しませんでした。しかし、(ポインタをインクリメントしたように)引数としてベースアドレスを取得しなかったにもかかわらず、なぜcudaFreeが機能しましたか?あなたが言ったように最後の行にあります。 – user3891236

+0

私の場合は、cuda API cudamemcpyの外側にポインタをインクリメントしていました(自分の編集を参照)。あなたの場合はcudamemcpyの中にあります。なぜあなたのcudaFreeは働きましたが、私の利益はありませんでしたか?あなたのケースでは、ポインタの変更(増分)がcudaFreeに見えないと言いたいですか?もしそうなら、なぜですか? – user3891236

+0

@ user3891236:CUDAをさらに進める前に、C++プログラミングの基礎を学ぶ時間を費やす必要があると思います。この答えのどこにも、 'ptr'の値が' cudaMalloc'と 'cudaFree'呼び出しの間で変更されているところはありません。あなたがなぜタトゥーなのか分からないなら。私は誰もあなたを助けることができるとは思わない。 – talonmies

関連する問題