OpenMP:'共享'的预定'共享'?
看到这个功能(矩阵 - 矢量产品):
std::vector<double> times(std::vector<std::vector<double> > const& A, std::vector<double> const& b, int m, int n) {
std::vector<double> c;
c.resize(n);
int i, j;
double sum;
#pragma omp parallel for default(none) private(i, j, sum) shared(m, n, A, b, c)
for (i = 0; i < m; ++i) {
sum = 0.0;
for (j = 0; j < n; j++) {
sum += A[i][j] * b[j];
}
c[i] = sum;
}
return c;
}
当试图用OpenMP进行编译时,编译器会失败:
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fopenmp -MMD -MP -MF"src/OpemMPTutorial.d" -MT"src/OpemMPTutorial.d" -o "src/OpemMPTutorial.o" "../src/OpemMPTutorial.cpp"
../src/OpemMPTutorial.cpp:127: warning: ignoring #pragma omp end
../src/OpemMPTutorial.cpp: In function 'std::vector<double, std::allocator<double> > times(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<double, std::allocator<double> >&, int, int)':
../src/OpemMPTutorial.cpp:200: error: 'b' is predetermined 'shared' for 'shared'
../src/OpemMPTutorial.cpp:200: error: 'A' is predetermined 'shared' for 'shared'
make: *** [src/OpemMPTutorial.o] Error 1
这里有什么问题?
(请注意,简单地删除const
导致相同的错误。)
我有一个非常相似的问题,并且经历过,当我从OpenMP指令的shared
部分删除共享const
变量后,可以使用Apple的GCC 4.2编译这样的程序。 它们被预先确定为共享的,因为它们是不变的,并且不需要为每个线程制作副本。 编译器似乎只是不接受,当它知道它已经明确地告诉它......
我还将删除default(none)
规范(但请参阅下面的注释)。 OpenMP旨在降低显式规格,因此让它能够完成工作。
这是由于gcc-4.2中的OpenMP支持不足造成的。 代码片段使用gcc-4.7编译时没有问题。
链接地址: http://www.djcxy.com/p/65741.html