OpenMP в Фортране - PullRequest
       51

OpenMP в Фортране

4 голосов
/ 19 мая 2010

Я очень редко использую фортран, однако мне было поручено взять унаследованный код, переписав его для параллельной работы. Я использую Gfortran для моего выбора компилятора. Я нашел несколько отличных ресурсов на https://computing.llnl.gov/tutorials/openMP/, а также несколько других.

Моя проблема заключается в том, что перед добавлением директив OpenMP, если я просто скомпилирую устаревшую программу:

gfortran Example1.F90 -o Example1

все работает, но включение опции компилятора openmp даже без добавления директив:

gfortran -openmp Example1.F90 -o Example1

заканчивается ошибкой сегментации при запуске устаревшей программы. Используя меньшие тестовые программы, которые я написал, я успешно скомпилировал другие программы с -openmp, которые выполняются в нескольких потоках, но я не совсем уверен, почему включение только одной опции и отсутствие директив приводит к ошибке seg.

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

    REAL, DIMENSION(da,da) :: uconsold
    REAL, DIMENSION(da,da,dr,dk) :: uconsolde

    ...

    uconsold=0.0    
    uconsolde=0.0       

Первое присваивание «uconsold» работает нормально, второе, кажется, является источником ошибки, так как, когда я комментирую строку, следующие несколько строк выполняются весело, пока «uconsolde» не будет использован снова.

Спасибо за любую помощь в этом вопросе.

Ответы [ 2 ]

7 голосов
/ 19 мая 2010

Возможно, вы используете стековое пространство? С переменными openmp будет в стеке, так что каждый поток имеет свою собственную копию. Возможно, ваши массивы большие, и даже с одним потоком (без директив openmp) они используют стек. Просто предположение ... Попытка метода вашей операционной системы увеличить размер стека и посмотреть, исчезнет ли ошибка сегментации.

Другой подход: чтобы указать, что массив должен помещаться в кучу, вы можете сделать его «размещаемым». OpenMP версии 3.0 позволяет более широко использовать выделяемые массивы Fortran - я не уверен в деталях.

2 голосов
/ 28 января 2011

У меня была эта проблема. Это жутко: я получаю segfaults только за объявление массивов 33x33 или 11x11x11 без директив OpenMP; эти ошибки происходят на Intel Mac с 4 ГБ оперативной памяти. Решив эту проблему, сделав их «размещаемыми», а не статически распределенными.

...