并行 OpenMP 缩减与函数定义?

Posted

技术标签:

【中文标题】并行 OpenMP 缩减与函数定义?【英文标题】:Parallel OpenMP reduction vs. function definition? 【发布时间】:2013-05-14 15:32:05 【问题描述】:

我正在使用 OpenMP,但问题是我正在声明/定义一个函数,如下所示:

void compute_image(double pixel[nb], double &sum)

        #pragma omp parallel for reduction(+:sum)
    for (int j=0;j<640;j++)
    
    if ...
    sum=sum+pixel[0];
    ....
    
....

我现在意识到的是:

Error   2   error C3030: 'sum' : variable in 'reduction' clause/directive cannot have reference type    C:\Users...\test.cpp    930

实际上,我无法摆脱 OpenMP。 有什么解决办法吗?

【问题讨论】:

【参考方案1】:

您可以将sum=sum+pixel[0] 放在#pragma omp atomic#pragma omp critical 行下,而不是减少。

另一种选择是在 omp 部分之前有一个 double local_sum = sum;,在 local_sum 上减少,然后在 for 循环之后有 sum = local_sum;

【讨论】:

使用第二个选项(local_sum)可能会比使用“omp atomic”或“omp critical”执行得更好,因为减少子句让每个线程都有自己的local_sum本地版本。使用“comp critical”强制线程排队等待更新 sum,使用“omp atomic”使线程竞争相同的内存位置。

以上是关于并行 OpenMP 缩减与函数定义?的主要内容,如果未能解决你的问题,请参考以下文章

在 std::vector 上的 Openmp 和缩减?

在 C++ 中使用 OpenMP 并行化递归函数

我应该在 openMP 并行区域内使用 gnu 并行模式函数吗(for-loop,tasks)

c中的openmp并行递归函数

C++ 并行化库:OpenMP 与线程构建块 [关闭]

不在 for 循环内的顺序函数的 OpenMP 并行化