Вопрос об аргументах символьных переменных в директивах OpenMP в Фортране - PullRequest
1 голос
/ 21 августа 2011

В настоящее время я пытаюсь распараллелить некоторый многосеточный код, написанный на Fortran, с использованием OpenMP, и обнаружил, что пункты планирования OpenMP оказывают огромное влияние на производительность. Напомним, что пункты планирования OpenMP являются статическими, динамическими, исполняемыми и управляемыми, и они определяют, как работа в цикле распределяется между потоками. Например, параллельный OpenMP цикл SAXPY с предложением планирования будет выглядеть следующим образом:

!$OMP Parallel Do Schedule(Static)
Do i=1,n
    z(i)=a*x(i)+y(i)
End Do 
!$OMP End Parallel Do

Теперь представьте, что у нас есть много параллельных циклов в куске кода, и мы не можем определить априори , какой из этих пунктов планирования сделает программу работающей быстрее всего. Изменение каждого пункта планирования вручную было бы неприятно, поэтому вот что я подумал:

Character(Len=10)::sched="Dynamic"

!$OMP Parallel Do Schedule(sched)
Do i=1,n
    z(i)=a*x(i)+y(i)
End Do
!$OMP End Parallel Do

и тогда я мог бы просто поместить эту символьную переменную 'sched' в каждый параллельный цикл и изменить их все сразу, скажем, поместив sched = "Static", а затем выполнить тест во время выполнения, чтобы увидеть, какая из них прошла быстрее всего! Конечно, это не работает - по крайней мере, не с gfortran или компилятором Absoft. Итак, мой вопрос заключается в одном или всех следующих: почему это не работает ?, как я могу заставить его работать? Или как я могу избежать использования этой конструкции для решения этой проблемы? Любая помощь с благодарностью.

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

Это не сработает, так как режимы на самом деле не являются строками, и я не думаю, что на этом этапе производится оценка переменных. Лучшее, что я могу придумать, это использовать препроцессор, такой как CoCo или C-Preprocessor, чтобы добиться именно этого. Однако, в качестве альтернативы, вы можете использовать режим времени выполнения и использовать либо переменную среды OMP_SCHEDULE, либо процедуру omp_set_schedule для установки режима.

0 голосов
/ 21 августа 2011

Указанное вами планирование будет иметь драматическое влияние на то, как цикл компилируется в машинный код.Как только код скомпилирован, режим планирования заблокирован и не может быть изменен во время выполнения.Я согласен с haraldkl, используйте препроцессор.

...