連載
» 2009年06月11日 00時00分 公開

マルチコアにおける標準表記OpenMP組み込みマルチコア進化論(5)(2/3 ページ)

[塚田 雄一 キャッツ,@IT MONOist]

早速、openMPを体験してみましょう。

 OpenMPの体験の前に、通常のソースコードを作成して実行してみましょう。ソースコードはおなじみの「Hello!」を表示するプログラムです。


 ここでは、サンプルファイル(sample01.c)を作成し、プロジェクト(test)を作成します。そして、ソースコードに登録を行います。「デバッグメニュー」−>「デバッグ開始」もしくは(F5キー)を実行してください。すると、自動的にビルドが実行されます。そして、ビルド終了後にはデバッグが実行され、画面には「Hello!」が1つ表示されます。

 しかし、画面は即終了されてしまうので、画面を参照したい場合は、4行目の最後の“}”にブレイクを設定して実行してみるとブレイクで実行が停止され、画面を参照可能となります。

サンプルファイル実行画面 画像5 サンプルファイル実行画面

OpenMPのソースコード

 次に、OpenMPを体験するためにソースコードを修正します。まずは、OpenMPのヘッダファイルをインクルードする必要があるため、「#include 」を追加してください。そして次に、スレッドを4つ作成して実行させるため、printf("Hello!\n");を#pragma omp parallel num_threads(4) { } で囲んでください。

OpenMPの実行

 そして先ほどと同じように、「デバッグメニュー」−>「デバッグ開始」もしくは(F5キー)を実行してください。画面には、「Hello!」が4つ表示されています。これは、スレッドが4つ作成され、それぞれのスレッドが「Hello!」を表示しているためです。「Hello!」が4つ表示されていることを確認してください。

変更後のサンプルファイル実行画面 画像6 変更後のサンプルファイル実行画面

繰り返し処理(forループ)の並列化

 繰り返し処理を並列化する例として、forループの並列化をしてみましょう。「#pragma omp parallel for」を使用します。そうすることにより、forループ部分を実行する際にスレッドが作成され、その作成されたスレッドの中で処理が実行されます。

 例えば、int 型の配列a[100]の全要素を0に初期化するプログラムを並列化する例を下記に記します。「#pragma omp parallel」と並列リージョンを指定し、「#pragma omp for」と並列スレッド指示文を記述します。

 並列リージョンの中に「#pragma omp for」が1つしかない場合には、以下のプログラムのように結合指示文「#pragma omp parallel for」を使って記述行数を短くすることが可能です。

 上記のプログラムが動作する場合、例えば実行スレッド数を4にして実行すると、4つのスレッドが下記のようにforループの処理を分担して実行されます。

スレッド0番:for(=0;i<25;i++)a[i]=0;
スレッド1番:for(i=25;i<50;i++)a[i]=0;
スレッド2番:for(i=50;i<75;i++)a[i]=0;
スレッド3番:for(i=75;i<100;i++)a[i]=0;

 実行スレッド数は動的に決定され、コンパイラによってこのような分担をプログラム実行時に行うような実行コードが生成され処理が実行されます。

Copyright © ITmedia, Inc. All Rights Reserved.