首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以使用openmp对数组进行缩减?

是否可以使用openmp对数组进行缩减?
EN

Stack Overflow用户
提问于 2010-09-23 10:55:36
回答 5查看 22K关注 0票数 21

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并行应该有一些类似的东西,如果你有足够多的线程使其有意义,那么累加将通过二叉树发生。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-25 01:37:42

只在OpenMP 3.0的Fortran中使用,而且可能只使用某些编译器。

参见上的最后一个示例(示例3):

http://wikis.sun.com/display/openmp/Fortran+Allocatable+Arrays

票数 3
EN

Stack Overflow用户

发布于 2016-11-08 01:14:26

在用于C和C++的OpenMP 4.5中,现在可以减少数组。下面是一个例子:

#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/

从上面的注释中可以注意到,虽然这是一种方便的语法,但它可能会从为每个线程创建每个数组部分的副本中调用大量开销。

票数 9
EN

Stack Overflow用户

发布于 2016-05-14 05:01:10

现在最新的openMP 4.5规范支持减少C/C++数组。http://openmp.org/wp/2015/11/openmp-45-specs-released/

而最新的GCC 6.1也支持这一功能。http://openmp.org/wp/2016/05/gcc-61-released-supports-openmp-45/

但我还没有试一试。希望其他人可以测试这个特性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3775147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档