SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

基礎から学ぶOpenMP

OpenMPの実行時ライブラリと並列ループ

基礎から学ぶOpenMP 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

並列情報の取得

 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を使用しましょう。

 以上で実行時ライブラリの説明は終わりです。次項は並列ループについての解説をします。

次のページ
並列ループ

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
基礎から学ぶOpenMP連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4786 2010/04/27 12:09

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング