недостаток разделения кода Fortran на подпрограммы и его влияние на скорость? - PullRequest
0 голосов
/ 11 июня 2018

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

Может кто-нибудь помочь мне с некоторыми советами, как оптимизировать программу на фортране, когда она разделена на подпрограммы.особенно когда эта подпрограмма вызывается в большом цикле.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Выявление причины может быть затруднено, равно как и выявление возникновения проблемы такого типа.

Я подозреваю, что кеширование кода может повысить производительность, так что если связанные подпрограммы будут распределены по всей памяти, то "может быть "наказание за производительность.Выявить задержки, связанные с кэшем, трудно.

Если это объяснение, то изменение порядка подпрограмм, добавляемых при связывании, может показать некоторые изменения.Примерами этого возможного подхода являются включение ddotp вблизи сокращения уравнения и может быть эффективной обратная замена daxpy вблизи уравнения.

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

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

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

Я надеюсь, что этот ответ предоставит некоторые возможные области для дальнейшего исследования, но не предоставит четкого объяснения вашей проблемы.

0 голосов
/ 12 июня 2018

Когда большой монолитный код делится на несколько частей, каждая из которых вызывается, возможно, миллионы раз, накладные расходы на вызов каждой подпрограммы или функции, как правило, не пренебрежимо малы (независимо от используемого языка программирования),если компилятор (компоновщик) не может автоматически встроить эти функции.Я подозреваю, что отсутствие встроенной компиляции является источником значительного замедления, которое вы наблюдали в своих кодах.Что касается вашего вопроса № 2, я не мог его понять.Возможно, будет полезен минимальный рабочий пример кода, как предложили @VladimirF и @HighPerformanceMark.

...