6

私は持っている:

  • cudaHostAlloc(..., cudaHostAllocMapped)またはを使用して正常に固定およびマップされたホスト メモリcudaHostRegister(..., cudaHostRegisterMapped)
  • デバイス ポインタは、 を使用して取得されていcudaHostGetDevicePointer(...)ます。

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

memcpy()質問:とにかくすべてがシステム メモリにあるので、これを続けるべきですか、それとも従来の CPU スタイルを使用するべきですか? ...またはそれらは同じですか(つまり、src と dest の両方が固定されている場合cudaMemcpy、ストレートにマップされますか)?memcpy

(以前はすべてがデバイスのグローバルメモリにあったため、私はまだこのcudaMemcpy方法を使用していますが、gmemサイズの制約により固定メモリに切り替えました)

4

2 に答える 2

3

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

を使用するcudaMemcpyと、コピーを実行する前に追加のストリーム同期が実行される可能性があります (これはプロファイラーで確認できますが、テストして確認してください)。

cudaMemcpyDefaultUVA システムでは、talonmies が彼の回答で述べているように使用できます。ただし、UVA (sm_20+ および 64 ビット OS) がない場合は、正しいコピー (例: cudaMemcpyDeviceToDevice) を呼び出す必要があります。あなたcudaHostRegister()が興味を持っているすべてcudaMemcpyDeviceToDeviceの場合、メモリがどこにあるかに応じて、次のことを行うことになります:

  • ホスト <-> ホスト: CPU (memcpy) によって実行されます。
  • ホスト <-> デバイス: DMA (デバイス コピー エンジン)
  • デバイス <-> デバイス: Memcpy CUDA カーネル (SM 上で実行され、ドライバーによって起動されます)
于 2012-09-18T10:44:12.757 に答える
2

UVA (統合仮想アドレス) を使用するプラットフォームで作業している場合は、 with を使用することを強くお勧めcudaMemcpycudaMemcpyDefaultます。そうすれば、最速パスに関するこのすべての手作業は、心配する必要のない内部 API 実装の詳細になります。

于 2012-09-17T08:08:38.923 に答える