Сокращение времени выполнения программы на Фортране с компиляцией и связыванием флагов в GNU - PullRequest
0 голосов
/ 19 марта 2019

Моя проблема связана со временем выполнения приложения .exe. Мне дали очень большой код (который я знаю, что он не содержит ошибок), но для его запуска требуется слишком много времени. Я скомпилировал его с GNU, и я не могу использовать параллельное программирование, так как на моем компьютере только два процессора.

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

Сначала я использовал флаги -O (лучшее время выполнения было с -Ofast). После этого я попытался улучшить производительность циклов с помощью -fforce-addr, но никакого ощутимого ускорения не произошло. В последнее время я использую другие флаги, такие как -mtune, для создания кода, оптимизированного для локальной машины.

Вот мои основные тесты и результаты:

  • Оригинальная программа (31 с)

COMPOPTS= -pthread -finline-functions -fbacktrace -fzero-initialized-in-bss -fno-automatic -frecord-marker=4 LINKOPTS= -l unlimit -s unlimited

  • Использование -Ofast (25 с)

COMPOPTS= -pthread -finline-functions -fbacktrace -fzero-initialized-in-bss -fno-automatic -frecord-marker=4 -cpp LINKOPTS= -l unlimit -s unlimited

  • Последняя ситуация (24 с)

COMPOPTS= -mtune=native -pthread -finline-functions -fbacktrace -fzero-initialized-in-bss -fno-automatic -frecord-marker=4 -cpp -fforce-addr -fschedule-insns2 -ffp-contract=off LINKOPTS=-l ulimit -s unlimited

У меня есть версия .exe, скомпилированная с Intel, и время ее работы - 7 с. Я знаю, что Intel обычно работает на 20-40% быстрее, чем GNU, поэтому я думаю, что есть место для улучшений.

...