インテルのワークキューイング・モデルの概要

インテル® コンパイラーによって実装されるワークキューイング・モデルは、OpenMP* を拡張して、より広範囲のアプリケーションを並列化します。

ワークキューイング・モデル

不規則なパターンの動的なデータ構造体、または再帰など複雑な制御構造体を持つプログラムでは、効率的に並列化するのは困難です。ワークキューイング・モデルを使用すると、OpenMP では不可能な不規則なパラレル化が使用できるようになります。このモデルは、コンパイラー (厳密には、OpenMP パラレライザー) の一部としてインストールされます。

ワークキューイング・モデルでは、OpenMP モデルにサポートされる制御構造の範囲を超えた制御構造を並列化できます。同時に OpenMP で定義されるフレームワークに合うようにします。特に、ワークキューイング・モデルは、ワークシェアリング構造の開始時に作業単位が事前計算されないように指定する柔軟性のあるメカニズムです。singlefor および sections 構造では、構造が実行を開始する時点で、実行可能なすべての作業単位が判明しています。ワークキューイング・プラグマ taskqtask は、環境 (taskq) と作業単位 (task) を別々に指定することによって、この制限を緩和します。

多くの制御構造体は、異なる作業反復と作業生成のパターンを表しているため、ワークキューイング・モデルで並列化可能です。一般的なケースは、C++ 反復子、while ループ、および再帰関数です。

taskq プラグマは、囲まれた作業 (タスク) 単位が実行される環境を指定します。最初に、taskq プラグマを実行するすべてのスレッド間の中から、1 つのスレッドが選択されます。概念的には、taskq プラグマにより選択されたスレッドで空のキューが生成され、次に、taskq ブロック内のコードがシングルスレッド・モードで実行されます。

他のすべてのスレッドは、この概念キューに作業がキューイングされるのを待ちます。task プラグマは、潜在的に異なるスレッドで実行される作業単位を指定します。taskq ブロック内に task プラグマが存在すると、task ブロックの内側のコードは、taskq に関連付けられている概念キューにキューイングされます。キューイングされたすべての作業が終了し、taskq ブロックの最後に達すると、概念キューはなくなります。

シーケンシャルなセマンティクスを保持するために、taskq 完了時に暗黙的なバリアがあります。タスクブロック間、あるいはタスクブロックのコードと、タスクブロック外の taskq ブロックのコード間で、依存性が存在しないこと、または適切に同期されることを確認する必要があります。

詳細は、「ワークキューイング構造」を参照してください。