2012-09-17 3 views
5

私が持っている:首尾よく固定とcudaHostAlloc(..., cudaHostAllocMapped)またはcudaHostRegister(..., cudaHostRegisterMapped)を使用してマッピングされていより良いまたは同じ:CPU memcpy()対CUDAの固定されたマップされたメモリのデバイスcudaMemcpy()

  • ホストメモリと、
  • cudaHostGetDevicePointer(...)を使用してデバイスポインタを取得しました。

上記の手法で得られた固定された+マップされたメモリの2つの異なる領域を指すsrcおよびdestデバイスポインタでcudaMemcpy(..., cudaMemcpyDeviceToDevice)を開始します。 すべて正常に動作します。

質問:私はこれをやり続けますか、従来のCPUスタイルのmemcpy()を使用してください。なぜなら、とにかくすべてがシステムメモリに入っているからですか? ...または同じですか(つまり、cudaMemcpyはsrcとdestの両方が固定されている場合はmemcpyにストレートにマッピングされますか)。

あなたはUVAとプラットフォーム上で作業している場合、統一(

+1

それは興味深い質問ですね。最適化されたmemcpyを使用すれば、おそらくCPUはおそらくより良いでしょう。メモリは結局それに属し、ディスクリートGPUのhost-> host memcpyはPCIe帯域幅に制限されています。しかし、GPUがそれ以外の場合はアイドル状態になるのはなぜですか? – ArchaeaSoftware

+0

私はGPUがコピーをやっていないことを願っています。私は、ランタイムが、ポインタが両方ともホストポインタであり、ホストmemcpyを呼び出すことを確認したいと思います。私は実際に何が起こるかを知るように頼んだ。 – harrism

答えて

3

cudaMemcpyとすると、CUDAドライバはホストポインタからホストポインタにコピーしていることを検出し、コピーはCPU上で実行されます。必要に応じて、もちろんmemcpyをCPU上で使用することもできます。

cudaMemcpyを使用している場合は、コピーを実行する前に余分なストリーム同期が実行されている可能性があります(プロファイラに表示される可能性がありますが、私は—のテストを見ています)。

UVAシステムでは、を使用することができます。しかし、UVA(sm_20 +および64ビットOS)をお持ちでない場合は、正しいコピー(cudaMemcpyDeviceToDevice)を呼び出す必要があります。もしあなたあなたはメモリが配置されているに応じて、次やってしまいますその後、cudaMemcpyDeviceToDeviceに興味があるcudaHostRegister()すべて:

  • ホストを< - >ホスト:CPUによって実行される(memcpyの)
  • ホスト< - >デバイス:DMA(デバイスのコピーエンジン)
  • デバイス< - >デバイス:(ドライバによって起動するSM上で実行、)memcpyのCUDAカーネル
+0

非常に興味深い、あなたは情報を見つけたいくつかのソースを持っていますか? –

+0

NVIDIAの同僚に実装の詳細を尋ねたと思います。 – harrism

2

(私は以前にすべてがデバイスグローバルメモリ内にあったので、まだcudaMemcpy方法を使用していますが、以来、サイズの制約をGMEMによる固定メモリに切り替えています)仮想アドレス指定)では、cudaMemcpycudaMemcpyDefaultとすることを強くお勧めします。このようにして、この最速パスに関するハンドリングは、あなたが心配する必要のない内部API実装の詳細になります。

+0

はい、いいえ、私はしばしばC1060で作業しますが、C2050/70にアクセスできます。だから、私のピン留めされた記憶問題についてはどうでしょうか?この場合、 'cudaMemcpyDefault'が何をしているのか知っていますか?それは質問にはかなり答えるだろう。 – schmichael

+0

私は動作しません.NVIDIAのために私はコードを見たことはありませんが、それはソースとデスティネーションのポインタを見てそれに応じて見えます。あなたはホストポインタとデバイスポインタを持つデバイスコピーへのデバイスコピーを持つホスト側のコピーを得るでしょう – talonmies

関連する問題