ダウンロード サンプルファイル (168.9 KB)
並列実行されるコードについて
前節のサンプルプログラムでプラグマを指定してコードを並列実行させました。ここで問題なのは、どのコードが並列的に実行されるかです。それは次のサンプルプログラムを実行すれば確認できます。
#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/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
