2014-05-21 2 views
3

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의 버그인지 궁금합니다.

+0

이것은 컴파일러 버그입니다. 이 질문에 대한 답변을 삭제하면 인텔 엔지니어가 버그를 재현하여 인텔 엔지니어링 팀에 전달했습니다. 다행히 상황이 해결되었습니다. – Richard

답변

1

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  
    } 
} 

반면에 일반적으로 어쨌든 저는 비 POD 값을 함수에 전달하지 않습니다. 참조를 사용하지만 오류가 발생하면

error: ‘p’ has reference type for ‘firstprivate’ 

위의 해결책은 위에 게시 한 코드입니다. 값 또는 참조로 전달한 다음 위의 코드에서와 같이 병렬 영역 내부에 개인 복사본을 정의하십시오.

+0

네, 이전에했던 것과 정확히 같습니다.하지만 이제는 firstprivate를 사용하여 깨끗하게 만들려고합니다. 당신이 오류를 재현 할 수 있다는 것을 알고 좋은, 나는 인텔 포럼에 버그 보고서를 게시 할 수 있습니다. openmp 사양에 따르면 firstprivate는 참조를 허용하지 않으므로 설명하는 오류가 발생합니다. 이 특별한 경우에는 모든 스레드가 (어쨌든 명시 적으로 복사하거나 firstprivate를 사용하여) 벡터를 복사하기 때문에 값으로 벡터를 전달하는 것이 좋습니다. – user1304680

+2

https://software.intel.com/en-us/forums/topic/515687 – user1304680