並列情報の取得
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を使用しましょう。
以上で実行時ライブラリの説明は終わりです。次項は並列ループについての解説をします。