openmp并行用于具有两个或多个缩减的循环

openmp parallel for loop with two or more reductions

本文关键字:循环 两个 用于 openmp 并行      更新时间:2023-10-16

Hi只是想知道这是否是进行常规for循环的正确方法,但有两个减少,这是下面的正确方法吗?这是否也适用于两次以上的减排。有更好的方法吗?还有没有机会将其与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) ...

将为sumresult创建专用线程变量,它们将使用+组合并分配给线程块末尾的原始全局变量。

此外,变量y应标记为private。

请参阅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;
}

来自OpenMP 4.5完整规范(2015年11月)

指令中可以指定任意数量的减少条款,但是列表项只能在该项的reduce子句中出现一次指令。

在使用oMP v2.0的Visual C++上也是如此:reduction VC++