c++ - 是否可以使用 openmp 对数组进行缩减?

标签 c++ arrays openmp reduction

OpenMP 本身是否支持减少表示数组的变量?

这将像下面这样工作......

float* a = (float*) calloc(4*sizeof(float));
omp_set_num_threads(13);
#pragma omp parallel reduction(+:a)
for(i=0;i<4;i++){
   a[i] += 1;  // Thread-local copy of a incremented by something interesting
}
// a now contains [13 13 13 13]

理想情况下,omp parallel for 会有类似的东西,如果你有足够多的线程让它有意义,那么累积将通过二叉树发生。

最佳答案

现在可以使用 OpenMP 4.5 for C 和 C++ 减少数组。这是一个例子:

#include <iostream>

int main()
{

  int myArray[6] = {};

  #pragma omp parallel for reduction(+:myArray[:6])
  for (int i=0; i<50; ++i)
  {
    double a = 2.0; // Or something non-trivial justifying the parallelism...
    for (int n = 0; n<6; ++n)
    {
      myArray[n] += a;
    }
  }
  // Print the array elements to see them summed   
  for (int n = 0; n<6; ++n)
  {
    std::cout << myArray[n] << " " << std::endl;
  } 
}

输出:

100
100
100
100
100
100

我用 GCC 6.2 编译了这个。您可以在此处查看哪些常用编译器版本支持 OpenMP 4.5 功能:https://www.openmp.org/resources/openmp-compilers-tools/

请注意,尽管这是一种方便的语法,但它可能会因为每个线程创建每个数组部分的拷贝而产生大量开销。

关于c++ - 是否可以使用 openmp 对数组进行缩减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3775147/

相关文章:

c - OpenMP 调试新手问题

c++ - 使用序列优雅地初始化静态(成员)数组

javascript - 无法在 Javascript 中访问我的二维数组

c - c堆栈数据结构中的推送操作失败

c - 切换字母(无字符串或字符串函数)

c - 使 2 个循环并行运行

linux - 英特尔 OpenMP 安装问题

c++ - 确定 std::function 的返回类型

c++ - 需要调试在docker中运行的混合 "C and C++"代码

c++ - 关于构建 shell 时的 fork()