-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Тестирование, рефакторинги, оптимизации и исправления после ВКР #359
Comments
Ранее специализация замыкания {{ &F CONTENT }} осуществлялась как специализация фиктивного вызова <F CONTENT e.@>. Оптимизатор строил новый вызов <F@1 CONTENT′ e.@>, из которого восстанавливалось замыкание {{ &F@1 CONTENT′ }}. Добавлять и удалять фиктивную переменную e.@ было безопасно, т.к. она была в позиции динамического параметра, позиция параметра не менялась (оставалась последней) и во внутрь функции она не протекала. Теперь же при специализации это имя может протечь внутрь экземпляра, внутри экземпляра может оказаться другое замыкание, в контексте которого будет переменная e.@. Добавление e.@ в конец вызовет конфликт имён. ---- В коде есть некоторый костыль, который проистекает из отсутствия поддержки подавления предупреждений. Исходники намеренно собираются с -Werror, а в данном коде было бы разумно явно добавить «подозрительную» (#290) повторную переменную. Пришлось достигать эту проверку более громоздким куском исходного кода.
Самоприменение выполняется в режиме set RLMAKE_FLAGS=-X-OiDPRS
This comment has been minimized.
This comment has been minimized.
До оптимизации после самоприменения в режиме: set RLMAKE_FLAGS=-X-OiDPRS call makeself.bat set RLMAKE_FLAGS=-X-OiDS call makeself.bat со включённым профилем время работы составило 1590 секунд, где-то 50 % времени ушло на проверку отношения Хигмана-Крускала. В актуальной реализации время работы составило 575 секунд, отношение Хигмана-Крускала занимает где-то около процента. Подробности с логами профилировщика в issue.
This comment has been minimized.
This comment has been minimized.
Рекомендуется смотреть коммит с игнорированием пробельных символов.
(комментарий не сворачивать, на него есть ссылка) Функция
Что дальше нужно оптимизировать и как? Рассмотрим построчно.
Дальше разбирать не интересно. |
Эта правка была закоммичена в предыдущем коммите по ошибке.
Комментарий не сворачивать, на него ссылка из #332 (comment). Ещё один из возможных путей оптимизации — учёт частных случаев вида
Если Но пока не очевидно, часто ли будет разбор этого частного случая оправданным. |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Ранее при построении дерева прогонки, из сужений для ветвей извлекались имена используемых переменных. Теперь эти имена возвращаются функцией Solve-Drive. На быстродействие это почти не повлияло. Ранее: ExtractVariables-Expr (0000) -> 11519.0 ms (2.64 %, += 21.06 %) rel step time 0.67 ExtractVariables-Expr (0000) -> 13593437 (3.92 %, += 8.41 %) rel step time 0.67 Теперь: ExtractVariables-Expr (0000) -> 11687.0 ms (2.73 %, += 21.22 %) rel step time 0.71 ExtractVariables-Expr (0000) -> 13442507 (3.87 %, += 8.34 %) rel step time 0.71 Число шагов уменьшилось на 0,05 % (3,92−3,87), а доля времени даже выросла.
Данная правка на время и число шагов функции SimplifyCoordinates-Expr, вопреки ожиданиям, никак не повлияла. Ранее: Total time: 427.50000 s SimplifyCoordinates-Expr (3646) -> 6957.0 ms (1.63 %, += 26.16 %) rel step time 0.90 SimplifyCoordinates-Expr (3646) -> 6259417 (1.80 %, += 24.36 %) rel step time 0.90 SimplifyCoordinates-Expr-Inner (3646) -> 6274.0 ms (1.47 %, += 29.18 %) rel step time 1.17 SimplifyCoordinates-Expr-Inner (3646) -> 4372638 (1.26 %, += 30.18 %) rel step time 1.17 Сейчас: Total time: 422.06200 s SimplifyCoordinates-Expr (5246) -> 6909.0 ms (1.64 %, += 28.27 %) rel step time 0.90 SimplifyCoordinates-Expr (5246) -> 6222848 (1.81 %, += 24.66 %) rel step time 0.90 Число шагов SimplifyCoordinates-Expr даже, почему-то, возросло. Но SimplifyCoordinates-Expr-Inner больше нет, программа ускорилась на сэкономленные ≈6 секунд. Понятно, что это однократный замер, просто интересно совпало.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Соответственно, снижены лимиты для тестов.
Увидел в логе странную картину (этап прогонки экземпляров,
Стало:
Такое впечатление, что не сработало отношение Хигмана-Крускала. |
Сборка коммита a145f6c сломалась: https://github.com/bmstu-iu9/refal-5-lambda/runs/3369437105 Причина, конечно же, распухание программы. Но какое это распухание! Смотрите, было:
Стало:
Полностью
Очевидно, раскрылись все возможные удлинения открытых переменных. Первый образец экранирует все последующие образцы. Правильное полноценное решение — использовать алгоритм распознавания экранирования на проходе оптимизации #346. Возможны ограниченные решения:
|
Отношение Хигмана-Крускала теперь проверяется не только для специализации, но и для прогонки, поэтому тесты имело смысл переименовать.
Ранее из-за этого проверка вложения давала отрицательный результат, если опасно похожие выражения различались замороженностью. Из-за этого иногда разворачивался лишний виток цикла. Автотест специально написан так, чтобы в старой версии программа чрезмерно распухала и тест вылетал с лимитом шагов.
) Добавлено распознавание экранирования, как описано в комментарии #359 (comment) Экранирование распознаётся только в самом низу, при ветвлении. На это есть две причины: 1. Если распознавание экранирования откладывать, то «ациклическая суперкомпиляция» продолжит прогонять бесполезные ветви. Это лишние шаги и лишнее увеличение дерева (которое может достичь и лимита узлов). 2. Формально этого достаточно для прохождения теста opt-tree-spec12.ref в исходном виде, поэтому дополнительно усложнять остальной код я не стал. Экранирования между разными ветвями некритичны.
Распухание происходило из-за прогонки функции Inc. Решение: заменить это определение функции на пометку $INTRINSIC. Но Простой Рефал не поддерживает ключевое слово $INTRINSIC, поэтому автотест пришлось сначала перевести на Рефал-5λ двумя предыдущими коммитами.
Коммит вводит «таксономию» для симметричных клэшей аналогично коммиту 629f85b.
По-нормальному, нужно каждый случай обобщения описать, сделать выводы и решить проблему в общем случае в рамках #332. А пока я анализировал лог и подсекал наиболее явные точки распухания.
Слияние выполняется через два последовательных переименования для сохранения истории правок.
Слияние выполняется через два последовательных переименования для сохранения истории правок.
Слияние выполняется через два последовательных переименования для сохранения истории правок. История правок сохранилась, даже сохранились (в выводе git blame) некоторые строчки авторства @Kaelena!
Только что завершились две выпускные квалификационные работы:
Эти расширения станут основным новшеством версии 3.4. Однако, прямо сейчас создавать новую версию преждевременно по следующим причинам.
@Apakhov и @VladisP намеренно работали с очень ограниченным объёмом кода (в смысле, я ограничил их работу). Работа @Apakhov’а была ограничена файлом
OptTree-Drive-Expr.ref
, работа @VladisP’а — файламиGenericMatch.ref
иOptTree-Spec.ref
. Однако, полноценная реализация новых функций требует изменения куда большего объёма кода (например, скрипта вOptTree.ref
).Ограниченность поля для работы @Apakhov’а и @VladisP’а была намеренной, т.к. этого было достаточно для выполнения содержательной части задачи.
Ациклическая прогонка @Apakhov’а делает ненужной авторазметку прогоняемых функций в том виде, в каком она сейчас есть. Исходно разметка была призвана не допускать пометки
$DRIVE
для рекурсивных функций. Сейчас рекурсивные функции могут иметь метку$DRIVE
, их прогонка не зациклится.Со специализацией без шаблона @VladisP’а становятся ненужными шаблоны в абстрактном синтаксическом дереве. Но, чтобы их удалить, нужны более глубокие правки.
Да, авторазметка для специализации тоже становится ненужной.
Основные компоненты для Универсальная древесная оптимизация $OPT #314 уже реализованы (#251, #322, #340). Фактически в Универсальная древесная оптимизация $OPT #314 нужно реализовать поддержку псевдокомментариев так, как она описана (и в следующем релизе удалить старый синтаксис).
Написанный студентами код может быть неоптимальным, т.к. у них нет опыта в оптимизации Рефала.
Новые оптимизации работают глубже, из-за чего могут выявиться проблемы в других частях системы. В частности, обостряются проблемы с раздуванием программ (Древесные оптимизации раздувают программы #332). На данный момент проблема купирована в 54c28cad9921556d208bc43dc88f55943d7885cb.
Хотя все автотесты выполнились, включая и случайные, тестовое покрытие, выполненное студентами неполное. Требуется более тщательное тестирование.
Автотесты проверяют корректность. Содержательную сторону нужно тестировать вручную.
Даже если обе оптимизации в отдельных ветках работали порознь, при работе вместе возможны проблемы.
Можно удалить
ObjectMatch.ref
, т.к. новый алгоритм сопоставления покрывает этот случай.В первую очередь нужно
The text was updated successfully, but these errors were encountered: