web-dev-qa-db-ja.com

OpenCL:ワークグループのコンセプト

OpenCLのワークグループの目的がよくわかりません。

私はそれらが並列に実行されるワークアイテム(おそらくハードウェアスレッド)のグループであることを理解しています。

しかし、なぜより細かい細分割が必要なのですか?スレッドのグリッドのみ(およびデファクト、1つのW-Gのみ)があっても問題ないでしょうか?

ワークグループは物理コアに正確にマッピングする必要がありますか?たとえば、TESLA c1060カードには240コアがあると言われています。ワークグループはこれにどのようにマッピングしますか?

また、私が理解している限り、メモリフェンスのおかげで、ワークグループ内のワークアイテムを同期できます。ワークグループは同期できますか、それとも必要ですか?彼らは共有メモリを介して互いに話し合っているのですか、それともワークアイテム専用ですか(これについてはわかりません)?

24
carmellose

ここでの混乱の一部は、用語に帰着すると思います。 GPUの人々がしばしばコアと呼んでいるものは実際にはそうではなく、GPUの人々がしばしばスレッドと呼んでいるものはある意味でのみです。

コアコア、GPUマーケティング用語では、CPUコアのようなものを指す場合もあれば、SIMDユニットの単一のレーンを指す場合もあります-事実上、単一のコアx86 CPUはこの4つのコアになりますシンプルなタイプ。これが、GPUコア数が非常に多くなる可能性がある理由です。これは実際には公平な比較ではありません。より直接的に比較可能なコア数を取得するには、16、32、または同様の数で除算する必要があります。

Work-items OpenCLの各作業項目は、制御フローとそのメモリモデルの点でスレッドです。ハードウェアは単一のスレッドで複数の作業項目を実行する可能性があり、SSEベクトルの別々のレーンで動作する4つのOpenCL作業項目を想像することでこれを簡単に想像できます。これは単にコンパイラーです。 OpenCL 2.0は、実際には、この基になるハードウェアスレッドの概念をサブグループを通じて公開しているため、処理する階層のレベルがもう1つあります。

Work-groups各ワークグループには、障壁の存在下で進歩することができなければならない一連のワークアイテムが含まれています。実際には、これはセットであり、そのすべての状態が同時に存在できるため、同期プリミティブに遭遇したときに、それらを切り替えるオーバーヘッドがほとんどなく、切り替えが可能であることが保証されます。

ワークグループは単一のコンピューティングユニットにマッピングする必要があります。これは、CPUグループがコアと呼ぶ単一のエンティティにワークグループ全体が適合することを意味します-CUDAはそれをマルチプロセッサ(世代によって異なります)、AMDコンピューティングユニットと呼びますと他の人は異なる名前を持っています。この実行の局所性は、より効率的な同期につながりますが、作業項目のセットがローカルに構築されたメモリユニットにアクセスできることも意味します。それらは頻繁に通信することが期待されます、またはバリアは使用されません、そしてこの通信を効率的にするためにローカルキャッシュ(CPU L1に類似)またはスクラッチパッドメモリ(OpenCLのローカルメモリ)があるかもしれません。

バリアが使用されている限り、ワークグループは内部的に、ワークアイテム間で、ローカルメモリを使用して、またはグローバルメモリを使用して同期できます。ワークグループは相互に同期できず、標準はワークグループの相互の進行を保証しないため、ポータブルロックおよび同期プリミティブを構築することは事実上不可能です。

これの多くは、デザインというよりは歴史によるものです。 GPUハードウェアは長い間、ベクトルスレッドを構築し、三角形を最適に処理する方法で実行ユニットに割り当てるように設計されてきました。 OpenCLは、そのハードウェアを他のものに役立つように一般化することはできませんが、実装するのが非効率になるほどには一般化しません。

27
Lee

OpenCLの用語をさらに理解するために、すでに多くの良い答えがあります この論文 は、実際にはすべての概念を非常によく説明しています。

6
chutsu

ワークグループの利点の1つは、共有ローカルメモリをプログラマ定義のキャッシュとして使用できることです。グローバルメモリから読み取られた値は、共有ワークグループローカルメモリに格納され、ワー​​クグループ内の任意のワークアイテムからすばやくアクセスできます。良い例は人生のゲームです。各細胞はそれ自身とその周りの8に依存しています。各ワークアイテムがこの情報を読み取る場合、9xのグローバルメモリ読み取りがあります。ワークグループと共有ローカルメモリを使用することで、1倍のグローバルメモリ読み取りにアプローチできます(エッジに冗長な読み取りがあるため、アプローチのみ)。

4
Dithermaster

ワークグループを使用すると、カーネルコンパイラをさらに最適化できます。これは、データがワークグループ間で転送されないためです。使用するOpenCLデバイスによっては、ローカル変数に使用できるキャッシュがあり、データアクセスを高速化できます。ワークグループが1つしかない場合、ローカル変数はグローバル変数とまったく同じになるため、データアクセスが遅くなります。

また、通常OpenCLデバイスは、単一命令複数データ(SIMD)拡張を使用して、優れた並列処理を実現します。 SIMD拡張と並行して1つのワークグループを実行できます。

 Should a Work-Group exactly map to a physical core ?

最速のワークグループサイズを見つける唯一の方法は、さまざまなワークグループサイズを試すことだと思います。 clGetKernelWorkGroupInfo を使用して、デバイスからCL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLEをクエリすることもできます。最速のサイズはその倍数である必要があります。

 Can work-groups synchronize or is that even needed ?

ワークグループ 同期できません 。この方法では、それらの間にデータの依存関係はなく、それらを実行する最速の方法であると考えられる場合、それらを順次実行することもできます。同じ結果を得るには、ワークグループ間の同期よりも、カーネルを複数のカーネルに分割する必要があります。変数は、バッファを使用してカーネル間で転送できます。

4
maZZZu