为什么在使用OpenMP';英特尔编译器上的std::vector的firstprivate? 我在使用OpenMP与英特尔C++编译器上的FrestPress和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 } }

为什么在使用OpenMP';英特尔编译器上的std::vector的firstprivate? 我在使用OpenMP与英特尔C++编译器上的FrestPress和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 } },c++,gcc,vector,openmp,icc,C++,Gcc,Vector,Openmp,Icc,(icc版本14.0.1(gcc版本4.7.0兼容性)) 或: (gcc版本4.7.2 20130108[gcc-4_7-branch版本195012](SUSE Linux)) 但使用icc编译后,我会遇到运行时错误,例如: *** Error in `./a.out': munmap_chunk(): invalid pointer: 0x00007fff31bcc980 *** 调用第二个函数时(通过值传递向量,并使用firstprivate) 因此,只有在使用firstprivate子

(icc版本14.0.1(gcc版本4.7.0兼容性))

或:

(gcc版本4.7.2 20130108[gcc-4_7-branch版本195012](SUSE Linux))

但使用icc编译后,我会遇到运行时错误,例如:

*** Error in `./a.out': munmap_chunk(): invalid pointer: 0x00007fff31bcc980 ***
调用第二个函数时(通过值传递向量,并使用firstprivate)

因此,只有在使用firstprivate子句(它应该调用copy构造函数)并且将向量按值传递给函数(它也应该调用copy构造函数)时,才会发生错误。如果不传递向量,但在函数中本地创建它,或者不使用firstprivate,则没有错误!在gcc上,我没有得到任何错误


我想知道代码是否以某种方式产生了未定义的行为,或者这是icc中的一个bug?

我在icc中遇到了相同的问题,但在GCC中没有。看起来像只虫子。这里有一个解决办法

void pass_vector_by_value2(std::vector<double> p) {
    #pragma omp parallel
    {
        std::vector<double> p_private = p;
        //do sth with p_private      
    }
}

解决这个问题的方法就是我在上面发布的代码。通过值或引用传递它,然后像我在上面的代码中所做的那样在并行区域内定义一个私有副本。

是的,这正是我以前所做的,但现在我想使用firstprivate使它更干净。很高兴知道你可以重现错误,我可能会在英特尔论坛上发布错误报告。根据openmp规范,firstprivate不接受引用,因此您描述的错误。在这种特殊情况下,我认为按值传递向量是有意义的,因为每个线程都以任何方式复制向量(通过显式复制或使用firstprivate)。这是一个编译器错误。在对该问题的删除答案中,一名英特尔工程师复制了该漏洞,并将其上报给英特尔工程团队。希望现在事情已经解决了。
*** Error in `./a.out': munmap_chunk(): invalid pointer: 0x00007fff31bcc980 ***
void pass_vector_by_value2(std::vector<double> p) {
    #pragma omp parallel
    {
        std::vector<double> p_private = p;
        //do sth with p_private      
    }
}
error: ‘p’ has reference type for ‘firstprivate’