インドリ [著] 2010/07/21 14:00

サンプルファイル 13.65 KB
← 1 2 3 4 →

並列リダクション

 全体に渡って、総和・最大値・最小値・論理積などを求めることをリダクションと呼びます。並列的なリダクション処理を実装するのは少々難しいですが、幸いOpenMPには簡単に並列リダクションを実装するためにreduction指示句が用意されています。

 サンプルプロジェクトReductionSampleのコードを掲載しますので、先ずはこのコードを見てください。

reduction指示句の使い方を示すサンプル
#include <stdio.h>
#include <omp.h>

int main()
{
    int i, count, sum;
    count = 0;
    sum = 0;
    #pragma omp parallel num_threads( 10 ) reduction( +: count, sum )
    {
        #pragma for
        for ( i = 0; i < 10; i++ )
        {
            count++;
            sum += i;
        }
        printf( "スレッド:%d\t実行回数%d回 合計値%d\n", omp_get_thread_num(), count, sum );
    }

    /* 最終値を表示 */
    printf( "【最終値】\t実行回数%d回 合計値%d\n\n", count, sum );
    return 0;
}

 このサンプルを実行すると、総合計を並列的に算出します。前回掲載した総合計を求めるfork-joinモデルのサンプルと見比べてください。OpenMPを使用すると、並列リダクション処理を、簡単に実装できることが分かります。

 OpenMPを用いて並列リダクション処理を行いたい場合、reduction指示句を指定するだけです。reduction指示句は、括弧内に「オペレーション(+、*などの符号):使用する変数(複数指定可能)」を記述するだけです。もし、複数の演算を行いたい場合は、reduction指示句を演算の数だけ指定します。

まとめ

 今回はOpenMPの変数に関する指示句を紹介しました。前回の記事と併せて読むと、並列処理での変数の扱い方について多くのことが分かったと思います。並列処理において、変数の扱い方は非常に重要です。変数の使い方を理解しないと、正しく並列プログラミングをすることはできず、バグに悩まされる羽目になります。

 変数の扱い方をマスターすれば、並列処理特有のバグを大幅に減らすことができます。本記事が、並列処理特有のバグを減らす一助になれば幸いです。

 次回は、より高度なOpenMPの概念を解説します。お楽しみに。

参考資料


<-
1 2 3 4
INDEX
OpenMPにおける変数の扱いと並列リダクション
はじめに
対象読者
必要な環境
並列処理と変数
変数の局所化
スレッドプライベート変数のコピー
Page4
並列リダクション
まとめ
参考資料
プロフィール
インドリ インドリ

分析・設計・実装なんでもありのフリーエンジニア。
ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。

アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。

座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学習しています。

 


注目の求人情報
コンサルタント/グローバルファーム
ITコンサルティング、システムエンジニアリング(SE)
システムエンジニア/イントラネット開発
各種案件におけるDB2、Oracleなどのデータベース設計、構築、チューニング等を担当していただきます。 ...
プログラマ/メディア系IT企業
某人気サイトを支えるプログラマ部門のマネージャーの募集です! ▼業務内容 ・ポイントサイトのプ...

(最新日付順)

本記事は現在、新規コメントの受付を中止しております。ご了承ください。

スポンサーサイト

この記事のトラックバックURL: