この章では、Sun または Cray の指令およびプラグマを使用する従来のプログラムを OpenMP に変換するための指針を説明します。
従来の Sun および Cray の並列化指令は廃止予定で、Sun Studio コンパイラでサポートされなくなりました。
従来の 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 形式の指令の場合と同様です。
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 の機能を利用することで、多くの場合はパフォーマンスを向上できます。