3

ワープ内の多くのスレッドがグローバルメモリ内のアドレスを読み取りたい場合、このデータはブロードキャストされますね。

ワープ内の多くのスレッドがグローバルメモリ内のアドレスに書き込みたい場合、シリアル化がありますが、順序を予測することはできませんね。

しかし、最初の質問:異なるワープ、異なるブロックの多くのスレッドがグローバルメモリのアドレスに書き込みたい場合はどうでしょうか。GPUは何をするつもりですか?このアドレスへのすべてのアクセスをシリアル化しますか?データの一貫性の保証はありますか?

Hyper-Qを使用すると、カーネルを含む多くのストリームを起動できます。メモリ内に位置があり、さまざまなカーネルの多数のスレッドがこのアドレスを書き込みまたは読み取りたい場合、GPUは何をしますか?異なるカーネルからのすべてのスレッドのアクセスをシリアル化しますか、それともGPUは何もせず、いくつかの不整合が発生しますか?複数のカーネルが同じアドレスに対して読み取り/書き込みを行っている場合、データの一貫性が保証されますか?

4

1 に答える 1

10

質問ごとに 1 つの質問をすることをお勧めします。

ワープ内の多くのスレッドがグローバル メモリ内のアドレスを読み取りたい場合、このデータはブロードキャストされますよね?

はい、これは Fermi (CC2.0) 以降に当てはまります。

ワープ内の多くのスレッドがグローバル メモリ内のアドレスに書き込みたい場合、シリアル化がありますが、順序を予測することはできません。そうですか?

正しい。順番は未定です。

異なるブロック内の異なるワープ内の多くのスレッドが、グローバル メモリ内のアドレスに書き込みたい場合は? GPUはどうする?このアドレスへのすべてのアクセスをシリアル化しますか?

アクセスが同時の場合、シリアル化されます。繰り返しますが、順序は定義されていません。

データの一貫性の保証はありますか?

データの一貫性が何を意味するのかわかりません。とにかく、同時書き込みをシリアル化する以外に、GPU に何ができるでしょうか? 明らかな代替案がないように見えるので、これが非常に難しい概念であることに驚いています。

メモリ内に位置があり、異なるカーネルの多数のスレッドがこのアドレスを読み書きしたい場合、GPU はどうしますか? 異なるカーネルからのすべてのスレッドのアクセスをシリアル化しますか、それとも GPU が何もせず、いくつかの矛盾が発生しますか? 複数のカーネルが同じアドレスに読み書きしている場合、データの一貫性は保証されますか?

グローバル メモリへの同時書き込みの発生源が何であるかは、同じワープからであるか、異なるブロックでの異なるカーネルでの異なるワープからであるかは問題ではありません。同時書き込みは未定義の順序でシリアル化されます。繰り返しますが、「データの一貫性」について、それが何を意味するのか知りたいです。読み取り書き込みを同時に行うと、未定義の動作も発生します。読み取りは、メモリ位置の初期値または書き込まれた値のいずれかを含む値を返す場合があります。

GPU メモリ ロケーションへの同時書き込みの最終結果は未定義です。すべての同時書き込みが同じ値を書き込んでいる場合、その場所の最終的な値はそれを反映します。それ以外の場合、最終的な値は、書き込まれた値の 1 つを反映します。どの値が定義されていません。それを超えて、あなたの質問や発言のほとんどは私には意味がありません. (データの一貫性とはどういう意味ですか?) このようなプログラミングの動作から合理的なものを期待するべきではありません。GPU は、グローバルに同期するマシンではなく、分散型の独立した作業マシンとしてプログラムする必要があります。「未定義」は、入力データが同一で​​あっても、カーネルの実行ごとに結果が異なる可能性があることも意味することに注意してください。

異なるブロック (同じまたは異なるカーネルからのもの) からのグローバル メモリの同時またはほぼ同時の読み取りと書き込みは、SM 間に介在する独立した非コヒーレント L1 キャッシュ (ここで、スレッドブロックが実行されます) と L2 キャッシュ (デバイス全体のため、一貫性があります)。グローバル メモリを手段として使用してスレッドブロック間で同期動作を作成しようとする試みは、せいぜい困難であり、推奨されません。アルゴリズムを作り直して、作業を独立して構造化する方法を検討することをお勧めします。

于 2013-01-22T04:50:06.383 に答える