並列コンピューティング環境を利用するために用いられる標準化された基盤(API)です。場合gccはバージョン4.2からOpenMPに正式対応しました。付けてコンパイルします。ProからOpenMPがサポートされたことにより、手軽に並列処理のコードを書くことが可能になりました。Proでの設定方法を示します。-openmpを付けてコンパイルします。基本編OpenMPでのプログラミングでは、次の5つのカテゴリに分類される構文と実行時関数および環境変数について理解することが必要です。variables)OpenMPでは、ディレクティブと呼ばれるコンパイラへの命令文を記述します。・・・で指定します.OpenMPをサポートしていない場合やコンパイルオプションで無効にした場合はこれらは単にコメント行とみなされます。複数のスレッドによって並列処理される並列領域を定義します。この指示文以降のブロックをマルチスレッドで実行するようになります。*/}※なお、「num_threads(スレッド数)」部分を省略すると、コアの数だけスレッドを生成します。1※これ以降はいずれもデュアルコアでの出力例とします。omp_get_thread_num()は実行時ライブラリ関数です。利用した場合Posixスレッドを利用して同様の処理を書くとOpenMPの手軽さがよくわかります。並行領域内のforループ内で行われる動作をスレッド間に分割します。int型の配列a[100]の全要素を0に初期化するプログラムを並列化します。for」が1つしかない場合は以下のように省略して記述できます。}実行スレッド数を4にして実行すると、4つのスレッドが下記のようにforループの処理を分担して実行します。入れないようにしてください。各スレッドで別々の処理を行う場合はsections指示文で指定します。sections」指示文で指定したブロックの出口では全てのスレッドがその場所に到達するまで待機しているため、ブロック以降の処理を開始する段階で全てのセクションの実行が終えていることが保証されています。sections」指示文にnowait指示節が指定されていない場合に限ります。sections」を使わずに、parallelとsectionsブロックは分けて書き、そのsectionsブロックにnowaitを指定します。parallel」で並列処理中に、1つのスレッドだけで実行したい処理はsingle構文を指定します(どのスレッドが実行するかは決まっていない)。並列実行領域の中でファイルIOを行うような場合に利用します。指示文マスタースレッド(0番スレッド)のみが処理を実行するように指定します。single」指示文を使ってどのスレッドが実行してもいいようにした方が効率は良くなります。各スレッドにデータを共有させたり(共有変数)、逆に独自のデータ(プライベート変数)を持つように指定します。共有変数にはshared、プライベート変数にはprivate指示節を用います。shared指示節を明示的に記述することはあまりしません。private指示節はループ処理などでよく使われます。}二重ループの外側のループを並列化した場合、何も指示しなければ内側のループインデックスは共有変数となります。並列実行時に内側のループインデックスが共有変数のままだと各スレッドが互いにそれを上書きし合って内側のループを正しく実行することができないため、これをプライベート変数として宣言する必要があります。指示節for構文におけるリダクション演算を指示します。ここでは演算子と変数のリストを指示することになります。変数は共有データである必要がありますが、並列実行領域内ではこれらの変数は各スレッド毎にプライベートデータとして処理され、for構文終了時の同期処理実行後にリダクション演算の結果が確保されます。代表的なリダクション演算は、総和演算の他に最大値や最小値を求める演算などが挙げられます。i同期(Synchronization)構文マルチスレッドで複数処理を実行する場合、データへのアクセス同期が必要となります。マルチスレッドアプリケーションでは不正なデータアクセスが必ずしも同じ結果を招くとは限らず、データ競合が潜在しているにもかかわらず問題が表に出ないこともあるので十分に注意しなければなりません。「読み込み+更新+書き込み」が一連の操作(アトミック操作)で行われるデータの同期に利用します。i;atomic指示節は複数行を囲むことができません。指示節OpenMPで生成されるスレッドはOSのスケジューラで管理されるので、スレッドの実行順序や実行のタイミングは不定です。並列領域内でbarrier指示節が指定されると、処理中の各スレッドはいったんbarrier指示節の場所で待機します。全てのスレッドがbarrier指示節に到達するとスレッドは処理を再開します。parallel構文内で複数のスレッド制御が行われ、前の処理が完了しなければ次の処理に移れない場合に利用します。sections)では明示的にbarrier指示節を指定する必要はありません。指示節forループを並列化する場合、ループ回数が大きくなければ並列化の恩恵が受けられないので、ループ回数が一定数以上の時のみ並列実行させるようにすると良いです。for(i=0;iまた、一定数のスレッドが利用可能な場合のみ並列実行させるというアプローチもあります。指示節スレッド間でバリア同期を行わないことを指示します。冗長・不要なバリアを取り除くことでパフォーマンスが向上しますが、reduction指示節を伴う箇所で指定すると、リダクション変数のマージで競合が発生することがあるので注意。通常の関数と同様にプログラム中で呼び出すことが出来ます。この実行時ライブラリ関数をC/C++のプログラムで用いる場合、omp.hを読み込む必要があります。nthreads)並列領域で使用できるスレッド数を設定します。指定されている場合はこのAPIで上書きされます。omp_get_num_threads(void)並行領域を実行するチーム内の現在のスレッド数を返します。omp_get_thread_num(void)そのチーム内でのスレッド番号を返します。omp_in_parallel(void)並列領域内か否かを判定します。