Занимательная оптимизация в Фортране
Feb. 10th, 2023 12:28 pmВ попытках разобраться в работе ДИМИПа я нашел его архив на 2148, зона 1640. Это дистрибутив ленты с тестами для прогона приемо-сдаточных испытаний машины. Один из файлов (АЛФ2) начинается так:
ШИФР 522146 ЗСХ‾
ВРЕ 20000‾
АЦПУ 10‾
ЕЕВ1А3
*NАМЕ
*FOREX
*NО LISТ
*NО LОSТ
РRОGRАМ АLFА2
Интересно, времени аж два часа заказано. Пробуем на эмуляторе (с коррекцией стандартного паспорта на ЗС5, если надо):
4113835970 instructions per 145.770314 seconds
4113 миллионов команд - побольше часа будет, но не сильно. Можно было и полтора заказать :)
Теперь пробуем, из компиляторов более или менее "продуктового" качества, Фортран-ГДР и Форекс-3.
Фортран-ГДР: 3689976370 instructions per 144.749899 seconds
Форекс-3: 3816205334 instructions per 139.821562 seconds
То, что на современной машине время выполнения примерно одинаковое, неудивительно - математика идентична, а как там эмулируемые команды к памяти обращаются, через регистры или через МОД/WTC, эмулятору всё равно.
Почему у старого Форекса настолько больше команд, но при этом всё равно он, надо полагать, был быстрее, чем Фортран-ГДР, неясно, но поучительно.
А вот собственно детали разницы между Фортраном-ГДР и Форексом-3. В обоих случаях перечислены десять самых частых команд, составляющих в сумме 92-93% от всех команд:
Фортран-ГДР:
Форекс-3:
Приводя подобные члены (с учетом информации в полном списке), имеем
Почему Форекс делает чуть больше делений, неясно, но это компенсируется минимизацией умножений за счет использования СЛИА(?). Также забавно, что Фортран-ГДР предпочитал обратные вычитания обычным, и что Форекс не сильно жалует совмещённые магазинные команды (xts, stx).
ШИФР 522146 ЗСХ‾
ВРЕ 20000‾
АЦПУ 10‾
ЕЕВ1А3
*NАМЕ
*FOREX
*NО LISТ
*NО LОSТ
РRОGRАМ АLFА2
Интересно, времени аж два часа заказано. Пробуем на эмуляторе (с коррекцией стандартного паспорта на ЗС5, если надо):
4113835970 instructions per 145.770314 seconds
4113 миллионов команд - побольше часа будет, но не сильно. Можно было и полтора заказать :)
Теперь пробуем, из компиляторов более или менее "продуктового" качества, Фортран-ГДР и Форекс-3.
Фортран-ГДР: 3689976370 instructions per 144.749899 seconds
Форекс-3: 3816205334 instructions per 139.821562 seconds
То, что на современной машине время выполнения примерно одинаковое, неудивительно - математика идентична, а как там эмулируемые команды к памяти обращаются, через регистры или через МОД/WTC, эмулятору всё равно.
Почему у старого Форекса настолько больше команд, но при этом всё равно он, надо полагать, был быстрее, чем Фортран-ГДР, неясно, но поучительно.
А вот собственно детали разницы между Фортраном-ГДР и Форексом-3. В обоих случаях перечислены десять самых частых команд, составляющих в сумме 92-93% от всех команд:
Фортран-ГДР:
a*x 1010736718 a+x 478399266 xts 431124820 atx 381444971 xta 350607063 x-a 240800920 a/x 230976187 a-x 128807457 stx 104037573 utm 89989393
Форекс-3:
a*x 825067113 utm 533340773 atx 454212272 a+x 453587923 xta 359330331 xts 327107228 a/x 231176788 a-x 192866836 vlm 88232216 utc 75140872
Приводя подобные члены (с учетом информации в полном списке), имеем
Команда Фортран Форекс a*x 185669605 a+x 24811343 xts 104017592 atx 72767301 xta 8723268 sub 112990095 a/x 200601 stx 103800873 utm 443351380
Почему Форекс делает чуть больше делений, неясно, но это компенсируется минимизацией умножений за счет использования СЛИА(?). Также забавно, что Фортран-ГДР предпочитал обратные вычитания обычным, и что Форекс не сильно жалует совмещённые магазинные команды (xts, stx).