1

2 つの GPU 間でデータを memcpy する必要はありませんでした。cudaMemcpy()今、私はcudaMemcpyDeviceToDeviceフラグでそれを行うつもりだと推測していますが、

  • フラグはcudaMemcpyDeviceToDevice 、単一デバイスのメモリ空間内とすべてのデバイスのメモリ空間間でデータをコピーするために使用されますか?

もしそれが、

  • 異なるデバイス上のメモリへのポインタはどのように区別されますか? Unified Virtual Address Spaceメカニズムの詳細を使用していますか?

そして、もしそうなら、

  • cudaMemcpy に H2D、D2H、D2D フラグがあるのはなぜですか? とにかく、どのデバイスに対処する必要があるかを確認する必要はありませんか?
  • cuGetPointerAttribute()CUDA 低レベル ドライバーを使用して cudaMemcpy のフラグのないバージョンを実装できませんか?
4

1 に答える 1

2

UVA が有効になっているデバイスの場合、説明したメカニズムを使用できます。 このドキュメントのセクションは興味深いかもしれません (デバイスからデバイスへの転送を説明するセクションと、UVA の影響に関する後続のセクションの両方)。それ以外の場合は、多少異なるセマンティクスを持つcudaMemcpyPeer() APIが利用可能です。

異なるデバイス上のメモリへのポインタはどのように区別されますか? Unified Virtual Address Spaceメカニズムの詳細を使用していますか?

はい、以前に参照したドキュメント セクションを参照してください。

cudaMemcpy に H2D、D2H、D2D フラグがあるのはなぜですか? とにかく、どのデバイスに対処する必要があるかを確認する必要はありませんか?

cudaMemcpyDefaultUVA が最初に登場したときに追加された転送フラグです。これにより、一般的にフラグが設定された転送を使用できるようになり、提供されたポインターの検査時にランタイムによって方向が推測されます。

CUDA 低レベル ドライバーから cuGetPointerAttribute() を使用して cudaMemcpy のフラグのないバージョンを実装できませんか?

上記の一般的にフラグが立てられた方法は、あなたのニーズをすべて満たすと思います(または、この質問を理解していない可能性があります)。

そのような議論は、「なぜ私はこれ以外のものを使用するのcudaMemcpyDefaultか? 」という疑問を生む可能性があります。

  1. 明示的なフラグを使用する考えられる理由の 1 つは、明示的なフラグを指定すると、ランタイム API が明示的なエラー チェックを実行することです。たとえば、 の特定の呼び出しcudaMemcpyが常に H2D 転送方向であることが確実な場合、明示的に を使用cudaMemcpyHostToDeviceすると、指定されたポインターが指定された方向と一致しない場合、ランタイム API がエラーをスローします。そのような概念に何らかの価値を置くかどうかは、おそらく意見の問題です。

  2. 明示的なフラグを使用する重要度の低い (IMO) コードは、利用可能な UVA に依存しませんが、そのような実行シナリオは、新しい環境では「消えて」います。

于 2016-02-01T12:13:30.523 に答える