SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

基礎から学ぶOpenMP

OpenMPの基礎構文

基礎から学ぶOpenMP 第1回


並列実行されるコードについて

 前節のサンプルプログラムでプラグマを指定してコードを並列実行させました。ここで問題なのは、どのコードが並列的に実行されるかです。それは次のサンプルプログラムを実行すれば確認できます。

並列化されるコードを確認するプログラム
#include <stdio.h>
#include <omp.h>

int main()
{
    #pragma omp parallel
    printf("このコードは並列化されます。\n");
    printf("このコードはどうなる?\n");
    return 0;
}
実行結果
実行結果

 先ほどと同じ手順でビルドして実行して下さい。printf("このコードは並列化されます。\n");のコードが並列化され、printf("このコードはどうなる?\n");のコードが並列化されていないことが分かります。

 従って、parallelプラグマは定義された次の行のコードを並列化させることが分かります。次のコードといってもVC++2008の場合は、複数のプログラムを;で区切って一行にしても一番最初のコードだけ並列化されます。複数のコードを並列化したい場合はコードブロックを使用します。

複数のコードを並列化するプログラム
#include <stdio.h>
#include <omp.h>

int main()
{
    #pragma omp parallel 
    {
        printf("このコードは並列化されます。\n");
        printf("このコードはどうなる?\n");
    }
    return 0;
}
実行結果
実行結果

 先ほどのサンプルプログラムとは違い、2行のコードが並列化されているのが確認できます。なお、このプラグマをOpenMPでは指示文と呼び、今回試用した指示文を「parallel構文」と呼びます。

 parallel構文で生成されるスレッド数は、基本的にはCPUのコア数と同じです。従来のマルチスレッドプログラミングでは、スレッド数が固定されるのが普通でした。一応CPU数などの情報を取得して、自分でスレッド数を変化するプログラミングは可能であり、筆者もその様に実装したことがありますが、動的に生成したスレッドを管理するのは大変な作業でしたし、設計とデバッグが困難でした。

 それに比べると、OpenMPは自動的にスレッドを生成して管理してくれますので、大変効率よくスケーラブルな情報システムを開発できます。

 とはいえ、スレッド数が固定でないと実装できない状況もあり得ますので、次節でスレッド数をコントロールする方法を解説します。

次のページ
スレッド数のコントロールについて

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

基礎から学ぶOpenMP連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4693 2010/04/27 12:08

イベント

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

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

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

メールバックナンバー