And*_*ner 19 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并行会有类似的东西,并且如果你有足够多的线程使它有意义,那么积累将通过二叉树发生.
现在,可以使用适用于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功能:http : //www.openmp.org/resources/openmp-compilers/
请注意,从上面的注释中可以看出,尽管这是一种方便的语法,但它可能会为每个线程创建每个数组节的副本而产生大量开销。
仅适用于 OpenMP 3.0 中的 Fortran,并且可能仅适用于某些编译器。
请参阅最后一个示例(示例 3):
http://wikis.sun.com/display/openmp/Fortran+Allocatable+Arrays