2010-05-19 4 views
4

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

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

gfortran Example1.F90 -o example1

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

gfortran -openmp Example1.F90 -o example1

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

Приносим извинения, если мой вопрос довольно прост. Я мог бы отправить код, но он довольно длинный. Она разломы, как я назначить начальные значения:

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

    ... 

    uconsold=0.0  
    uconsolde=0.0  

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

Благодарим за помощь в этом вопросе.

+0

Это не устаревший код, насколько я могу судить. Это современный способ декларирования массивов. Что касается openmp, то при должном уважении к учебнику по ссылке я смиренно рекомендую книгу «Использование OpenMP». Он очень дружелюбен к людям, которым никогда не приходилось иметь дело с ним. Http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=11387 ... есть еще один, но я не знаю, У меня есть это на моей полке прямо сейчас и не могу вспомнить автора. Если вам интересно, напишите мне свой комментарий, и я посмотрю, когда вернусь домой. – Rook

ответ

7

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

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

+0

Хотя я думаю, что @MSB делает разумное предложение, я категорически не согласен с утверждением, что «у каждого потока есть своя копия». Если вы не объявите переменную как приватную, то все потоки передадут эту переменную. Я никогда не сталкивался с системой OpenMP, которая реализует общие переменные, копируя их во все потоки и управляя согласованностью за кулисами. –

+0

Вы на самом деле правы, на моей коробке linux: ulimit -s unlimited ./Example1 Работали как очарование. Это может быть вне сферы действия (и печальный результат того, что 95% моего времени тратится на Java), но я как-то понял, что обычно скомпилированные fortran и openmp будут использовать пространство стека.Поскольку я бы скорее прочитал книгу, чем продолжал подслушивать вас, знаете ли вы, что хороший ресурс я могу проверить, чтобы понять, что мне стало лучше? – Dio

+0

@High Performance Mark правильно, что по умолчанию переменные разделяются. Однако для компиляторов, когда включен openmp, обычно приходится переключаться на размещение локальных массивов в стеке. Это полезно для подпрограмм, которые могут быть вызваны из параллельных областей. Рекомендация книги: «Использование OpenMP» от Chapman, Jost, van der Pas & Kuck. Моя рекомендация –

2

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

Смежные вопросы