segfault с -fopenmp для тривиальной программы - PullRequest
0 голосов
/ 18 июня 2010

Я немного обновляю openmp и попал в эту странную ситуацию.Сбросив кучу, я создал этот минимальный тривиальный случай, который показывает проблему

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

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

end program

без заданных флагов, gfortran 4.3.4 на mac (10.6) компилируется, и программа выполняется правильно.

Однако, если я включаю openmp с -fopenmp, программа завершается с ошибкой сегментации.По-видимому, никакой код не выполняется, так как он сразу падает.Как видите, openmp никогда не используется в коде для распараллеливания чего-либо.Я пытался изменить размер стека, используя ulimit -fmax-stack-var-size, и в любом случае десять миллионов реалов - это не то, что я определяю для большого массива.

Ответы [ 3 ]

4 голосов
/ 19 июня 2010

Да, openmp обычно меняет распределение памяти. Предыдущее обсуждение: OpenMP в Фортране

Поиск в сети, я нашел 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.

2 голосов
/ 07 июля 2010

Я согласен с М.С.Б. Это общая проблема размера стека. Я бы порекомендовал выделить х-поле в куче. Я также стараюсь полностью избегать использования массивов, выделенных в стеке (как в вашем случае распределение по стеку для всех локальных переменных). Это предотвращает сбой некоторых неприятных ошибок, таких как подпрограммы при определенном размере проблемы, или проблемы с другим размером стека на другом компьютере. Также из моего опыта распределение и освобождение в куче не вызывает значительных накладных расходов во время выполнения.

0 голосов
/ 18 июня 2010

Вот слабая попытка ответа: флаг openmp перемещает массив из стека в кучу? И если да, то какое влияние это может оказать?

...