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/