在函数外声明并行区域后的OpenMP缩减
OpenMP reduction after parallel region declared outside function
如果这个问题已经被问过了,我很抱歉,我不能很容易地找到我的特定问题的答案。
我有并行化的代码。我想在函数调用之外声明一个并行区域,但在函数内部我需要做一些约简操作。
代码的基本形式是:#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]);
}
}
相关文章:
- OpenMP阵列性能较差
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- OpenMP:并行更新数组总是需要减少数组吗
- OpenMP 加上unordered_map<字符串、双字符串的缩减>
- Clang,OpenMP和自定义矢量/矩阵缩减
- OpenMP 任意缩减(合并)
- 在向量上声明缩减,在 1 个线程上运行给出的结果与没有 openmp 的结果不同
- 英特尔编译器 (C++) 问题与 std::vector 上的 OpenMP 缩减
- OpenMP 缩减为模板指定大小的数组C++会导致未定义的行为
- 如何在 OpenMP 中进行有序缩减
- tbb parallel_reduce 用于 OpenMP 缩减的片段
- 当变量是数组元素时,我可以使用 OpenMP 缩减吗?
- openmp并行用于具有两个或多个缩减的循环
- 在函数外声明并行区域后的OpenMP缩减
- 并行OpenMP缩减vs.函数定义
- 使用重载操作符的OpenMP缩减
- 使用循环和阵列缩减的OpenMP
- OpenMP 用于带有 std::vector 和标量变量的循环,带有缩减
- OpenMP/C++:并行 for 循环,之后缩减 - 最佳实践