ポイント
- #pragma { } でブロックを指定する
- ブロック内が複数のスレッドで並列処理される
- プロセスは,マスタスレッドと複数のスレーブスレッドから構成される
- ブロックの出口で スレーブスレッド間で barrier 同期が掛る
(nowaitを指定すると, barrier同期を行わないブロックも作れる)
- スレッド間では メモリ領域は共有される
- 各スレッドは,独立したスタックを持つ
- スレッド場の変数の属性を指定できる
- private スレッド上のスレッドローカルな変数.初期値は不定
- firstprivate private と同じだが,スレッド起動時にマスタから値をコピーする
- lastprivate private と同じだが,スレッド終了時にマスタへ値をコピーする
- reduction リダクション演算用の属性を与える.lastprivateと同じだがスレッド終了時にある演算を適用する.たとえば
int sum=0; #pramga omp parallel for reduction(+:sum) for (i=0;i<100;i++) { sum = sum + i; }
の例だと,sum の値は各スレッドで並列に計算され,スレッド終了時マスタ側のsumにまとめて加算される.
openmp の for構文
#pragma omp parallel for for (i=0; i<N; i++){ }
#pragma omp parallel { #pragma omp for for (i=0; i<N; i++){ } }
openmp の single構文
#pragma omp parallel { #pragma omp for for (i=0; i<N; i++){ } #pragma omp single for (i=0; i<N; i++){ } }
intel コンパイラで openmp を使う際のコンパイラオプション
CXXFLAGS+=-xP -ipo -parallel -openmp -i-static LDFLAGS+=-static-libcxa -openmp -i-static