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并行应该有一些类似的东西,如果你有足够多的线程使其有意义,那么累加将通过二叉树发生。
发布于 2010-10-25 01:37:42
只在OpenMP 3.0的Fortran中使用,而且可能只使用某些编译器。
参见上的最后一个示例(示例3):
http://wikis.sun.com/display/openmp/Fortran+Allocatable+Arrays
发布于 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/
从上面的注释中可以注意到,虽然这是一种方便的语法,但它可能会从为每个线程创建每个数组部分的副本中调用大量开销。
发布于 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/
但我还没有试一试。希望其他人可以测试这个特性。
https://stackoverflow.com/questions/3775147
复制相似问题