バリア (計算機科学)

並列コンピューティングにおけるバリア: barrier)とは、スレッド間やプロセス間の同期方法の一つ。まず、ソースコード中にバリアという場所を設定する。そこを通る複数のスレッドプロセスが在る場合、その全てのスレッドやプロセスのプログラムカウンタがそこへ到達するまで待ち続ける仕組みである。

並列計算のライブラリや、命令による並列言語では、暗黙のうちにバリアが使用されることが多い。たとえばOpenMPを使用したFORTRANにおける並列のdoループは、ループ処理の最後の繰り返しが完了するまで次に進まない。これは、プログラムがループの結果に依存しているという例である。メッセージ・パッシングでは、大域的な通信(reductionやscatter)が、暗黙のバリアとなっている場合がある。

CUDA C/C++OpenCL C/C++、HLSLGLSLのようなGPGPU向けの並列プログラミング言語にも、GPU上で動作するスレッド同期のための組み込みのバリア関数が用意されている[1][2][3][4]。デバイスコードやコンピュートシェーダーを記述する際に利用される。並列処理する個々の入出力データ間に依存性がなく、すべてのスレッドが完全に独立して動作できる場合は明示的なバリアは不要だが、スレッドグループの共有メモリ(OpenCLの場合はローカルメモリと呼ばれる)に途中の演算結果を一時的に格納してスレッド間でデータを交換・利用する場合には明示的なバリアによる同期が必要となる。

脚注

関連項目