icc で openmp

ポイント

  • #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

環境変数

シェルの環境変数で,挙動を制御できる

変数名 デフォルト値 説明
OMP_SCHEDULE static the type of runtime scheduling
OMP_NUM_THREADS number of processors number of threads
OMP_DYNAMIC FALSE enables the dynamic adjustment of the number of threads
OMP_NESTED FALSE enables nested parallelism.

性能

アルゴリズムにも因るが,試しに手元のコードを openmpに対応させたら,あっさり250%ぐらい早くなった.Xeon 4CPUな環境なので,もう少し高速化できそう.