OpenMP Несколько «общих» директив? - PullRequest
5 голосов
/ 13 апреля 2011

Привет, у меня есть очень длинный список общих переменных в OpenMP, поэтому мне нужно разбить строки в фортране и использовать синтаксис "&", чтобы убедиться, что строки слипаются!

Примерно так:

!$OMP PARALLEL DEFAULT(private) SHARED(vars....,
     & more_vars...,
     & more_vars...
     & )

Это дает мне ошибки при компиляции без OpenMP, так как только первый лайк распознается как комментарий!Проблема в том, что я не могу добавить "!"перед этими строками с «&» впереди для поддержки компиляции без OpenMP:

!$OMP PARALLEL DEFAULT(private) SHARED(vars....,
!     & more_vars...,
!     & more_vars...
!     & )

, потому что он больше не компилируется с OpenMP ... Но я хочу поддерживать оба вида компиляциитолько один код ... Любые советы, как это сделать?

Ответы [ 2 ]

8 голосов
/ 13 апреля 2011

Вы не используете правильный синтаксис.Если вы посмотрите на спецификацию OpenMP V3.0, раздел 2.1.2 Директивы свободной формы, вы увидите следующее:

Часовой может появляться в любом столбце, если ему предшествует толькопробел (пробелы и символы табуляции).Это должно появиться как одно слово без промежуточного символа.К линии директивы применяются правила длины строки свободной формы, пробела и продолжения Фортрана.Начальные директивные строки должны иметь пробел после стража.Непрерывные строки директивы должны иметь амперсанд в качестве последнего непустого символа в строке перед любым комментарием, помещенным внутри директивы.Строки директивы продолжения могут иметь амперсанд после сторожа директивы с необязательным пробелом до и после амперсанда.

Поэтому правильная форма должна быть:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., &
!$OMP& more_vars..., &
!$OMP& more_vars...  &
!$OMP& )

Для фиксированной формы:это вещь того же типа.Вы начинаете каждую строку с часового OMP и убедитесь, что строки продолжения имеют непустой и ненулевой символ в столбце 6.

0 голосов
/ 19 апреля 2011

Хорошо, ребята ... Я нашел решение: Идентификатор цикла (я имею в виду i в следующем коде: do i=1,end) должен использоваться совместно, и, поскольку я использую DEFAULT(private), мне пришлось записать это в список общих переменных :) Надеюсь, это когда-нибудь кому-нибудь поможет:)

...