-
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
Использовать Mu в функциях высших порядков в LibraryEx #181
Comments
А вообще,
которая сама добавляет эти обёртки. И вообще, прогонка по определению выполняет шаги во время компиляции, а это значит, что значение функции |
Задача сводится к изменению всего одной строчки: */
Apply {
- s.Fn e.Argument = <s.Fn e.Argument>;
+ s.Fn e.Argument = <Mu s.Fn e.Argument>;
(t.Closure e.Bounded) e.Argument
} Но не всё так просто. Эта замена приведёт к тому, что в функциях Замедление программы в обычном режиме можно потерпеть, но то, что Влияние на производительностьБыло сделано 4 замера производительности — без правки Выполнялось по 13 замеров с опциями Замеры:
Анализ замеровИспользовался стандартный бенчмарк, моделирующий самоприменение компилятора. Этот бенчмарк является адекватным для рассматриваемой задачи, поскольку использование функций типа Снижение производительности
|
@Cstyler, назначаю эту задачу Вам. Когда реализуете базовый вариант оптимизации |
@Mazdaywik мне нужно объявить __Meta_Mu как интринсик, заменить вызов в Apply на вызов Mu, а затем сделать замеры? |
Да, нужно добавить объявления интринсиков в */
Apply {
- s.Fn e.Argument = <s.Fn e.Argument>;
+ s.Fn e.Argument = <Mu s.Fn e.Argument>;
(t.Closure e.Bounded) e.Argument
} После внесения правок в библиотеки нужно их пересобрать: или запустить |
@Mazdaywik
Библиотека и компилятор успешно скомпилировались, но итоговый компилятор падал при его использовании с ошибкой |
Это особенности скриптов сборки библиотек, библиотеки собираются без стандартного вступления. Нужно добавить не
|
@Mazdaywik Добавление определений интринсиков в |
Посмотрю после экзаменов, почему там не компилируется. |
При использовании Повторил на компиляторе c ветки master, та же самая ошибка. |
This comment has been minimized.
This comment has been minimized.
Не, предыдущему комментарию просьба не верить, он кривой. |
Вот какие правки нужно было вносить, чтобы работало: index b1e4e980..bc5487e5 100644
--- a/src/lib/common/LibraryEx.refi
+++ b/src/lib/common/LibraryEx.refi
@@ -9,7 +9,7 @@
e.Arg, e.Res, e.Bounded ::= e.AnyExpr
*/
Apply {
- s.Fn e.Argument = <s.Fn e.Argument>;
+ s.Fn e.Argument = <Mu s.Fn e.Argument>;
(t.Closure e.Bounded) e.Argument
= <Apply t.Closure e.Bounded e.Argument>;
diff --git a/src/lib/make.bat b/src/lib/make.bat
index 5b47c78c..300fa75e 100644
--- a/src/lib/make.bat
+++ b/src/lib/make.bat
@@ -28,7 +28,7 @@ setlocal
rmdir %TARGET%\x
for %%s in (%LIBS%) do (
- ..\..\bin\rlc-core -C %RLC_FLAGS% %%s -d common
+ ..\..\bin\rlc-core -C %RLC_FLAGS% %%s -d common --prelude=refal5-builtins.refi
..\..\bin\rlc-core --no-sources -R -o inco.bin --incorporated=%%~ns
find "//FROM" < %%s.ref > %TARGET%\%%s.rasl.froms
if exist %%s.cpp move %%s.cpp %TARGET%
diff --git a/src/lib/make.sh b/src/lib/make.sh
index 704914d6..fc65a834 100755
--- a/src/lib/make.sh
+++ b/src/lib/make.sh
@@ -11,7 +11,7 @@ compile_separated() {
for s in ${LIBS}; do
# shellcheck disable=SC2086
- ../../bin/rlc-core -C ${RLC_FLAGS} "$s" -d common
+ ../../bin/rlc-core -C ${RLC_FLAGS} "$s" -d common --prelude=refal5-builtins.refi
../../bin/rlc-core --no-sources -R -o inco.bin --incorporated="$s"
grep '//FROM' < "$s".ref > "$TARGET/$s".rasl.froms
[[ -e "$s".cpp ]] && mv "$s".cpp "$TARGET" |
@Mazdaywik Перед запуском бенчмарков для компилятора, в котором __Meta_Mu интринсик и в Apply вызов заменён, нужно собрать компилятор и библиотеку с |
Так. Что нужно сделать.
Замечу, что ошибка со сборкой библиотек выполнить бенчмарк мне почему-то не помешала. А Вы заметили, что она есть. |
в Apply. Обновление скриптов билда библиотеки #181
Скрипт update-lib.sh принимает флаги через переменную RLC_FLAGS. В benchmark.sh вызывается update-lib.sh без флага RLC_FLAGS. Поэтому при запуске бенчмарка помимо RLMAKE_FLAGS нужно также экспортировать переменную RLC_FLAGS, иначе Mu не оптимизируется. По крайней мере на моих замерах резко уменьшилось кол-во шагов и время компиляции после указания флага RLC_FLAGS=-OiDS. |
Да, для тестов переменную Поэтому без опций |
После записи функции Apply через Mu компилятор стал требовать большего числа шагов для своей работы, из-за чего автотест very-big-function-jump.BAD-SYNTAX.sref стал падать на лимите шагов для компилятора. Этот коммит повышает лимит шагов.
Мотивация
Во-первых, оно нужно для совместимости с
Рефалом-05набором библиотек для Рефала-5 (там используетсяMu
).Во-вторых, в этом случае библиотекой можно будет пользоваться, не зная функций высших порядков — зная только Рефал-5.
Препятствия и его обход
Задача конфликтует с задачей #91 — при непосредственном косвенном вызове (
<s.F …>
) проще специализироватьMap
в эффективную функцию. Если внутриApply
вместо косвенного вызова использоватьMu
, то этоMu
рискует так и остаться невстроенной в программе.Проблема разрешима. Самый бесхитростный ad hoc вариант — объявить
Mu
интринстиком, распознавать оптимизатором лямбду после неё и встраивать.Но, если подумать, правильнее объявлять интринстикамиType
и__FindMuPtr
, которые используются внутриMu
.Другая проблема в том, что функцияMu
выполняется за несколько шагов, которые сокрываются при помощи__Step-Start
и__Step-End
. Даже после встраивания и оптимизации эти две функции сохранятся в остаточной программе. Как вариант, их тоже можно сделать интринстиками, специальным ключом компилятора их вызовы просто удалять.Неактуальные абзацы вычеркнуты, см. #254 и #260.
Но в любом случае об оптимизации думать надо будет тогда, когда ею будем заниматься. Важно, что сложности здесь технические, а не принципиальные.
The text was updated successfully, but these errors were encountered: