apximhd: (Default)
[personal profile] apximhd
У меня сейчас очень много работы по расчету эволюции различных конфигураций задачи трёх тел. Для моделирования несколько лет назад была написана программа, которая использует несколько специфических алгоритмических трюков, о которых я здесь не стану распространяться, позволяющих на порядки уменьшить ошибку численного интегрирования и избежать расходимости решения на больших промежутках времени моделирования (до миллиона периодов обращения, или до 100 млн лет эволюции системы). В этой программе используется большое количество вычислений с плавающей точкой, вычислений квадратных корней и тригонометрических функций.

Первоначально программа была написана на фортране, затем портирована на С практически без изменений логики кода (в основном были заменены передачи параметров по ссылке на передачу параметров по значению для простых типов там, где не нужно возвращать обратно измененные параметры).

Для тестирования использовалась машина с процессором Intel Core i5-3230M 2.6 ГГц, 12 Гбайт оперативной памяти, двумя «чистыми» операционными системами: Linux XUbuntu 16.10 и Windows 10; под последней в свою очередь были установлены ещё две виртуальные машины: VMWare Workstation 12 Player и Oracle VM VirtualBox 5.1.12 — и там, и там была развернута XUbuntu 16.10, которой отводились 4 логических процессора и 4 Гбайт памяти.

Для запуска программы использовался пайтоновский скрипт, запускающий сразу несколько конфигураций (обычно 4 или 8 — в зависимости от числа логических процессоров на используемой машине).

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

Поэтому я протестировал несколько компиляторов, запущенными под разным окружением.
Для запуска под Linux использовались компиляторы gcc и gfortran версии 5.3.0.
Для запуска под Windows — компиляторы MinGW gcc и gfortran версии 5.3.0 и компилятор С/С++ из Visual Studio 2016 версии 19.00.24213.1

При компиляции использовались следующие ключи:
gcc, gfortran: -O3 -ffast-math -funsafe-math-optimizations
Microsoft C/C++: /O2 /Ot /fp:fast

Тестирование показало следующие результаты (приводится время, затраченное на параллельный расчет четырёх конфигураций). В последней колонке отношение времени вычислений к лучшему на данной платформе.

Linux XUbuntu 16.10
gcc                                                         1250 s. 100%
gfortran                                                    1299 s. 104%

Microsoft Windows 10
gcc,      Ubuntu Linux under Oracle VM VirtualBox 5.1.12    1340 s. 100%
gfortran, Ubuntu Linux under Oracle VM VirtualBox 5.1.12    1441 s. 108%
Microsoft C/C++, Microsoft Windows 10                       1459 s. 109%
gcc,      MinGW, Microsoft Windows 10                       1520 s. 113%
gfortran, MinGW, Microsoft Windows 10                       1651 s. 123%
gfortran, Ubuntu Linux under VMWare Workstation 12 Player   1684 s. 126%
gcc,      Ubuntu Linux under VMWare Workstation 12 Player   1785 s. 133%


Почему в последнем случае (под VMWare Workstation 12 Player) фортрановская программа работает быстрее, чем скомпилированная gcc, хотя во всех остальных случаях программа на Си быстрее — загадка великая.
Что-то гремлины из VMWare непонятное у себя накодили. На чистой линукс-машине gcc-программа работает на 4% быстрее gfortran-программы.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting
Page generated Jan. 1st, 2026 06:24 pm
Powered by Dreamwidth Studios