2017-08-29 5 views
0

ptrが1にデバイスを設定した場合、およびホストするために、デバイスから「host_ptr」に「PTR」をコピーする前に、mallocさ、私は再び1にデバイスを設定しなければならないのですか?デバイスからホストへの 'cudaMemcpy'のときに、適切なデバイスを設定する必要がありますか?

cudaSetDevice(1); 
cudaMalloc(ptr, size); 

//do something here 
... 

cudaSetDevice(0); 

//do something here 
... 
//cudaSetDevice(1); #My qustion: is this line needed? 

cudaMemcpy(host_ptr, ptr, size, cudaMemcpyDeviceToHost); 
+1

私は両方をテストした@Shadow、すべてが働きました。だから私は混乱している –

答えて

2

あなたがunified virtual addressingをサポートするプラットフォーム上で実行している場合は、すべてのデバイス上のすべての割り当ては、単一のアドレス空間にマッピングされ、そしてAPIは、指定されたアドレスが常駐どの物理デバイスを認識しています。その結果、cudaMemcpyDeviceToHostは、明示的にデバイスを選択する必要なく、このポインタ解決のため正しく動作するように見えます。

私は再び1にデバイスを設定しなければならないのですか?

理論的には、そうあなたがする必要があります。あなたは暗黙のうちに(まだ)すべてのプラットフォームで必ずしもサポートされていないものに頼っています。あるいは、統一されたメモリを完全に取り込み、cudaMemcpyDefaultを使用して、APIで詳細を処理させる必要があります。しかし、統合メモリを採用することは、コードが一部のシステムでは動作しないことを意味します。あなたの目標はあなたが書いているコードに依存します。

関連する問題