В настоящее время я пытаюсь распараллелить некоторый многосеточный код, написанный на 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. Итак, мой вопрос заключается в одном или всех следующих: почему это не работает ?, как я могу заставить его работать? Или как я могу избежать использования этой конструкции для решения этой проблемы? Любая помощь с благодарностью.