C コンパイラでは、明示的な並列化用の従来のプラグマを使用することができます。これらのプラグマについては、『C ユーザーズガイド』を参照してください。Fortran の指令の場合と同様に、これらは一例です。
従来の並列化プラグマは、次のとおりです。
表 B–5 C の並列化プラグマを OpenMP に変換する
従来の C プラグマ |
相当する OpenMP プラグマ |
---|---|
#pragma MP taskloop [clauses] |
#pragma omp parallel for [clauses] |
#pragma MP serial_loop |
完全に相当する句はありません。次で代用することができます。 #pragma omp master loop |
#pragma MP serial_loop_nested |
完全に相当する句はありません。次で代用することができます。 #pragma omp master loopnest |
taskloop プラグマでは、次の節を指定できます。
表 B–6 taskloop の節とそれに相当する OpenMP の節
taskloop の節 |
OpenMP の parallel for に相当する節 |
---|---|
maxcpus(n) |
完全に相当する句はありません。num_threads(n) を使用します。 |
private(v1,v2,...) |
private(v1,v2,...) |
shared(v1,v2,...) |
shared(v1,v2,...) |
readonly(v1,v2,...) |
完全に相当する句はありません。firstprivate(v1,v2,...) を使用して同じ効果を得ることができます。 |
storeback(v1,v2,...) |
lastprivate(v1,v2,...) を使用して同じ効果を得ることができます。 |
savelast |
完全に相当する句はありません。lastprivate(v1,v2,...) を使用して同じ効果を得ることができます。 |
reduction(v1,v2,...) |
reduction(operator:v1,v2,...) 縮約演算子および変数リストを指定する必要があります。 |
schedtype(spec) |
schedule(spec) (表 B–7 を参照) |
schedtype(spec) 節では、次のスケジュール指定を使用することができます。
表 B–7 SCHEDTYPE のスケジュール指定とそれに相当する OpenMP の schedule
schedtype(spec) |
OpenMP の schedule(spec) 節 |
---|---|
SCHEDTYPE(STATIC) |
schedule(static) |
SCHEDTYPE(SELF(chunksize)) |
schedule(dynamic,chunksize) 注: デフォルトの chunksize の値は 1 です。 |
SCHEDTYPE(FACTORING(m)) |
完全に相当する句はありません。 |
SCHEDTYPE(GSS(m)) |
schedule(guided, m) デフォルトの m の値は 1 です。 |
OpenMP では、並列構文内で宣言された変数のスコープは private になります。#pragma omp parallel for 指令で default(none) 節を使用すると、コンパイラで変数のスコープが明示的に指定されません。
serial_loop 指令がないため、自動と明示的な OpenMP の並列化を混在させると異なる結果になることがあります。従来の C の指令では並列化されていなかったループが、自動的に並列化されることがあります。
OpenMP の方が並列化モデルが豊富なため、従来の C の指令を使用するプログラムの並列化戦略を再設計し、OpenMP の機能を利用することで、多くの場合はパフォーマンスを向上できます。