2

CUDA PTX ガイドでは、アトミックおよび非アトミック リダクションを実行する命令「atom」および「red」について説明しています。これは私にとってニュースです (少なくとも非アトミック リダクションに関しては)...少し前に SHFL でリダクションを行う方法を学んだことを覚えています。これらの命令は CUDA ランタイム API に反映またはラップされていますか? または、実際に PTX コードを記述せずに C++ コードでアクセスできる他の方法はありますか?

4

1 に答える 1

4

これらの命令は CUDA ランタイム API に反映またはラップされていますか? または、実際に PTX コードを記述せずに C++ コードでアクセスできる他の方法はありますか?

これらの命令のほとんどは、プログラミング ガイドで説明されているアトミック操作 (組み込み組み込み関数) に反映されています。これらのアトミック組み込み関数のいずれかをコンパイルすると、生成されたコードの PTX または SASS レベルでコンパイラによって発行された命令が見つかりatomます。red

命令タイプは、red通常、アトミック組み込み関数の 1 つからの戻り値を明示的に使用しない場合に使用されます。戻り値を明示的に使用すると、コンパイラは通常、atom命令を発行します。

したがって、この命令だけでは完全な従来の並列リダクションを実行できないことは明らかですが、リダクション操作をアトミック ハードウェア (および関連する制限) に依存させたい場合は、この命令を使用して並列リダクションを実装できます。これは一般に、並列リダクションの最速の実装ではありません。

これらの手順に直接アクセスしたい場合は、必要に応じてインライン PTXを使用することをお勧めします。

要求に応じatomicAdd()て、例として使用し て詳しく説明します。

私が次のことを実行した場合:

atomicAdd(&x, data);

おそらく、デバイス変数への典型的なアトミックベースのリダクションに使用しているためx、コンパイラーは必要な引数 (ポインターと変数、つまり 2 つの論理レジスター)を取るred( PTX ) またはRED( SASS ) 命令を発行します。xdata

私が次のことを実行した場合:

int offset = atomicAdd(&buffer_ptr, buffer_size);

おそらく、典型的な削減ではなくbuffer_size、グリッド内のさまざまなスレッド間で共有されるバッファーにスペース ( )を予約するために使用しているためbuffer_ptrです。atom( PTX ) またはATOM( SASS ) 命令を発行し、3 つの引数 ( offset&buffer_ptr、およびbuffer_size、レジスタ内) を含みます。

フォームはred、スレッド/ワープによって発行される可能性があり、通常は後続の命令に依存しないこの命令の問題により、通常は停止せずに続行する可能性があります。atomOTOHの形式は、その 3 つの引数の 1 つ (3 つの論理レジスタの 1 つ) の変更を意味します。したがって、そのレジスタ内のデータ (つまり、組み込みの戻り値、つまりoffsetこの場合) を後で使用すると、戻り値がアトミック ハードウェアによって実際に返されるまで、スレッド/ワープ ストールが発生する可能性があります。

于 2016-04-25T21:36:10.910 に答える