こんにちは、これが通常の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)
}
カンマで区切られた複数の変数、つまりリストを指定することで、削減を行うことができます。
#pragma omp parallel for default(shared) reduction(+:sum,result) ...
プライベートスレッド変数はsum
とresult
に対して作成され、+
を使用して結合され、スレッドブロックの最後で元のグローバル変数に割り当てられます。
また、変数y
はプライベートとしてマークする必要があります。
https://computing.llnl.gov/tutorials/openMP/#REDUCTION を参照してください
別の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;
}
ディレクティブには任意の数のreduction句を指定できますが、リストアイテムはそのディレクティブのreduction句に1回しか表示できません。
同じことがoMPv2.0を使用するVisualC++でも機能します: reduction VC++