diff --git a/docs/reprint-ledger.tsv b/docs/reprint-ledger.tsv index ff0ce1bc4..c795e32da 100644 --- a/docs/reprint-ledger.tsv +++ b/docs/reprint-ledger.tsv @@ -1,4 +1,5 @@ # ЧТО: ведомость заходов побайтовой сверки и перепечатки семени — строка на заход: дата, что (сверка|печать), итог, секунд, пик-ГиБ, байт-вывода, потолок-шагов, откуда; заполняется руками после захода. ЗАЧЕМ: сверка стоит 8 ч 34 мин одного ядра и на каждый пуш в CI не зовётся; без записи следующий не узнает, что она была, и свежесть сверки останется красной при сделанной работе. КТО ЧИТАЕТ: scripts/seed/reprint-freshness.flang (дата последней строки «сверка … дошла»; строки без табуляции, как эта, пропускает); .github/workflows/reprint.yml, scripts/bootstrap-reprint.sh и scripts/seed/seed-freshness.fscript называют файл человеку в подсказках. +# ★СОПОСТАВИМОСТЬ: строки ДО 1 октября 2026 сняты двоичным БЕЗ памяти вызовов ядра (ADR-0051, задача 5709) — сравнивать их с заходами 4 октября нельзя. Сопоставление: 36 839 с (17 сентября, без памяти) против 4736 с захода 4 октября на gpu — в 7,8 раза; тем же деревом задача 5709 мерила полную печать с памятью в 2 ч 05 мин 37 с (заход 7). СКОРОСТЬ В ШАГАХ ЗА СЕКУНДУ — НЕГОДНАЯ МЕРА: запомненный памятью вызов засчитывается шагами, но не исполняется, и между соседними отметками пульса счётчик идёт то 85 млн, то 2,4 млрд шагов/с (замер 4 октября 2026). Цену писать только секундами от начала до конца ДОШЕДШЕГО прогона, а проценты потолка — как расход, не как скорость. ПРИБОР, КОТОРЫМ ЦЕНА МЕРИТСЯ САМА: печать печатает «ЗАПАС ШАГОВ НА ИСХОДЕ: «<стадия>» съел N шагов из M (K %)», когда расход переваливает ПОЛОВИНУ потолка (порог в flang/src/emit/c/flang_repl.c:2324, строка repl_ctx.steps > repl_ctx.max_steps / 2) — эта строка в журнале захода и есть замер цены суда, и из неё берётся потолок следующего захода. дата что итог секунд пик-ГиБ байт-вывода потолок-шагов откуда 2026-08-22 сверка дошла 1198 25.1 26180580 1000000000 коммит 6c5d805c 2026-08-23 печать оборвана-шаги 1456 34.3 0 1000000000 /srv/work/raskrutka-polnaya.log @@ -12,3 +13,7 @@ 2026-08-30 печать дошла 30842 0 38958005 1400000000000 время по меткам файлов /srv/flang-rabota/m-reprint-5, итог — коммит c15f669f; пик не замерен 2026-09-08 сверка дошла 16895 36.3 39710602 1400000000000 коммит f2945456, /usr/bin/time -v; журнал scratchpad/g6/g6.log 2026-09-17 печать дошла 36839 34.9 43300122 1400000000000 коммит 68ff03b34, задача 5190; /srv/tmp/dokazuemyy/raskrutka-5190.log; копия wSemya, дерево не правилось +2026-09-25 печать дошла 128700 0 0 4000000000000 заход 23–25 сентября 2026, названный в шапке scripts/bootstrap-reprint.sh («шёл 35 ч 45 мин») и в .github/workflows/reprint.yml; строки о нём в ведомости не было — задача 6704. Пик не замерен, байты вывода не записаны: журнала этого захода дерево не называет +2026-10-04 печать дошла 6890 0 0 0 печать БЕЗ СУДЬИ (стадия суда доказательств не прогонялась): 114 мин 50 с = 6890 с, 7 файлов, пересборка напечатанного 1 мин 17 с. ЧУЖОЙ ЗАМЕР — число пришло отчётом агента того же дня, журнала он не назвал, своим прибором здесь не снято. Пик не замерен, байты вывода не записаны, потолок шагов не записан — поля стоят нулями, как в строке 30 августа. Сравнивать её с заходом С судьёй того же дня (4736 с) НЕ МЕРИЛ: машина этого захода не названа, а приводить заходы к одной машине шагами за секунду нельзя — см. шапку выше +2026-10-04 печать снята 4989 41.6 0 4000000000000 dev (эта машина), журнал /home/b/projects/flang-cluster/print-batch.log: начало 16:53:13 UTC — шапка журнала, последняя строка «Terminated» по метке файла 18:16:22 UTC, то есть 4989 с = 1 ч 23 мин 09 с. Снята SIGTERM от harness на 19 % стадии «Проверить доказательства с кешем» (791 570 926 679 шагов из 4 000 000 000 000), дерево 89d38a5c5. Пик 41,6 ГиБ — наибольшая отметка пульса печати, не /usr/bin/time; вывода нет +2026-10-04 печать дошла 4736 50.6 44661951 4000000000000 gpu, журнал /home/u/b-print-0725-print.log (только чтение): начало 18:24:13 UTC — первая строка журнала, конец 19:43:09 UTC — время последней записи файла (stat -c %y), 4736 с = 1 ч 18 мин 56 с. Итог словами журнала: «напечатанное собрано и спрошено ДО того, как легло в bootstrap/ — семя годное»; вывод — строка «итого 7 файлов, 44661951 байт в bootstrap/». Дерево — партия пяти работ (точное целое только тип, заголовки Makefile, точное в десять целей, предел ресурсов, плюс ствол с починкой LSP); git в той копии не было, отпечаток говорит «коммит нет-git». Суд съел 2 508 501 226 319 шагов из 4 000 000 000 000 (62 %) — печать сама напечатала «ЗАПАС ШАГОВ НА ИСХОДЕ» о стадиях «Проверить доказательства с кешем» и «Итог суда ядра». Пик 50,6 ГиБ — наибольшая из 143 отметок пульса самой печати (стадия «Напечатать связанное»), не /usr/bin/time; на стадии суда пик 50,0 ГиБ diff --git a/docs/tasks/8570-the-print-is-outrun-because-it-is-slow.md b/docs/tasks/8570-the-print-is-outrun-because-it-is-slow.md deleted file mode 100644 index 857450425..000000000 --- a/docs/tasks/8570-the-print-is-outrun-because-it-is-slow.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -номер: 8570 -заголовок: Перепечатка компилятора идёт десять часов при цели в два, и за это время ствол успевает её обогнать -статус: свободна -приоритет: P1 -исполнитель: — -ветка: — -команда: любая -карта: Что мешает больше всего -рядом: 5709 -нужность: длинная перепечатка отстаёт от ствола раньше, чем кончается; короткая успевает ---- - -# 8570. Перепечатка компилятора идёт десять часов при цели в два, и за это время ствол успевает её обогнать - -Входы печати (`flang/self/**`) правят примерно раз в час. Перепечатка, которая -идёт дольше, кончается на дереве, которого в стволе уже нет. Темп правок менять -не нужно; нужно укоротить печать. - -## Шаги воспроизведения - -1. `tail -1 docs/reprint-ledger.tsv | cut -f1-4` -2. Поимённая ведомость на дороге печати: - `FLANG_TICKS_OUT=<файл> bootstrap/flang emit flang/self/lexer.flang --target c --out <каталог>` -3. Поимённая ведомость на дороге суда: - `FLANG_TICKS_OUT=<файл> bootstrap/flang check flang/self/tags.flang` -4. Доли по ведомости: `заряд` каждой функции против строки `заряда всего`. - -## Что происходит - -``` -$ tail -1 docs/reprint-ledger.tsv | cut -f1-4 -2026-09-17 печать дошла 36839 -``` - -Последняя ЗАПИСАННАЯ печать шла 36 839 секунд — 10 часов 14 минут. Печать -0.7.24, прошедшая после неё, шла 37 700–38 000 с (10 ч 28 мин — 10 ч 33 мин) -при пике 46,6 ГиБ — числа с захода на gpu, здесь своим прибором не снятые; -строки за эту печать в ведомости нет (задача 6704). Цель — два часа, и разрыв -пятикратный. - -Куда уходит расход — снято ведомостью по именам, двумя прогонами, 3 октября -2026 на семени этого дерева. - -Дорога печати, `emit flang/self/lexer.flang --target c`: 1 241 368 349 шагов, -7,3 с, заряда всего 1 225 645 027. - -| доля заряда | функция | где живёт | -|---:|---|---| -| 24,19 % | «Первые слова» | `flang/self/lexer.flang` | -| 22,22 % | «Печать литерала без проверок» | печатник C | -| 15,20 % | «Закрыть уровни» | `flang/self/lexer.flang` | -| 10,03 % | «Склеить» | `flang/self/lexer.flang` | -| 0,09 % | «Первое определение по имени» | `flang/self/proof-kernel.flang` | -| 0,001 % | «Развернуть» | `flang/self/proof-kernel.flang` | - -Дорога суда, `check flang/self/tags.flang`: 996 771 858 шагов, 30,4 с, заряда -всего 933 032 933. - -| доля заряда | функция | где живёт | -|---:|---|---| -| 19,98 % | «Первые слова» | `flang/self/lexer.flang` | -| 18,28 % | «Закрыть уровни» | `flang/self/lexer.flang` | -| 14,35 % | «Прогон цикла» | `flang/self/interpret.flang` | -| 2,21 % | «Первое определение по имени» | `flang/self/proof-kernel.flang` | -| 0,02 % | «Развернуть» | `flang/self/proof-kernel.flang` | - -Три вещи, которые эта ведомость называет прямо: - -1. **«Развернуть» главной строкой расхода не является** — 0,02 % заряда на - дороге суда и 0,001 % на дороге печати. Перебор обрывается на первом - совпадении («Первое определение по имени», `proof-kernel.flang:2024`), и - обрыв стоит дороже самой «Развернуть» в сто раз. -2. **«Описания программы», «Описание с именем» и «Имена содержат имя» в - ведомости НЕ ПОЯВЛЯЮТСЯ ни на одном из двух прогонов** — ноль входов при - строке `не поместилось 0`. Повтор имени проверяется встроенной формой - `содержит` над списком имён (`flang/self/interpret.flang:898`), словарь - описаний у записи «Программа» уже есть (`Узел хеша`, строка 174), поиск - описания идёт через «Найти описание», а подготовка программы делается ОДИН - раз на программу (`flang/self/bootstrap/compiler.flang:1769`). Квадрата - N·(N+1)/2 на подготовке программы здесь нет. -3. Дорогое — лексер и печать строковых литералов. Четыре имени из - `flang/self/lexer.flang` («Первые слова», «Закрыть уровни», «Склеить», - «Читать имя») дают 54,6 % заряда на дороге печати (24,19 + 15,20 + 10,03 + - 5,14) и 50,1 % на дороге суда (19,98 + 18,28 + 6,48 + 5,34). «Печать - литерала без проверок» и «Печать литерала» вместе — 27,3 % дороги печати - (22,22 + 5,09). - -Стадия, съедающая печать целиком, названа числом не здесь, а в -`docs/print-cost-measured.md`: «Проверить доказательства с кешем» — 85,79 % -шагов захода, и у неё есть выключенный файловый кеш. Порядок работ по этой -стадии — задача 5709. - -Версия: flang 0.7.23, 3 октября 2026. Сама перепечатка этим заходом не -запускалась: обе ведомости сняты на малых прогонах, и переносить их на дерево в -54 раза больше линейно нельзя — цена суда растёт как квадрат числа обязательств -(`docs/print-cost-measured.md`, раздел 4). - -## Что должно быть - -Полная перепечатка идёт не дольше двух часов. Порядок замеров и прежние числа — -`docs/reprint-cost.md`, строки заходов — `docs/reprint-ledger.tsv`. - -## Обходной путь - -Разовая заморозка всех входов печати на время одного захода, объявленная -заранее. Как постоянный порядок не годится: останавливает работу над -компилятором. - -## Когда задача сделана - -1. Снята поимённая ведомость САМОЙ перепечатки — `FLANG_TICKS_OUT` в вызове - `emit` внутри `scripts/bootstrap-reprint.sh`, а не перенос с малых прогонов; - названы часы, шаги и загрузка машины на начало и конец захода (`uptime`). - Часы разных дней без загрузки не сравнимы. Цена прибора измерена: 0,6 %. -2. Главная строка расхода по ЭТОЙ ведомости названа числом, и после правки её - доля заряда на том же прогоне и тем же прибором НИЖЕ, чем до. Доли меньше - процента в довод не берутся: прогон их уже показывает нулями. -3. В `docs/reprint-ledger.tsv` есть строка печати с числом секунд не больше 7200. -4. `sh scripts/bootstrap-reprint.sh --bystro` на стволе после вливания отвечает - кодом 0. - -## Где живёт правка - -- `flang/self/lexer.flang`: «Первые слова», «Закрыть уровни», «Склеить», - «Читать имя» — первая по расходу семья на обеих дорогах. Ни одна из них не - зовётся из ядра доказательств, это работа разбора, и она идёт заново на - каждом разборе исходника. -- `flang/self/emit-c.flang` и печатник C: «Печать литерала без проверок», - «Печать литерала» — вторая семья, 27,3 % дороги печати. -- Стадия «Проверить доказательства с кешем» и её кеш — задача 5709, там же - порядок «дешевле → дороже» и цена каждого шага. -- `flang/self/proof-kernel.flang` входит в ядро решений: рост числа строк - требует довода в `flang/scripts/kernel-lines-to-trust-ceiling.json`. -- Запись замеров: `docs/reprint-cost.md`, `docs/reprint-ledger.tsv`. - -Правка в `flang/self/**` доезжает до двоичного только перепечаткой. diff --git a/docs/tasks/8570-the-print-runs-out-of-steps-not-of-hours.md b/docs/tasks/8570-the-print-runs-out-of-steps-not-of-hours.md new file mode 100644 index 000000000..0ec4c073f --- /dev/null +++ b/docs/tasks/8570-the-print-runs-out-of-steps-not-of-hours.md @@ -0,0 +1,266 @@ +--- +номер: 8570 +заголовок: Перепечатка стоит 1 ч 19 мин, а не десять часов, и упирается теперь в потолок шагов +статус: в работе — цена снята и вписана в ведомость четырьмя строками (4 октября: 4736 с дошла, 4989 с снята, 6890 с без судьи; 25 сентября: 128 700 с дошла); прежнее «десять часов» было последней ЗАПИСАННОЙ строкой, а не ценой; скорость в шагах за секунду снята как негодная мера +приоритет: P1 +исполнитель: a +ветка: a/user-stories-and-the-reprint-ledger +команда: любая +карта: Что мешает больше всего +рядом: 5709, 6704 +нужность: цель в два часа достигнута, но суд съел 62 % потолка шагов — следующее дерево в прежний потолок не поместится, и печать умрёт не от длины, а от предела +--- + +# 8570. Перепечатка стоит 1 ч 19 мин, а не десять часов, и упирается теперь в потолок шагов + +Прежний заголовок этой задачи — «идёт десять часов при цели в два» — врал, и +врал не оценкой, а **пропуском в ведомости**. Число «десять часов» = 36 839 с — +последняя ЗАПИСАННАЯ строка `docs/reprint-ledger.tsv`, 17 сентября 2026. После +неё заходов было много, и ни один не был вписан: ведомость заполняется руками +после захода (её собственная шапка), прибора полноты у неё нет (задача 6704). +Четыре пропущенных захода вписаны этой правкой. + +## Шаги воспроизведения + +1. `tail -4 docs/reprint-ledger.tsv | cut -f1-5` +2. `awk -F'\t' '$2=="печать" && $3=="дошла"{print $1, $4}' docs/reprint-ledger.tsv | tail -3` +3. `grep -n 'ЗАПАС ШАГОВ НА ИСХОДЕ' flang/src/emit/c/flang_repl.c` + +## Что происходит + +``` +$ awk -F'\t' '$2=="печать" && $3=="дошла"{print $1, $4}' docs/reprint-ledger.tsv | tail -3 +2026-09-25 128700 +2026-10-04 6890 +2026-10-04 4736 +``` + +Строки 4 октября стоят так нарочно: у захода БЕЗ СУДЬИ времени суток нет (чужой +замер), и он поставлен первым, чтобы последней дошедшей строкой ведомости был +заход С СУДЬЁЙ — 4736 с. Иначе `awk` отдавал бы 6890 с, и отказ скрипта, +который берёт «цену последнего дошедшего захода», называл бы цену печати без +судьи. + +**Дошедший заход 4 октября 2026 на gpu стоил 4736 с = 1 ч 18 мин 56 с** — цель в +два часа перекрыта, разрыв не пятикратный, а отрицательный. Числа этого захода — +из журнала `/home/u/b-print-0725-print.log` на gpu (только чтение): + +| что | число | откуда | +|---|---:|---| +| начало | 18:24:13 UTC | первая строка журнала | +| конец | 19:43:09 UTC | время последней записи файла, `stat -c %y` | +| заход целиком | 4736 с | разность двух строк выше | +| напечатано | 7 файлов, 44 661 951 Б | строка «итого 7 файлов, 44661951 байт в bootstrap/» | +| пик памяти | 50,6 ГиБ | наибольшая из 143 отметок пульса печати; на стадии суда 50,0 ГиБ | +| суд ядра | 2 508 501 226 319 шагов из 4 000 000 000 000 (62 %) | строка «ЗАПАС ШАГОВ НА ИСХОДЕ» | + +Итог словами журнала: «напечатанное собрано и спрошено ДО того, как легло в +`bootstrap/` — семя годное». Дерево захода — партия пяти работ (точное целое +только тип, заголовки Makefile, точное в десять целей, предел ресурсов, плюс +ствол с починкой LSP); git в той копии не было, и отпечаток входов печати +говорит «коммит нет-git» — хеша у этого захода нет. + +Почему разрыв с 17 сентября — **7,8 раза**, а не работа дерева: с 1 октября +двоичный несёт память вызовов ядра (ADR-0051, задача 5709). Строки ведомости ДО +1 октября сняты без неё, и сравнивать их с нынешними нельзя; это сказано теперь +в шапке самой ведомости. Задача 5709 мерила полную печать с памятью в +2 ч 05 мин 37 с (заход 7) против 10 ч 14 мин у строки 17 сентября. + +## Прибор, которым цена мерится сама + +Печать называет свою цену **без отдельного замера**: на пороге в половину +потолка шагов она печатает строку + +``` +ЗАПАС ШАГОВ НА ИСХОДЕ: «Итог суда ядра» съел 2508501226319 шагов из 4000000000000 (62 %). Рост дерева +в полтора раза стоит вдвое с лишним — то, что перевалило за половину, в +следующий раз не поместится. +``` + +Порог — `repl_ctx.steps > repl_ctx.max_steps / 2` +(`flang/src/emit/c/flang_repl.c:2324`), строка печатается один раз и уже ПОСЛЕ +конца шага, то есть ничего не стоит на горячем пути. Это и есть прибор цены +суда: его число ставится в поле `потолок-шагов` следующего захода, а не +угадывается. Поимённой ведомости (`FLANG_TICKS_OUT`) он не заменяет — он +называет стадию, а не функцию. + +## Что осталось больно: потолок, а не часы + +Заход 4 октября съел 62 % потолка и сам сказал, что следующее дерево в него не +поместится. Потолок поднят с 4 до 8 трлн коммитом `3f9b9a77b` +(`MAX_STEPS` и `MEASURED_COST` в `scripts/bootstrap-reprint.sh`; у печатника свой +вшитый `FL_MAX_STEPS`, он поднят тоже). На 4 октября этот коммит живёт в ветке +`a/print-batch-exact-integer-and-makefile-headers` и в `dev` не влит — проверять +`grep -n 'MAX_STEPS=' scripts/bootstrap-reprint.sh`. Заход 2 того же дня +(`/home/u/b-print-0726-print.log`, начало 19:35:07 UTC) идёт уже под 8 трлн и +предупреждения «ЗАПАС ШАГОВ НА ИСХОДЕ» **не печатает** — подъём потолка сделал +ровно то, ради чего делался. Его секунды в ведомость не вписаны: заход ещё идёт, +и писать цену с потолка нельзя. + +Два числа того же дня, которые держат эту задачу открытой: + +- **снята**: местный заход на dev умер по SIGTERM от harness на 19 % стадии + «Проверить доказательства с кешем» после 4989 с = 1 ч 23 мин 09 с, пик + 41,6 ГиБ (`/home/b/projects/flang-cluster/print-batch.log`, начало 16:53:13 + UTC, последняя строка «Terminated» по метке файла 18:16:22 UTC). Печать длиной + в час с лишним не выживает в сессии, которую гасит harness. +- **без судьи**: 6890 с = 114 мин 50 с, 7 файлов, пересборка 1 мин 17 с. Это + ЧУЖОЙ ЗАМЕР: число пришло отчётом агента того же дня, журнала он не назвал, + своим прибором здесь не снято. Сравнивать его с 4736 с **не мерил**: машина + того захода не названа, а привести два захода к одной машине шагами за секунду + нельзя — см. ниже. + +## Где уходит расход — ведомость по именам на малых прогонах + +Снято двумя прогонами 3 октября 2026 на семени 0.7.23; **перенести на дерево в +54 раза больше линейно нельзя** — цена суда растёт как квадрат числа +обязательств (`docs/print-cost-measured.md`, раздел 4). + +Дорога печати, `emit flang/self/lexer.flang --target c`: 1 241 368 349 шагов, +7,3 с, заряда всего 1 225 645 027. + +| доля заряда | функция | где живёт | +|---:|---|---| +| 24,19 % | «Первые слова» | `flang/self/lexer.flang` | +| 22,22 % | «Печать литерала без проверок» | печатник C | +| 15,20 % | «Закрыть уровни» | `flang/self/lexer.flang` | +| 10,03 % | «Склеить» | `flang/self/lexer.flang` | +| 0,09 % | «Первое определение по имени» | `flang/self/proof-kernel.flang` | +| 0,001 % | «Развернуть» | `flang/self/proof-kernel.flang` | + +Дорога суда, `check flang/self/tags.flang`: 996 771 858 шагов, 30,4 с, заряда +всего 933 032 933. + +| доля заряда | функция | где живёт | +|---:|---|---| +| 19,98 % | «Первые слова» | `flang/self/lexer.flang` | +| 18,28 % | «Закрыть уровни» | `flang/self/lexer.flang` | +| 14,35 % | «Прогон цикла» | `flang/self/interpret.flang` | +| 2,21 % | «Первое определение по имени» | `flang/self/proof-kernel.flang` | +| 0,02 % | «Развернуть» | `flang/self/proof-kernel.flang` | + +Три вещи, которые эта ведомость называет прямо: + +1. **«Развернуть» главной строкой расхода не является** — 0,02 % заряда на + дороге суда и 0,001 % на дороге печати. Перебор обрывается на первом + совпадении («Первое определение по имени», `proof-kernel.flang:2024`), и + обрыв стоит дороже самой «Развернуть» в сто раз. +2. **«Описания программы», «Описание с именем» и «Имена содержат имя» в + ведомости НЕ ПОЯВЛЯЮТСЯ ни на одном из двух прогонов** — ноль входов при + строке `не поместилось 0`. Повтор имени проверяется встроенной формой + `содержит` над списком имён (`flang/self/interpret.flang:898`), словарь + описаний у записи «Программа» уже есть (`Узел хеша`, строка 174), поиск + описания идёт через «Найти описание», а подготовка программы делается ОДИН + раз на программу (`flang/self/bootstrap/compiler.flang:1769`). Квадрата + N·(N+1)/2 на подготовке программы здесь нет. +3. Дорогое — лексер и печать строковых литералов. Четыре имени из + `flang/self/lexer.flang` («Первые слова», «Закрыть уровни», «Склеить», + «Читать имя») дают 54,6 % заряда на дороге печати (24,19 + 15,20 + 10,03 + + 5,14) и 50,1 % на дороге суда (19,98 + 18,28 + 6,48 + 5,34). «Печать + литерала без проверок» и «Печать литерала» вместе — 27,3 % дороги печати + (22,22 + 5,09). + +Стадия, съедающая печать целиком, названа числом в +`docs/print-cost-measured.md`: «Проверить доказательства с кешем» — 85,79 % +шагов захода. Её кеш и порядок работ по ней — задача 5709; память вызовов +ADR-0051 оттуда и пришла, и 7,8 раза выше — её след. + +## Негодная мера: шагов в секунду + +Три места дерева приводят заходы к одной машине ЧЕРЕЗ СКОРОСТЬ В ШАГАХ ЗА +СЕКУНДУ — `.github/workflows/reprint.yml` (строки 36–40 и 127–128: «21,6 против +около 68 млн шагов/с») и шапка `scripts/bootstrap-reprint.sh` (строки 249–251 и +282–285: «23,16 млн шагов/с», «от 2,9 до 19,4 часа», «от 8,2 до 55,6 часа»). +**Эта мера негодна, и довод у неё отрицательный, снятый прогоном 4 октября +2026:** между двумя соседними отметками пульса одной и той же печати счётчик +шёл то 85 млн, то 2,4 млрд шагов/с — разница в 28 раз внутри одного захода. + +Причина — память вызовов ядра (ADR-0051): **запомненный вызов засчитывается +шагами, но не исполняется.** Вместе с ответом запоминаются шаги, которые вызов +стоил, и на попадании они начисляются заново — чтобы предел шагов и глубина +считались так же, как без памяти. Для предела это правильно, для часов — нет: +шаг, начисленный с попадания, стоит нуля секунд. + +Отсюда правило для этой задачи и для ведомости: + +- цена захода пишется **только секундами от начала до конца ДОШЕДШЕГО + прогона**; +- проценты потолка («съел 62 %») — это **расход**, а не скорость, и часов из + них не выводится; +- оценка «успеет/не успеет» по шагам в секунду снимается как негодная; чтобы + сравнить две машины, нужен один и тот же заход на обеих, а не пересчёт. + +Три места выше правкой этой задачи не тронуты, и причина у каждого своя. В +`scripts/bootstrap-reprint.sh` часы переписаны (см. ниже), а пересчёт через шаги +в секунду оставлен: он стоит в блоке `MEASURED_COST`, который переписывает +коммит `3f9b9a77b`, поднимающий потолок, — две правки одних строк столкнулись бы +при своде. `.github/workflows/reprint.yml` — отдельная работа. Что они говорят +негодной мерой, сказано здесь, чтобы следующий не взял их числа за цену. + +## Протухшее число меняло чужую работу + +4 октября 2026 исполнитель другой работы прочитал в шапке +`scripts/bootstrap-reprint.sh`, что дошедший заход стоит от 6 ч 23 мин до +35 ч 45 мин, и НЕ стал гонять перепечатку; второй прочитал в ведомости +«8 ч 34 мин». Это и есть цена протухшего числа: не неточность в прозе, а +отменённая работа. + +Шапка скрипта поправлена **нулевым ростом строк** — заслон +(`.githooks/no-growth.fscript`) отказывает прибавке строк в оболочку, поэтому +переписаны существующие: 14 строк заменены на 14. Что теперь говорит скрипт: + +| место | было | стало | +|---|---|---| +| цена `--check` | 8 ч 34 мин 02 с, 30 августа | 1 ч 18 мин 56 с (4736 с), 4 октября | +| отказ `--bystro` человеку | «цена — 8 ч 34 мин» | «цена — 1 ч 19 мин» | +| каталог печати | «39 МБ и полдня работы» | «45 МБ и час с лишним», 44 661 951 байт, пик 50,6 ГиБ | +| «печать идёт шесть часов», 5 мест | шесть часов | час с лишним | + +Блок `MEASURED_COST` и `MAX_STEPS` не тронут нарочно: его переписывает коммит +`3f9b9a77b`, и «35 ч 45 мин» там останется до его вливания. + +## Что должно быть + +Полная перепечатка идёт не дольше двух часов — **выполнено, 4736 с**. Заход +помещается в потолок шагов с запасом не меньше вдвое, и каждый заход попадает +строкой в `docs/reprint-ledger.tsv` не памятью того, кто его вёл, а прибором +(задача 6704). Порядок замеров и прежние числа — `docs/reprint-cost.md`. + +## Обходной путь + +Разовая заморозка всех входов печати на время одного захода, объявленная +заранее. При цене 1 ч 19 мин она больше почти не нужна: входы печати правят +примерно раз в час, и заход теперь укладывается между правками. + +## Когда задача сделана + +1. Снята поимённая ведомость САМОЙ перепечатки — `FLANG_TICKS_OUT` в вызове + `emit` внутри `scripts/bootstrap-reprint.sh`, а не перенос с малых прогонов; + названы часы, шаги и загрузка машины на начало и конец захода (`uptime`). + Часы разных дней без загрузки не сравнимы, а пересчёт через шаги в секунду + негоден (см. выше) — значит загрузка обязательна. Цена прибора измерена: + 0,6 %. **Не сделано.** +2. Главная строка расхода по ЭТОЙ ведомости названа числом, и после правки её + доля заряда на том же прогоне и тем же прибором НИЖЕ, чем до. Доли меньше + процента в довод не берутся: прогон их уже показывает нулями. **Не сделано**; + стадия названа («Итог суда ядра», 62 % потолка), функция внутри неё — нет. +3. В `docs/reprint-ledger.tsv` есть строка печати с числом секунд не больше + 7200. **Сделано: 4736 с, 4 октября 2026.** +4. `sh scripts/bootstrap-reprint.sh --bystro` на стволе после вливания отвечает + кодом 0. **Не мерил: заход печати идёт на gpu, и второй на той же машине + рядом не пускается.** + +## Где живёт правка + +- Запись замеров: `docs/reprint-ledger.tsv` (строка на заход, шапка — о + несопоставимости строк до 1 октября), `docs/reprint-cost.md`. +- Потолок шагов: `scripts/bootstrap-reprint.sh` (`MAX_STEPS`, `MEASURED_COST`) и + вшитый `FL_MAX_STEPS` печатника — поднимаются вместе, иначе заход умирает на + том из двух, который ниже. +- Прибор цены суда: `flang/src/emit/c/flang_repl.c:2324` — порог в половину + потолка; править нечего, читать в журнале захода. +- Стадия «Проверить доказательства с кешем» и её кеш — задача 5709. +- Полнота ведомости прибором — задача 6704. +- `flang/self/lexer.flang` и `flang/self/emit-c.flang` — первые две семьи + расхода на малых прогонах; правка там доезжает до двоичного только + перепечаткой. diff --git a/scripts/bootstrap-reprint.sh b/scripts/bootstrap-reprint.sh index e661d6d20..a807c05bd 100644 --- a/scripts/bootstrap-reprint.sh +++ b/scripts/bootstrap-reprint.sh @@ -418,7 +418,7 @@ MAX_DEPTH=20000 # Молчание — приборы на месте. Хоть одна строка «НЕТ» — печатник собран из # одного семени, и пускать его нельзя. -# Отказ вместо шести часов впустую. Проверяется до всякой работы: заход с +# Отказ вместо часа впустую. Проверяется до всякой работы: заход с # потолком ниже измеренной цены не дойдёт до конца, и знать это надо ДО того, # как машина занята на ночь, а не после. if [ "$MAX_STEPS" -lt "$MEASURED_COST" ]; then @@ -434,9 +434,9 @@ NOT_SEED="README.md flang flang.exe flang_cli flang_cli.exe libcompiler_flang.a # ── ОТПЕЧАТОК ВХОДОВ ПЕЧАТИ: чем сверять семя, когда печатать нечем ────────── # # `--check` сверяет побайтно и потому ПЕЧАТАЕТ ЗАНОВО. Цена — последний -# ДОШЕДШИЙ до конца заход печати, 30 августа 2026: 8 ч 34 мин 02 с -# (docs/reprint-ledger.tsv). Столько на каждое слияние не потратить, и оттого -# сверку не звал никто. +# ДОШЕДШИЙ до конца заход печати, 4 октября 2026: 1 ч 18 мин 56 с, 4736 с +# (docs/reprint-ledger.tsv). Прежде стоило 8 ч 34 мин, и оттого +# сверку не звал никто; с памятью вызовов ядра цена упала в 7,8 раза. # # ЗДЕСЬ СТОЯЛО «5 ч 30 мин 07 с и 258,9 ГиБ, 24 августа». Время с тех пор # ВЫРОСЛО, а память УПАЛА, и путать оси нельзя: три захода 31 августа 2026 тем @@ -689,9 +689,9 @@ same_numbers_in_second_print() { # ── Будет ли чем проверить напечатанное: спрашивается ДО печати ───────────── # -# Печать идёт шесть часов (заход 29 августа 2026: 6 ч 23 мин). Узнать в конце -# этих шести часов, что проверять нечем — нет `make`, нет `cc`, пропал файл -# пробы, — значит потратить их впустую. Тот же довод, что у проверки потолка +# Печать идёт час с лишним (заход 4 октября 2026: 1 ч 18 мин 56 с). В конце +# этого часа, что проверять нечем — нет `make`, нет `cc`, пропал файл пробы, +# — значит потратить его впустую. Тот же довод, что у проверки потолка # в шапке: отказ до работы, а не после. can_check() { missing=0 @@ -916,7 +916,7 @@ build_and_ask() { fi # Срок пробе. Двоичный несёт потолок в $MAX_STEPS шагов, и незавершающаяся - # проба считалась бы под ним часами — после шести часов печати это худший из + # проба считалась бы под ним часами — после часа печати это худший из # исходов. Замер пробы: 0,63 с; срок 600 с — тысячекратный запас. Нет # `timeout` — проба идёт без срока, и это сказано вслух, а не умолчано. deadline= @@ -3399,13 +3399,13 @@ if [ "$mode" = fast ]; then err "правка легла в flang/self/proof-record.flang и на корпусе не работает ни разу)." err "" err "Чинится ровно одним — перепечаткой: sh scripts/bootstrap-reprint.sh" - err "Цена последнего дошедшего захода — 8 ч 34 мин (docs/reprint-ledger.tsv)." + err "Цена последнего дошедшего захода — 1 ч 19 мин (docs/reprint-ledger.tsv)." err "Пока перепечатки нет, честный ответ прибора — красный, а не число." err "Кому нужно прежнее поведение (отставание числом, код 0) — --terpimo." exit 1 fi -# Проверить итог печати будет нечем? Узнать это надо ДО шести часов работы, а не +# Проверить итог печати будет нечем? Узнать это надо ДО часа работы, а не # после — тот же довод, что у проверки потолка в шапке. if [ "$mode" = print ]; then can_check || { @@ -3419,13 +3419,13 @@ BINARY=$(pick_binary) # Каталог печати ОБЯЗАН пережить перезагрузку и отключение питания: на этой # машине волатильные каталоги запрещены хуком, а TMPDIR по умолчанию ведёт -# именно туда. Печать компилятора — 39 МБ и полдня работы (последний дошедший -# заход, 30 августа 2026: 8 ч 34 мин 02 с, 38 958 005 байт вывода; предыдущий, -# 29–30 августа, — 7 ч 50 мин 45 с и 27,7 ГиБ пика по пульсу печати; лестница +# именно туда. Печать компилятора — 45 МБ и час с лишним работы (последний +# дошедший заход, 4 октября 2026: 1 ч 18 мин 56 с, 44 661 951 байт вывода, пик +# 50,6 ГиБ по пульсу печати; до памяти вызовов ядра — 8 ч 34 мин; лестница # замеров — docs/reprint-cost.md), терять её на ребуте нельзя. Каталог задаётся # FLANG_TMP, по умолчанию /srv/tmp. TMP=$(mktemp -d -p "${FLANG_TMP:-/srv/tmp}" bootstrap-reprint.XXXXXX) -# Каталог убирается за собой, но НЕ при отказе: шесть часов работы нельзя +# Каталог убирается за собой, но НЕ при отказе: час с лишним работы нельзя # выбрасывать вместе с приговором. При отказе он остаётся и называется — семя # захода 29 августа спасли ровно так, руками, и руками же это делать не надо. KEEP=no diff --git a/scripts/seed/reprint-freshness.fscript b/scripts/seed/reprint-freshness.fscript index 969195a43..1e379c2cb 100644 --- a/scripts/seed/reprint-freshness.fscript +++ b/scripts/seed/reprint-freshness.fscript @@ -88,8 +88,8 @@ возвращает список строки обеспечивает «строк совета три» (длина результат) равен 3 ["Позвать её: sh scripts/bootstrap-reprint.sh --check", - (соединить ["Цена: дошедшие заходы печати идут от 10 ч 14 мин до 35 ч 45 мин ", - "на одном ядре, пик памяти 44,9 ГиБ (docs/reprint-ledger.tsv, задача 1310)."] по ""), + (соединить ["Цена: дошедшие заходы печати идут от 1 ч 18 мин (4 октября, с памятью вызовов ядра) ", + "до 35 ч 45 мин (23–25 сентября, без неё), пик памяти 50,6 ГиБ (docs/reprint-ledger.tsv)."] по ""), "Итог заносится строкой в docs/reprint-ledger.tsv — иначе следующий не узнает, что сверка была."] тип «Ход»