并行区域声明外部函数后的OpenMP减少

时间:2015-10-26 07:41:52

标签: c++ parallel-processing openmp

道歉,如果已经提出这个问题,我无法轻易找到对我具体问题的答案。

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

代码的基本形式是:

#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;
    }
  }

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

有没有办法在函数do_stuff中声明并行区域,从而进行减少(或具有相同结果的东西)?

1 个答案:

答案 0 :(得分:1)

如果您只想减少功能,可以使用静态存储。来自OpenMP 4.0.0 specification

的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 %d\n", 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]);
    }
}