3

CUDA プログラミング ガイドでは、マップされた固定ホスト メモリでのアトミック操作は、「ホストまたは他のデバイスの観点からはアトミックではない」と述べられています。この文から得られるのは、ホスト メモリ領域が 1 つの GPU によってのみアクセスされる場合、マップされた固定ホスト メモリで (複数の同時カーネル内からでも) アトミックを実行しても問題ないということです。

一方、Nicholas WiltによるCUDA ハンドブックの128 ページには、次のように記載されています。

ホスト (ロックされた比較交換) またはデバイス ( ) のいずれに対しても、マップされた固定ホスト メモリでアトミックを使用しようとしないでくださいatomicAdd()。CPU 側では、ロックされた操作の相互排除を強制する機能は、PCI Express バス上の周辺機器には見えません。逆に、GPU 側では、アトミック操作は GPU のローカル メモリ コントローラーを使用して実装されるため、ローカル デバイスのメモリ ロケーションでのみ機能します。

マップされた固定ホスト メモリでCUDA カーネル内からアトミックを実行しても安全ですか? アトミックの読み取り-変更-書き込みの原子性を維持するために、PCI-e バスに依存できますか?

4

2 に答える 2

5

この注意は、マップされた固定メモリを使用して、CPU と GPU 間、または複数の GPU 間で実行を調整するユーザーを対象としています。私がそれを書いたとき、CUDA は CPU と単一の GPU の間で実行を調整するための他の多くのより良い方法を提供するため、単一 GPU のケースでそのようなメカニズムを使用する人がいるとは思っていませんでした。

CPU と GPU の間に厳密な生産者/消費者の関係がある場合 (つまり、生産者がメモリの場所を更新し、消費者が受動的にそれを読み取る)、特定の状況下で動作することが期待できます。

GPU がプロデューサーの場合、CPU は GPU の L2 キャッシュからポストされたメモリ ロケーションの更新を確認します。ただし、GPU コードは、それを強制的に実行するためにメモリ バリアを実行する必要がある場合があります。また、そのコードが x86 で機能する場合でも、ARM はバス トラフィックをスヌープしないため、大胆な手段を講じないと ARM で機能しなくなる可能性があります。

CPU がプロデューサーの場合、GPU は L2 キャッシュをバイパスする必要があります。これは、CPU メモリと一貫性がないためです。

CPU と GPU が同じメモリ位置を同時に更新しようとしている場合、2 つの間の原子性を保証するメカニズムはありません。CPU アトミックを実行すると、更新が CPU コードに関してアトミックであることが保証され、GPU アトミックを実行すると、更新を実行している GPU に関して更新がアトミックであることが保証されます。

これまでの説明はすべて、GPU が 1 つしかないことを前提としています。複数の GPU が関係している場合、すべての賭けは無効になります。アトミックは PCI Express 3.0 バス仕様で提供されていますが、NVIDIA GPU でサポートされているとは思えません。また、基盤となるプラットフォームでのサポートも保証されていません。

マップされた固定メモリでアトミックを実行することによって開発者が達成しようとしているものは何でも、おそらくより高速で機能する可能性が高い、またはその両方の方法があるように思えます。

于 2014-04-22T17:19:16.867 に答える