OpenMP:为"共享"预先确定"共享"?
OpenMP: predetermined 'shared' for 'shared'?
请参阅此功能(矩阵向量产品):
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。
相关文章:
- 从python调用openMP共享库时,未定义opnMP函数
- OpenMP 任务看不到共享变量的更改
- 读/写 OpenMP 中的共享向量会减慢程序速度
- 共享或私有 openmp 代码中的结构化类型变量
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- OpenMP:共享同一算法的单线程和多线程实现
- OpenMP 环路阵列访问中的错误共享
- 在C 中使用OpenMP共享子句
- OpenMP并行区域中的std::vector push_back会导致错误共享吗
- Eigen & OpenMP : 由于错误共享和线程开销,没有并行化
- 为什么 openMP 取消构造不取消工作共享区域
- OpenMP中类成员变量的数据共享属性
- OpenMP:为"共享"预先确定"共享"?
- 使用openmp创建共享锁
- 增加OpenMP中用于进度报告的共享循环计数器
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果
- C++:OpenMP 共享内存保护
- 在 OpenMP 中使用共享数据结构而不是私有数据结构时的性能差异