OpenMP 特集に向けて

同カテゴリーの次の記事

OMP Abort エラーが発生した場合の対処方法

今回は OpenMP に関する記事を特集しています。

OpenMP は最初の仕様書 1.0 が公開された後、2.0、2.5、3.0 とバージョンアップを重ね、現在は 2011年 7月に公開された 3.1 仕様が最新となっています。

仕様ごとに機能強化が行われているため、皆さんが利用するコンパイラーが OpenMP のどの仕様をサポートしているか知っておく必要があります。C/C++ および Fortran とも _OPENMP マクロを利用することで OpenMP 仕様のバージョンを知ることができ、このマクロは、プリプロセッサーとコンパイラー両方で条件付きコンパイルに利用できます。

_OPENMP マクロは、OpenMP 仕様がリリースされた年月を YYYYMM 形式の数値で返します。各 OpenMP 仕様が返す値は次のようになります。バージョン 2.5 以前は C/C++ と FORTRAN でマクロが返す値は異なりますが、2.5 からは統一されています。

仕様 言語 インテル® コンパイラーのバージョン
1.0 FORTRAN 199710 5.x
1.1 FORTRAN 199911 6.x
1.0 C/C++ 199811 6.x
2.0 FORTRAN 200011 7.x, 8.x
2.0 C/C++ 200203 7.x, 8.x
2.5 C/C++、FORTRAN 200505 9.x, 10.x
3.0 C/C++、FORTRAN 200805 11.x, 12.0
3.1 C/C++、FORTRAN 201107 12.1

例えば C 言語の場合、printf(“OpenMP version %d\n”, _OPENMP) でコンパイラーがサポートする仕様がリリースされた年月を表示できます。

OpenMP は幾つかの API をサポートしていますが、#pragma omp parallel や c$OMP PARALLEL 指示句は、コンパイラーに OpenMP 指示句の解釈を指示するオプション(-openmp)を指定しなければ無視されますが、API はリンク時にエラーとなります。

_OPENMP マクロを利用することで、次のような条件付きコンパイルが可能です。

#ifdef _OPENMP
     int thread_num = omp_get_thread_num();
#endif
また、仕様が異なる指示句の切り分けにも利用できます。例えば、C/C++ の OpenMP 2.0 では for 指示句を利用する for ループのループインデックスは、符号付き整数でなければいけませんが、3.0 ではそれ以外(符号なし整数やポインターなど)の幾つかのパターンが許されます。
#if (_OPENMP >= 200805)
     #pragma omp parallel for
     for( int *i = ptr; i < (i + MAX); i++)
          *i = 0;
#else if (_OPENMP < 200805)
     #pragma omp parallel for
     for( int i = 0; i < MAX; i++)
          a[i] = 0;
#endif
Visual C++ 2005 以降 2010 までは、OpenMP 2.0 の使用をサポートしていますので、Visual C++ を利用する場合 OpenMP 2.0 の仕様の範囲で並列構文を記述しなければいけません。GCC の場合は、4.2 以降 OpenMP を正式サポートしていますので、利用する GCC のバージョンでどの OpenMP 仕様が利用できるか、_OPENMP マクロで値を取得して確かめてください。

では、OpenMP 特集を活用ください。

OpenMP 特集記事

関連記事

  • マルチスレッド開発ガイド: 1.6 スレッドの代替としてのタスクの使用マルチスレッド開発ガイド: 1.6 スレッドの代替としてのタスクの使用 タスクはスレッドよりも軽量であり、より迅速なスタートアップとシャットダウン、より優れたロード・バランシング、利用可能なリソースの効率的な利用、より高いレベルの抽象化を実現します。 タスクベースのプログラミングを含むプログラミング・モデルとして、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) と […]
  • OpenMP* を使用中に変数アクセスでスレッドがクラッシュしないようにするOpenMP* を使用中に変数アクセスでスレッドがクラッシュしないようにする この記事は、インテル® デベロッパー・ゾーンに掲載されている「Stop Threads from Clashing Over Variables in OpenMP」の日本語参考訳です。 OpenMP* を使用して、複数のスレッドにコードブロックの複製 (ループや単純なブロック) […]
  • マルチスレッド開発ガイド: 4.6 インテル® Parallel Composer を利用して並列コードを開発するマルチスレッド開発ガイド: 4.6 インテル® Parallel Composer を利用して並列コードを開発する コードの並列化にはさまざまな手法があります。この記事では、インテル® Parallel Composer で利用可能な手法の概要を説明し、各手法の主な長所を比較します。インテル® Parallel Composer は Windows* 上の C/C++ を使用した開発のみを対象としていますが、これらの手法の多くは Fortran や […]
  • インテル® C++/Fortran コンパイラーによる OpenMP* 3.1 仕様のサポートインテル® C++/Fortran コンパイラーによる OpenMP* 3.1 仕様のサポート この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Intel® C++ and Fortran Compilers now support the OpenMP* 3.1 Specification」の日本語参考訳です。 2011 年 7 月に OpenMP* 3.1 仕様 (英語) […]
  • OpenMP* 実行環境関数OpenMP* 実行環境関数 この記事は、インテル® デベロッパー・ゾーンに掲載されている「OpenMP Execution Environment Functions」の日本語参考訳です。 OpenMP* 仕様には、omp.h ヘッダーファイルで宣言されたいくつかのランタイム関数が含まれています。これらのランタイム関数により、OpenMP* […]