segfault с -fopenmp для тривиальной программы

Я немного обновляю 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, и в любом случае десять миллионов реалов - это не то, что я определяю как большой массив.

Что я делаю неправильно ?


person Stefano Borini    schedule 18.06.2010    source источник


Ответы (3)


Да, 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,-размер_стека,0x40000000,-адрес_стека,0xf0000000 -o ex2.exe

исправил проблему на моем Mac.

person M. S. B.    schedule 18.06.2010
comment
У меня это работает, но только за счет удаления спецификации -stack_addr. Я получаю перекрытие сегментов между нулевым сегментом страницы и сегментом стека. Я предполагаю, что указание stack_size и это оставит адрес стека, упорядоченный компилятором. - person Stefano Borini; 19.06.2010

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

person FFox    schedule 07.07.2010

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

person High Performance Mark    schedule 18.06.2010