従来の Fortran プログラムでは、Sun または Cray 形式の並列化指令が使用されています。これらの指令の詳細については、『Fortran プログラミングガイド』の「並列化」に関する章を参照してください。
次の表は、Sun の並列化指令およびその従属句と、それに相当する OpenMP の指令の概要です。これらは、変換の一例です。
表 B–1 Sun の並列化指令を OpenMP の指令に変換する
Sun の指令 |
OpenMP の指令 |
---|---|
C$PAR DOALL [qualifiers] |
!$omp parallel do [qualifiers] |
C$PAR DOSERIAL |
完全に相当する句はありません。次で代用することができます。 !$omp master loop !$omp end master |
C$PAR DOSERIAL* |
完全に相当する句はありません。次で代用することができます。 !$omp master loopnest !$omp end master |
C$PAR TASKCOMMON block[,...] |
!$omp threadprivate (/block/[,...]) |
DOALL 指令では、次の修飾句を指定することができます。
表 B–2 DOALL 修飾句とそれに相当する OpenMP の句
Sun の DOALL 句 |
OpenMP の PARALLEL DO に相当する句 |
---|---|
PRIVATE(v1,v2,...) |
private(v1,v2,...) |
SHARED(v1,v2,...) |
shared(v1,v2,...) |
MAXCPUS(n) |
num_threads(n)。 完全に相当する句はありません。 |
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–3 を参照) |
SCHEDTYPE(spec) 句では、次のスケジュール指定を使用することができます。
表 B–3 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 では、非公開変数のスコープを明示的に宣言する必要があります。Sun の指令では、PRIVATE または SHARED 句で明示的にスコープが指定されていない変数の場合は、コンパイラは専用のデフォルトのスコープ規則を使用します。つまり、すべてのスカラーは PRIVATE、すべての配列参照は SHARED として処理されます。OpenMP では、 DEFAULT(PRIVATE) 句を PARALLEL DO 指令で使用されている場合を除き、デフォルトのデータスコープは SHARED です。DEFAULT(NONE) 句を使用すると、コンパイラで変数のスコープが明示的に指定されません。Fortran での自動スコープに関しては 「4.4 入れ子並列処理を使う際のヒント」を参照してください。
DOSERIAL 指令がないため、自動と明示的な OpenMP の並列化を混在させると異なる結果になることがあります。Sun の指令では並列化されていなかったループが、自動的に並列化されることがあります。
OpenMP では並列領域と並列セクションを用意しているため、並列化モデルが豊富です。したがって、Sun の指令を使用するプログラムの並列化戦略を再設計し、OpenMP の機能を利用するようにすることでパフォーマンスの向上を実現することができます。
Cray 形式の Fortran 並列化指令は、指令を示す標識が !MIC$ である点を除き、Sun 形式のものと同一です。また、!MIC$ DOALL の修飾句も異なります。
表 B–4 Cray 形式の DOALL 修飾句とそれに相当する Open MP の句
Cray の DOALL 句 |
OpenMP の PARALLEL DO に相当する句 |
---|---|
SHARED(v1,v2,...) |
SHARED(v1,v2,...) |
PRIVATE(v1,v2,...) |
PRIVATE(v1,v2,...) |
AUTOSCOPE |
相当する句はありません。スコープは必ず、明示的に指定するか、DEFAULT 句か __AUTO 句と共に指定します。 |
SAVELAST |
完全に相当する句はありません。lastprivate を使用して同じ効果を得ることができます。 |
MAXCPUS(n) |
num_threads(n)。 完全に相当する句はありません。 |
GUIDED |
schedule(guided, m) デフォルトの m の値は 1 です。 |
SINGLE |
schedule(dynamic,1) |
CHUNKSIZE(n) |
schedule(dynamic,n) |
NUMCHUNKS(m) |
schedule(dynamic,n/m) ここで、n には反復数を指定します。 |
両者の違いは、Cray の AUTOSCOPE に相当するものがない点を除き、Sun 形式の指令の場合と同様です。