2011-12-04 2 views
1

중첩 된 omp를 사용하는 C++ 응용 프로그램을 구축 중입니다. 그러나 충돌이 발생합니다. 이 문제는 두 omp 중 하나가 제거되거나 wait 함수가 주 파일 자체에있을 때 해결됩니다. OS는 MacOS X Lion입니다. 컴파일러는 llvm-gcc 또는 gcc-4.2이어야합니다 (잘 모르겠다. 간단히 cmake ...). 다음을 보여주기 위해 다음 앱을 만들었습니다.중첩 된 openmp가 세분화 오류를 일으킴 (MacOS X 만 해당)

편집 : 이제 동일하게 시도했습니다. 리눅스 컴퓨터에서, 그것은 잘 작동합니다. 그래서 그것은 순수한 MACOS X (사자) 문제입니다.

OMP_NESTED가 true로 설정됩니다.

주 :

#include "waiter.h" 
#include "iostream" 
#include "time.h" 
#include <omp.h> 


void wait(){ 
    int seconds = 1; 

#pragma omp parallel for 
    for (int i=0;i<2;i++){ 
     clock_t endwait; 
     endwait = clock() + seconds * CLOCKS_PER_SEC ; 
     while (clock() < endwait) {} 
     std::cout << i << "\n"; 
    } 
} 

int main(){ 
    std::cout << "blub\n"; 

#pragma omp parallel for 
    for(int i=0;i<5;i++){ 
     Waiter w; // causes crash 
     // wait(); // works 
    } 
    std::cout << "blub\n"; 

    return 0; 
} 

헤더 :

#ifndef WAITER_H_ 
#define WAITER_H_ 

class Waiter { 
public: 
    Waiter();  
}; 

#endif // WAITER_H_ 

구현 :

#include "waiter.h" 
#include "omp.h" 
#include "time.h" 
#include <iostream> 

Waiter::Waiter(){ 
    int seconds = 1; 

#pragma omp parallel for 
    for (int i=0;i<5;i++){ 
     clock_t endwait; 
     endwait = clock() + seconds * CLOCKS_PER_SEC ; 
     while (clock() < endwait) {} 
     std::cout << i << "\n"; 
    } 
} 

CMakeLists.txt :

cmake_minimum_required (VERSION 2.6) 
project (waiter) 

set(CMAKE_CXX_FLAGS "-fPIC -fopenmp") 
set(CMAKE_C_FLAGS "-fPIC -fopenmp") 
set(CMAKE_SHARED_LINKDER_FLAGS "-fPIC -fopenmp") 

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) 
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 

add_library(waiter SHARED waiter.cpp waiter.h) 
add_executable(use_waiter use_waiter.cpp) 
target_link_libraries(use_waiter waiter) 
,536,

도움에 감사드립니다!

+0

플랫폼/컴파일러는 무엇입니까? 나는 GCC 4.5의 OpenMP에 버그가 있다고 들었다. –

+0

@larsmans \t MAC OS Lion과 llmv 또는 gcc-4.2 중 하나입니다. 단순히 CMake를 사용하는 것이 확실하지 않습니다 ...이 부분을 어디에서 찾을 수 있습니까? – guinny

+0

'CMAKE_CXX_COMPILER'를 설정해보십시오. –

답변

2

편집 : 자세한 내용으로 다시 작성하십시오.

openmp는 gcc 4.2에서 간헐적으로 실패하지만 gcc 4.6.1 (또는 4.6)으로 고정됩니다. http://hpc.sourceforge.net/에서 4.6.1 바이너리를 얻을 수 있습니다 (gcc-lion.tar.gz 찾기).

gcc 4.6.1 미만인 openmp의 실패는 간헐적입니다. 많은 openmp 호출 이후에 발생하는 것으로 보입니다. 따라서 중첩으로 인해 가능성이 높아졌지만 중첩이 필요하지는 않습니다. 이 link에는 openmp가 중첩되어 있지 않지만 (표준 단일 스레드 내에서 병렬로 사용됨) 실패합니다. 내 자신의 코드는 사자에 gcc 4.2 (중첩 된 pragma 없음)로 잘 작동 한 후 openmp로 인해 간헐적으로 매달 리거나 충돌하여 gcc 4.6.1에서 완전히 수정되었습니다.

코드를 다운로드하여 gcc 4.2로 컴파일했는데 내 컴퓨터에서 올바르게 실행되었습니다 (Waiter w;wait(); 옵션 모두 :-). 난 그냥 사용 :

g++ -v -fPIC -fopenmp use_waiter.cpp waiter.cpp -o waiter

나는 루프 maxes을 증가 시도했지만 여전히 실패를 가져올 수 없습니다. 나는 시작과 끝 모두 blub을 본다.

어떤 오류 메시지가 있습니까?

다운로드 한 gcc 4.6이 사용 중인지 확인하십시오 (-v을 사용하십시오).

도 참조하십시오. here.

+1

gcc 4.2는 중첩이없는 한 올바르게 작동합니다. 나는 gcc 4를 다운로드했다.6 macport 사용하지만 여전히 문제가 해결되지 않습니다. – guinny

+0

@Y CHAI : 업데이트 된 답변, 특히'-v'를 참조하십시오. – Ramashalanka

+0

@Y CHAI : 코드를 실행할 때'OMP_NESTED'가 내부 루프에서 작동하는지 확인하기 위해'omp_get_thread_num()'의 출력을 추가했습니다. – Ramashalanka

관련 문제