B.2 従来の C プラグマの変換
C コンパイラでは、明示的な並列化用の従来のプラグマを使用することができます。これらのプラグマについては、『C ユーザーズガイド』を参照してください。Fortran の指令の場合と同様に、これらは一例です。
従来の並列化プラグマは、次のとおりです。
表 B-5 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 の節
|
|
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(STATIC) |
schedule(static) |
SCHEDTYPE(SELF(chunksize)) |
schedule(dynamic,chunksize)注:
デフォルトの chunksize の値は 1 です。 |
SCHEDTYPE(FACTORING(m)) |
完全に相当する句はありません。 |
SCHEDTYPE(GSS(m)) |
schedule(guided, m)デフォルトの m の値は 1 です。 |
|
B.2.1 従来の C のプラグマと OpenMP の変換の問題
-
OpenMP では、並列構文内で宣言された変数のスコープは private になります。#pragma omp parallel for 指令で default(none) 節を使用すると、コンパイラで変数のスコープが明示的に指定されません。
-
serial_loop 指令がないため、自動と明示的な OpenMP の並列化を混在させると異なる結果になることがあります。従来の C の指令では並列化されていなかったループが、自動的に並列化されることがあります。
-
OpenMP の方が並列化モデルが豊富なため、従来の C の指令を使用するプログラムの並列化戦略を再設計し、OpenMP の機能を利用することで、多くの場合はパフォーマンスを向上できます。