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 特集記事

関連記事

  • 現在と将来の OpenMP* API 仕様現在と将来の OpenMP* API 仕様 この記事は、インテルの The Parallel Universe Magazine 27 号に収録されている、OpenMP* 5.0 の機能を初めて紹介した章を抜粋翻訳したものです。 OpenMP* API には 20 […]
  • マルチスレッド開発ガイド: 1.6 スレッドの代替としてのタスクの使用マルチスレッド開発ガイド: 1.6 スレッドの代替としてのタスクの使用 タスクはスレッドよりも軽量であり、より迅速なスタートアップとシャットダウン、より優れたロード・バランシング、利用可能なリソースの効率的な利用、より高いレベルの抽象化を実現します。 タスクベースのプログラミングを含むプログラミング・モデルとして、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) と […]
  • インテル Parallel Universe 27 号日本語版の公開インテル Parallel Universe 27 号日本語版の公開 インテル Parallel Universe マガジンの最新号が公開されました。この号では、20 周年を迎える OpenMP* について取り上げます。また、新しいインテル® AVX-512 命令セットにより以前は不可能だったベクトル化を行う方法について紹介します。新しいインテル® Advisor […]
  • OpenMP* を使用中に変数アクセスでスレッドがクラッシュしないようにするOpenMP* を使用中に変数アクセスでスレッドがクラッシュしないようにする この記事は、インテル® デベロッパー・ゾーンに掲載されている「Stop Threads from Clashing Over Variables in OpenMP」の日本語参考訳です。 OpenMP* を使用して、複数のスレッドにコードブロックの複製 (ループや単純なブロック) […]
  • インテル® 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 仕様 (英語) […]