在函数外声明并行区域后的OpenMP缩减

OpenMP reduction after parallel region declared outside function

本文关键字:OpenMP 缩减 区域 并行 函数 声明      更新时间:2023-10-16

如果这个问题已经被问过了,我很抱歉,我不能很容易地找到我的特定问题的答案。

我有并行化的代码。我想在函数调用之外声明一个并行区域,但在函数内部我需要做一些约简操作。

代码的基本形式是:
#pragma omp parallel
{
    for(j=0;j<time_limit;j++)
    {
        //do some parallel loops
        do_stuff(arg1, arg2)
    }
}
...
... 
void do_stuff(int arg1, int arg2)
{
    int sum=0;
    #pragma omp for reduction(+:sum) //the sum must be shared between all threads
    for(int i=0; i<arg1;i++)
    {
        sum += something;
    }
  }

当我尝试编译时,缩减子句抛出一个错误,因为变量sum对于每个线程都是私有的(显然因为它是在并行区域内声明的)。

是否有一种方法可以做到这种减少(或与相同的最终结果),而不必在函数do_stuff内声明并行区域?

如果您只想减少函数,则可以使用静态存储。从OpenMP 4.0.0规范的2.14.1.2开始

在区域内调用的例程中声明的具有静态存储时间的变量是共享的。

#include <stdio.h>
void do_stuff(int arg1, int arg2)
{
    static int sum = 0;
    #pragma omp for reduction(+:sum)
    for(int i=0; i<arg1;i++) sum += arg2;
    printf("sum %dn", sum);
}
int main(void) {
    const int time_limit = 10;
    int x[time_limit]; for(int i=0; i<time_limit; i++) x[i] = i;
    #pragma omp parallel
    {
        for(int j=0;j<time_limit;j++) do_stuff(10,x[j]);
    }
}