Подтвердить что ты не робот

Чистые подпрограммы в Fortran - Оптимизация компилятора

Недавно я обнаружил использование чистых функций и подпрограмм в Fortran. Из того, что указано в руководстве Fortran, кажется, что большинство моих подпрограмм действительно можно определить как чистые (поскольку я всегда указываю намерение всех аргументов, и обычно у меня нет "сохранения", "паузы" или внешнего ввода-вывода в большинстве моих подпрограмм). Тогда мой вопрос: должен ли я это сделать? Мне было интересно, если компилятор оптимизирует более чистые подпрограммы, или если это просто не имеет значения, или если это может ухудшить ситуацию. Спасибо!

4b9b3361

Ответ 1

Вы работаете с компилятором для генерации хорошего кода, и чем больше информации вы предоставляете компилятору, тем лучше работа, которую вы можете сделать вместе.

Подписывает ли он intent(in) любые фиктивные аргументы, которые вы не изменяете, или используя parameter для констант или явно создавая pure любую подпрограмму, которая не имеет побочных эффектов, или используя forall, когда вам не очень-то нравится порядок, в котором рассчитывается цикл, более подробно о том, что вы хотите, вы выиграете, потому что:

  • теперь компилятор может отмечать больше ошибок во время компиляции - эй, вы изменили этот аргумент, который, как вы сказали, были намерены "в", или вы изменили эту переменную модуля в чистой подпрограмме
  • ваш код станет более понятным для следующего человека, чтобы прийти к нему, не зная, что он должен делать (и этот человек может быть вам три месяца спустя).
  • компилятор может быть более агрессивным с оптимизацией (если у компилятора есть гарантия от вас, что ничто не изменится, оно может перевернуть оптимизацию).

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

Ответ 2

Насколько я знаю, это просто не важно в последовательном режиме. Но если вы активируете опции "автоматическая распараллеливание", тогда компилятор может иногда использовать объявление PURE для параллелизации циклов (многопоточность), содержащих вызовы для чистых подпрограмм (он не может рисковать, если подпрограммы не являются чистыми). По той же причине декларация PURE также полезна для программиста, который хочет установить директивы вручную//(например, OpenMP), поскольку риск возникновения проблем с такими процедурами довольно ограничен. Часто можно распараллелить циклы с вызовами нечетных подпрограмм, но для этого требуется глубокая проверка...