2010-06-18 2 views
0

openmp를 약간 새로 고쳐서이 이상한 상황에 처하게됩니다. 무리를 음모, 나는이 문제 맥에 플래그를 지정하지 않은, gfortran 4.3.4와간단한 프로그램을 위해 -fopenmp를 사용하는 segfault

program ex2 
    implicit none 
    integer, parameter :: n=10000000 
    integer :: i 
    real :: x(n) 

    do i=1,n 
     x(i) = 0.0d0 
    enddo 

end program 

(10.6에게) 보여주고 컴파일하고 프로그램이 제대로 실행이 최소한의 사소한 사건을 만들었습니다.

그러나 openmp와 -fopenmp를 함께 사용하면 프로그램이 세그먼트 화 오류로 종료됩니다. 코드가 즉시 실행되면서 코드가 실행되지 않습니다. 아시다시피 openmp는 코드를 병렬 처리하는 데 사용되지 않습니다. 나는 ulimit -fmax-stack-var-size를 사용하여 스택 크기를 수정하려고 시도했다. 그리고 어떤 경우에는 10 억 개의 실수가 큰 배열을 정의하지 않는다.

내가 뭘 잘못하고 있니?

답변

4

예, openmp는 일반적으로 메모리 할당 방식을 변경합니다. 이전의 토론 :

OpenMP in Fortran 웹에서 검색, 나는 http://homepage.mac.com/eric.c/hpc/contents/documentation/How%20to%20increase%20the%20stack%20size%20on%20Mac%20OS%20X.pdf

gfortran-MP-4.3 -fopenmp ex2.f90 -Wl, -stack_size, 0x40000000과, -stack_addr, 0xf0000000 -o ex2.exe

발견

내 Mac에서 문제가 해결되었습니다.

+0

나를 위해 작동하지만 -stack_addr 사양 만 제거하면됩니다. 나는 페이지 제로 세그먼트와 스택 세그먼트 사이의 세그먼트 오버랩을 얻는다. stack_size를 지정하면 스택 주소가 컴파일러에 의해 정렬 된 상태로 남을 것입니다. –

0

다음은 답이 희미한 시도입니다. openmp 플래그는 스택을 스택에서 힙으로 이동합니까? 그렇다면 어떤 영향을 미칠 수 있습니까?

2

나는 M..S.B에 동의합니다. 일반적인 스택 크기 문제입니다. 힙에 x 필드를 할당하는 것이 좋습니다. 또한 스택에 합금 배열을 사용하는 것을 피하려고합니다 (스택에 현명한 할당이 모든 로컬 변수에 대해 발생합니다). 이렇게하면 특정 문제 크기에서 서브 루틴이 오작동하거나 다른 시스템에서 다른 스택 크기와 관련된 문제와 같은 여러 가지 불쾌한 버그가 방지됩니다. 또한 내 경험 할당 및 deallocation 힙에 상당한 런타임 오버 헤드가 발생하지 않습니다.