次の例では、いくつかの OpenMP* 機能の使用方法を示します。
この例は、各繰り返しごとにワーク量が異なる単純な並列ループを示したものです。負荷のバランスを向上させるため、動的スケジュールを使用しています。
並列領域の最後に暗黙的な barrier があるため、END DO ディレクティブ に NOWAIT 節が含まれています。そのため、DO 領域の最後にバリアは必要ありません。
例 |
---|
|
例では、fork/join のオーバーヘッドを減らすために融合される 2 つの並列ループを使用します。2 番目のループで使用するすべてのデータは最初のループで使用されるすべてのデータと異なるため、最初の END DO ディレクティブには、NOWAIT 節が含まれています。
例 |
---|
|
この例では、SECTIONS ディレクティブの使用方法を示します。ロジックは前述の DO ディレクティブの例と同じですが、DO ディレクティブ の代わりに SECTIONS ディレクティブを使用します。ここでは、2 つの作業単位しかないため、スピードアップは、2 が限度です。前述の例では、作業単位は (n-1) + (m-1) です。
例 |
---|
|
この例では、共有配列 a の要素を更新する SINGLE 構造の使用方法を示します。最初のループの後にくるオプションの NOWAIT 節は取り除かれています。これは、競合状態を回避するため、SINGLE 構造に進む前にループの最後で待機する必要があるためです。
例 |
---|
|