Intel C++ 컴파일러에서 firstprivate 및 std :: vector와 함께 OpenMP를 사용할 때 문제가 있습니다. 다음과 같은 세 가지 기능을 가지고 :인텔 컴파일러에서 std :: vector로 OpenMP의 firstprivate를 사용할 때 정의되지 않은 동작이 발생하는 이유는 무엇입니까?
#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 분기 개정 195012] (수세 리눅스))
는하지만 같은 런타임 오류를 얻고있다 ICC로 컴파일 한 후 : ((pass_vector_by_value_and_use_firstprivate)을 firstprivate 절을 사용할 때
그래서 오류가 발생합니다 두 번째 함수를 호출 할 때
*** Error in `./a.out': munmap_chunk(): invalid pointer: 0x00007fff31bcc980 ***
하는해야 복사 생성자를 호출) 벡터는 값으로 함수에 전달됩니다 (복사 생성자도 호출해야 함). 벡터를 전달하지 않고 함수에서 로컬로 생성하거나 firstprivate를 사용하지 않으면 오류가 발생하지 않습니다. gcc에서 오류가 발생하지 않습니다.
코드가 어떻게 든 정의되지 않은 동작을 생성하는지 또는 이것이 icc의 버그인지 궁금합니다.
이것은 컴파일러 버그입니다. 이 질문에 대한 답변을 삭제하면 인텔 엔지니어가 버그를 재현하여 인텔 엔지니어링 팀에 전달했습니다. 다행히 상황이 해결되었습니다. – Richard