ダウンロード サンプルファイル (4.3 MB)
並列情報の取得
OpenMPを使用するプログラミングをする際に、あるプログラムがOpenMPによって並列処理されるか否かが判定できると便利です。例えば、並列処理を意図していない関数が呼ばれたらアサートする、並列処理でも逐次処理でも最適な処理をする関数を作る、などさまざまな利用法が考えられます。omp_in_parallel関数を使用するとそれが可能となります。
#include <stdio.h>
#include <omp.h>
void func(void)
{
printf( "この関数はparallelリージョン内にあるか?:%s\n",
omp_in_parallel() != 0 ? "YES" : "NO" );
}
int main(void)
{
printf( "このコードはparallelリージョン内にあるか?:%s\n",
omp_in_parallel() != 0 ? "YES" : "NO" );
func();
#pragma omp parallel
{
#pragma omp single
{
printf( "このコードはparallelリージョン内にあるか?:%s\n",
omp_in_parallel() != 0 ? "YES" : "NO" );
func();
}
}
printf( "このコードはparallelリージョン内にあるか?:%s\n",
omp_in_parallel() != 0 ? "YES" : "NO" );
func();
printf( "\n" );
return 0;
}

omp_in_parallel関数の使用法は簡単です。0以外の値が返ってくれば、関数と同じスコープにあるコードは並列処理されます。なお、OpenMPによって並列化される範囲をリージョンと呼びます。
処理時間の取得
並列処理でプログラミングする動機としては、パフォーマンスを向上させるためである場合が多いでしょう。その時、処理時間が計測できれば便利です。そのための関数がomp_get_wtimeです。使い方は簡単で、掲載するサンプルを見ればすぐに分かると思います。
#include <omp.h>
#include <stdio.h>
#include <windows.h>
int main()
{
double start, end;
start = omp_get_wtime();
Sleep(1000);
end = omp_get_wtime();
printf ( "開始時間:%.10g\n", start );
printf ( "終了時間:%.10g\n", end );
printf ( "処理時間:%.10g秒\n", end - start );
}

標準のC言語ライブラリを使用しない理由は、標準ライブラリは並列処理を意図して作られたものではないため、正確に計測できないことが多いからです。並列処理で処理時間を計測したい場合はomp_get_wtimeを使用しましょう。
以上で実行時ライブラリの説明は終わりです。次項は並列ループについての解説をします。
- 修正履歴
-
- 2010/02/01 10:44 サンプルファイルと、omp_for_testの実行結果画面を差し替えました。
この記事は参考になりましたか?
- 基礎から学ぶOpenMP連載記事一覧
-
- OpenMPにおける変数の扱いと並列リダクション
- OpenMPのメモリモデルとfork-joinモデル
- OpenMPの実行時ライブラリと並列ループ
- この記事の著者
-
インドリ(インドリ)
分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
