並列実行されるコードについて
前節のサンプルプログラムでプラグマを指定してコードを並列実行させました。ここで問題なのは、どのコードが並列的に実行されるかです。それは次のサンプルプログラムを実行すれば確認できます。
#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は自動的にスレッドを生成して管理してくれますので、大変効率よくスケーラブルな情報システムを開発できます。
とはいえ、スレッド数が固定でないと実装できない状況もあり得ますので、次節でスレッド数をコントロールする方法を解説します。
