【发布时间】:2014-05-21 07:26:19
【问题描述】:
在英特尔 c++ 编译器上将 OpenMP 与 firstprivate 和 std::vector 结合使用时出现问题。取以下三个函数:
#include <omp.h>
void pass_vector_by_value(std::vector<double> p) {
#pragma omp parallel
{
//do sth
}
}
void pass_vector_by_value_and_use_firstprivate(std::vector<double> p) {
#pragma omp parallel firstprivate(p)
{
//do sth
}
}
void create_vector_locally_and_use_firstprivate() {
std::vector<double> p(3, 7);
#pragma omp parallel firstprivate(p)
{
//do sth
}
}
代码编译时没有警告:
icc filename.cpp -openmp -Wall -pedantic
(icc 14.0.1版(gcc 4.7.0版兼容性))
或:
g++ filename.cpp -fopenmp -Wall -pedantic
(gcc 版本 4.7.2 20130108 [gcc-4_7-branch 修订版 195012] (SUSE Linux))
但在使用 icc 编译后,我遇到了运行时错误,例如:
*** Error in `./a.out': munmap_chunk(): invalid pointer: 0x00007fff31bcc980 ***
调用第二个函数时(pass_vector_by_value_and_use_firstprivate)
因此,只有在使用 firstprivate 子句(应该调用复制构造函数)并且向量按值传递给函数(也应该调用复制构造函数)时才会发生错误。当不传递向量但在函数中本地创建它或不使用 firstprivate 时,没有错误!在 gcc 上我没有收到任何错误。
我想知道代码是否会以某种方式产生未定义的行为,或者这是否是 icc 中的错误?
【问题讨论】:
-
这是一个编译器错误。在对该问题的已删除答案中,一位英特尔工程师复制了该错误并与英特尔工程团队一起升级。希望事情现在得到解决。