web-dev-qa-db-ja.com

2つ以上の削減を伴うopenmp並列forループ

こんにちは、これが通常のforループを実行するための正しい方法であるかどうか疑問に思っていますが、2つの削減がありますが、これは以下の正しいアプローチですか?これは、2つ以上の削減でも機能しますか?これを行うためのより良い方法はありますか?また、これをMPI_ALLREDUCEコマンドと統合する機会はありますか?

heres the psuedo code

      #pragma omp parallel for \
      default(shared) private(i) \
      //todo first  reduction(+:sum)
      //todo second reduction(+:result)

      for loop i < n; i ++; {
        y = fun(x,z,i)
        sum += fun2(y,x)
        result += fun3(y,z)
      }
15
pyCthon

カンマで区切られた複数の変数、つまりリストを指定することで、削減を行うことができます。

#pragma omp parallel for default(shared) reduction(+:sum,result) ...

プライベートスレッド変数はsumresultに対して作成され、+を使用して結合され、スレッドブロックの最後で元のグローバル変数に割り当てられます。

また、変数yはプライベートとしてマークする必要があります。

https://computing.llnl.gov/tutorials/openMP/#REDUCTION を参照してください

27
devil

別のreduction句を追加するだけです。

#include <iostream>
#include <cmath>

int main(){
    double sum_i = 0, max_i = -1;
    #pragma omp parallel for reduction(+:sum_i) reduction(max:max_i)
    for (int i=0; i<5000; i++){
        sum_i += i;
        if (i > max_i)
            max_i = i;
    }
    std::cout << "Sum = " << sum_i << std::endl;
    std::cout << "Max = " << max_i << std::endl;
    return 0;
}

から OpenMP 4.5完全仕様(2015年11月)

ディレクティブには任意の数のreduction句を指定できますが、リストアイテムはそのディレクティブのreduction句に1回しか表示できません。

同じことがoMPv2.0を使用するVisualC++でも機能します: reduction VC++

8
Azmisov