UVA が有効になっているデバイスの場合、説明したメカニズムを使用できます。 このドキュメントのセクションは興味深いかもしれません (デバイスからデバイスへの転送を説明するセクションと、UVA の影響に関する後続のセクションの両方)。それ以外の場合は、多少異なるセマンティクスを持つcudaMemcpyPeer()
APIが利用可能です。
異なるデバイス上のメモリへのポインタはどのように区別されますか? Unified Virtual Address Spaceメカニズムの詳細を使用していますか?
はい、以前に参照したドキュメント セクションを参照してください。
cudaMemcpy に H2D、D2H、D2D フラグがあるのはなぜですか? とにかく、どのデバイスに対処する必要があるかを確認する必要はありませんか?
cudaMemcpyDefault
UVA が最初に登場したときに追加された転送フラグです。これにより、一般的にフラグが設定された転送を使用できるようになり、提供されたポインターの検査時にランタイムによって方向が推測されます。
CUDA 低レベル ドライバーから cuGetPointerAttribute() を使用して cudaMemcpy のフラグのないバージョンを実装できませんか?
上記の一般的にフラグが立てられた方法は、あなたのニーズをすべて満たすと思います(または、この質問を理解していない可能性があります)。
そのような議論は、「なぜ私はこれ以外のものを使用するのcudaMemcpyDefault
か? 」という疑問を生む可能性があります。
明示的なフラグを使用する考えられる理由の 1 つは、明示的なフラグを指定すると、ランタイム API が明示的なエラー チェックを実行することです。たとえば、 の特定の呼び出しcudaMemcpy
が常に H2D 転送方向であることが確実な場合、明示的に を使用cudaMemcpyHostToDevice
すると、指定されたポインターが指定された方向と一致しない場合、ランタイム API がエラーをスローします。そのような概念に何らかの価値を置くかどうかは、おそらく意見の問題です。
明示的なフラグを使用する重要度の低い (IMO) コードは、利用可能な UVA に依存しませんが、そのような実行シナリオは、新しい環境では「消えて」います。