HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。 |
[記事一覧を見る]
続けて、Parallel Studioのインテル C++ コンパイラーが備える並列化キーワードを利用して、プログラムを並列化してみよう。今回はクイーンの数を求める「setQueen」関数を呼び出しているforループを並列実行することで、プログラムの並列化を行ってみる。
まず、並列化したいforループにインテル C++ コンパイラーの独自拡張キーワード「__par」を追加する。__parキーワードは、このキーワードを付加した部分を並列に実行するように指定するものだ。また、変数「queens」は探索に利用するための作業用バッファであるので、スレッドごとに独立してメモリを割り当てておく。
void solve(int queens[]) { for(int i=0; isize; i++) { // try all positions in first row // create separate array for each recursion setQueen(queens, 0, i); } }
void solve() { int* queens; __par for(int i=0; isize; i++) { // try all positions in first row // create separate array for each recursion queens = new int[size]; setQueen(queens 0, i); delete[] queens; } }
また、setQueens関数中ではグローバル変数「nrOfSolutions」の変更を行う個所があり、複数のスレッド間で同時にこの値を変更してしまうと問題が発生する。そこで、あるスレッドがこの変数に対する処理を行っている間は、ほかのスレッドから同じ処理を実行できないように「__critical」キーワードを追加する。
if(row==size-1) { nrOfSolutions++; }
if(row==size-1) { __critical nrOfSolutions++; }
これらの変更を加えたのち、再度プログラムをコンパイルしてパフォーマンスを比較したところ、次のように大幅な高速化が確認できた(表3)。
条件 | 実行時間 |
---|---|
並列化前 | 1335ミリ秒 |
並列化後 | 758ミリ秒 |
なお、__parや__criticalキーワードを利用したプログラムをコンパイルする際は、コンパイルオプションでOpenMPを利用するように設定しておく必要がある(図9)。
[PageInfo]
LastUpdate: 2009-11-18 20:47:59, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members