439 lines
38 KiB
Markdown
439 lines
38 KiB
Markdown
# Lab053 — стоимость настоящих пакетов и свежесть видео
|
||
|
||
Дата: 8 сентября 2026 года.
|
||
|
||
**Программная цель достигнута в выполненных опытах:** BPSK 500 ксимв/с,
|
||
8 Мвыб/с, 16 отсчётов/символ, JPEG C 128×96 RGB q25, вход 5 кадров/с.
|
||
Получены 240/240 пакетов, 30/30 точных JPEG и **5 свежих кадров/с** при
|
||
неизменном пределе возраста 200 мс. RF TX=0, оборудование не запускалось
|
||
и не перечислялось. Управление RadioMaster/ELRS/CRSF остаётся отдельным трактом.
|
||
|
||
## Основание и Git
|
||
|
||
Перед работой проверены root/main/HEAD/status, diff stat/check, состав Lab052,
|
||
отчёт, журнал, индекс, обнаружитель и результаты. Повторены quick_gate:
|
||
718 тестов, 20 функциональных проверок, 13 штатных пропусков; отдельный
|
||
pytest: 718 passed, 0 failed, 79,79 с. Verifier подтвердил scope.
|
||
|
||
По прямому разрешению задания в индекс внесены только 27 файлов Lab052:
|
||
код, тесты, документация и итоговые JSON/график/текстовые профили. После
|
||
показа staged stat/status и проверки cached diff создан коммит:
|
||
|
||
`cc38900caea4b310568edc691be7db124503fd21`
|
||
|
||
`Lab052: suppress false preamble candidates`
|
||
|
||
В коммите 77397 добавленных строк; большие NPZ/NPY, профиль .prof и посторонние
|
||
файлы не добавлены. У SVG и двух профилей удалены только концевые пробелы.
|
||
Предыдущий HEAD: `9f33607d3ae82992c595de37dd64e99d7e4dea73`.
|
||
Lab053 начата от фактического нового HEAD. Push не выполнялся.
|
||
|
||
## Что именно измерено
|
||
|
||
Использован **точный источник Lab052**: сохранённая готовность JPEG из
|
||
source_fixture.json, seed50050, coded-bit Eb/N0=7 дБ, остаточная расстройка
|
||
несущей +10 Гц, фаза 0,73 рад, чередование полярности. Байты JPEG сохранены:
|
||
1740–1893 байта. Приёмник получает только последовательные комплексные IQ-блоки.
|
||
Ожидаемые границы, количество пакетов, содержимое и номера фрагментов ему не даны.
|
||
|
||
Генератор один раз записал 48355328 complex64 отсчётов, 386842624 байта,
|
||
6,044416 с IQ в игнорируемый Git каталог data/raw/lab053. SHA256:
|
||
`9b4f5469b21985f796a77e22981f93bcd3b7a203b573349e8bdf7ea55891bea0`.
|
||
Подготовка источника заняла 6,225262 с; это синтез передаваемого сигнала,
|
||
а не стоимость приёмника. Конвейер читает файл обычными ограниченными read,
|
||
не отображает весь файл в память. Файл и готовность JPEG одинаковы для вариантов.
|
||
|
||
Два опыта отвечают на разные вопросы и сохранены **отдельными целыми проходами**:
|
||
|
||
| Опыт | Что измеряет | Итог с одним строгим работником |
|
||
|---|---|---:|
|
||
| Подача IQ по часам, 30 JPEG/6 с | Фактический возраст и очереди | 30 свежих JPEG, 5,0 кадра/с |
|
||
| Сумма измеренной работы стадий в этом опыте | Консервативный бюджет обслуживания без ожидания входа | 4,384788 с /6,044416 = **0,725428** |
|
||
| Полное время того же опыта по часам | Включает ожидание входных блоков и завершение потоков | 6,074946 с |
|
||
| Воспроизведение без ожидания, с обратным давлением | Реальная пропускная способность всего конвейера | 4,010478 с /6,044416 = **0,663501** |
|
||
|
||
Сумма работы стадий включает чтение IQ, подготовку кольца, RX, сборку/JPEG decode
|
||
и проверку свежести. Стадии перекрываются, поэтому их сумму нельзя объявлять
|
||
измеренным полным временем процесса. Напротив, 6,074946 с paced-опыта нельзя
|
||
делить на длительность IQ для оценки вычислительной скорости: там есть ожидание
|
||
поступления данных. Воспроизведение без ожидания отдельно измеряет elapsed wall time.
|
||
Нулевая стоимость RX нигде не подставляется.
|
||
|
||
В stream.json целиком выбран paced-проход 1 — медианный по сумме работы стадий
|
||
из трёх: **0,725428 /0,712269 /0,731542**. Все три дали 240 пакетов, 30 точных
|
||
JPEG и 5 свежих кадров/с. Их максимальные возраста:176,062 /168,978 /171,311 мс.
|
||
В throughput.json целиком выбран второй проход: ratios0,662067 /0,663501 /0,680789.
|
||
Показатели разных проходов не смешаны в одну временную шкалу.
|
||
|
||
## Новый профиль исходной Lab052
|
||
|
||
Свежий профиль снят с основного потока после коммита Lab052, без использования
|
||
профиля Lab051 в качестве основания оптимизации. Инструментированный проход:
|
||
7,774377 с, 240 настоящих и 15 ложных строгих проверок. Средняя настоящая
|
||
проверка17,354 мс, медиана17,122 мс,p95=19,520 мс,max26,724 мс.
|
||
|
||
| Затрата настоящего пакета | Среднее, мс | Сумма для 240 пакетов, с |
|
||
|---|---:|---:|
|
||
| Уточнение старта | 4,508 | 1,082006 |
|
||
| Фильтрация с подготовкой окна | 3,250 | 0,779990 |
|
||
| Timing | 2,035 | 0,488404 |
|
||
| CFO + фаза/диагностика, без двойного счёта вложенных вызовов | 0,770 | 0,184774 |
|
||
| Viterbi | 5,700 | 1,367891 |
|
||
| Настоящий пакет целиком | 17,354 | 4,165062 |
|
||
|
||
40×17,354 мс = **694,177 мс обслуживания в секунду** только на настоящие пакеты.
|
||
Ложные проверки занимали около30 мс во всём инструментированном проходе.
|
||
Общая децимация —1,388460 с, грубое обнаружение вместе с ней1,804805 с,
|
||
дешёвая проверка Lab052 —0,428240 с. Отдельные shared PHY header calls профиля
|
||
принадлежат генератору TX; в стоимость RX они не включены.
|
||
|
||
Историческая чистая база Lab052 остаётся **7,369795 с /6,044416 =1,219273**.
|
||
Время инструментированного профиля не подменяет эту базу.
|
||
|
||
## Реализованные изменения
|
||
|
||
1. **Локальное уточнение вместо большого общего FFT для редких кандидатов.**
|
||
Сохранены исходная опорная преамбула, локальное вычитание среднего и диапазон
|
||
±2000 отсчётов. Общая корреляция Lab051 строила большой участок ради множества
|
||
ложных кандидатов. После Lab052 такая работа стала дороже короткой локальной
|
||
корреляции. Стоимость настоящего уточнения снизилась с4,508 до1,367 мс.
|
||
2. **Короткие локальные окна фильтрации.** Общая RRC-фильтрация большого IQ-окна
|
||
не выбрана для этой плотности кандидатов. Штатная свёртка выполняется для
|
||
preamble/header и затем для тела принятой по заголовку длины. Средние
|
||
локальных окон и нулевые края сохранены. Их нельзя без поправки заменить
|
||
одним непрерывным фильтром: это меняет численный вход timing/оценки несущей.
|
||
3. **Зеркальный кольцевой IQ-буфер.** Ранее дважды копировался почти весь
|
||
удерживаемый участок: при добавлении блока и при отбрасывании начала.
|
||
Теперь новый блок копируется в две половины кольца, а retained IQ и кандидаты
|
||
читают непрерывные views, в том числе через стык. Старый участок не переносится.
|
||
Следующая запись начинается после завершения всех jobs текущего блока.
|
||
4. **CPU-компиляция циклов soft Viterbi.** NumPy вычисляет те же четыре метрики
|
||
ветвей. Numba выполняет переходы и обратный проход по той же решётке,
|
||
с тем же порядком сложения, сравнением `one < zero` и выбором ветви0 при tie.
|
||
`fastmath=False`, `nogil=True`; старт/финиш0,64 состояния,хвост6 бит.
|
||
Код R=1/2,K=7,171/133 octal,soft-decision не изменён. Группировка нескольких
|
||
шагов trellis не применена: округлённые равенства могли бы изменить traceback.
|
||
5. **Частные зависимости строгого декодера.** `bind()` связывает исходные code
|
||
objects функций Lab045/046/043 с отдельным словарём констант и helpers.
|
||
Нет exec/eval и подмены функций общих модулей во время обработки. Константы
|
||
фиксированы для500ксимв/с, временные метрики кандидата находятся в ContextVar.
|
||
Новый strict decoder не зависит от внешнего адаптера режима20ксимв/с.
|
||
|
||
Обнаружитель Lab052 **не переписан**: прежние coarse/split функции, пороги,
|
||
полная ширина группы20480, максимум первым, альтернативы после FAIL и пропуск
|
||
физического кадра только после CRC PASS. В основной последовательности снова
|
||
1675842 локальных пика,392785 кандидатов первого каскада,388407 дешёвых отказов,
|
||
384 группы,243 строгих представителя+12 альтернатив,240true/15false.
|
||
|
||
Один раз на IQ-блок вычисляются общая децимация с повторным использованием
|
||
неизменного FIR-участка, перенос обнаружителя, грубая корреляция и две корреляции
|
||
частей Lab052, накопительные энергии. Все кандидаты используют их общие результаты.
|
||
Переносы локального строгого окна кешируются по длине; готовые векторы неизменяемы.
|
||
|
||
## Timing, несущая и этапы заголовка/тела
|
||
|
||
Lab051 убрала медленную организацию поиска, но **не диапазон1601 смещений**.
|
||
Lab053 сохраняет все прежние смещения от−800 до+800; новый узкий timing-gate
|
||
не введён. Он не понадобился для выполнения целевого бюджета, а проверка
|
||
корреляций частей Lab052 сама по себе не доказывает более узкую ошибку timing.
|
||
|
||
Декодирование по-прежнему двухэтапное. Сначала преамбула и PHY header; только
|
||
после правильного заголовка и проверки длины запрашивается полное окно тела.
|
||
Неверный header не вызывает Viterbi. После полного извлечения прежний анализатор
|
||
повторно проверяет header, затем выполняет deinterleave,FEC,protocol parser,CRC.
|
||
|
||
CFO (частотная расстройка), фаза и полярность оцениваются **только по преамбуле**.
|
||
Полезные биты тела для оценки не используются. Оценка повторена для полного
|
||
окна, поскольку его локальная средняя составляющая отличается от probe.
|
||
Результат затем один раз применяется ко всему извлечённому вектору символов.
|
||
Слепая подмена этой оценки значениями probe и сужение timing не применены.
|
||
|
||
Сравнение всех240 принятых пакетов с Lab052, отдельно для1/2/4 работников:
|
||
|
||
- последовательность всех255 строгих решений и отказов — одинаковая;
|
||
- начало/конец, timing, полярность, PHY/CRC и все байты пакетов — одинаковые;
|
||
- наибольшая разность CFO: **5,4867626531e−7 Гц**;
|
||
- наибольшая разность фазы: **4,6813191101e−9 рад**;
|
||
- наибольшая разность soft values: **6,7149294158e−7**.
|
||
|
||
Последние разряды float не объявлены побитно одинаковыми: другое разбиение
|
||
FFT меняет округление. Побитно совпадают результаты FEC/пакеты, timing и verdict.
|
||
45 слабых случаев Lab052 дали37/45 у обоих декодеров, без дополнительных потерь;
|
||
8 отказов обоих не объявляются успешным декодированием.
|
||
|
||
## Профиль настоящего пакета после оптимизации
|
||
|
||
Данные выбранного paced-прохода. Каждая строка — сумма вызовов этой операции
|
||
внутри одного настоящего пакета; вложенные затраты вычтены из родительских строк.
|
||
Например, CFO отдельно от оставшейся фазовой обработки, Viterbi отдельно от тела.
|
||
|
||
| Операция | Среднее, мс | Медиана, мс | p95, мс | Максимум, мс |
|
||
|---|---:|---:|---:|---:|
|
||
| Подготовка IQ views | 0,0032 | 0,0030 | 0,0047 | 0,0076 |
|
||
| Перенос частоты и локальная DC | 0,2395 | 0,1955 | 0,3633 | 4,1497 |
|
||
| Согласованная RRC-фильтрация | 1,7115 | 1,6345 | 2,2153 | 2,7005 |
|
||
| Уточнение кандидата | 1,3675 | 1,3157 | 1,6683 | 2,4152 |
|
||
| Timing | 1,7848 | 1,7010 | 2,3002 | 4,2951 |
|
||
| Оценка CFO | 0,3591 | 0,3336 | 0,5189 | 0,7358 |
|
||
| Фаза/полярность/преамбульная диагностика без CFO | 0,3659 | 0,3321 | 0,5690 | 0,7817 |
|
||
| Извлечение/нормировка soft symbols | 0,2762 | 0,2556 | 0,3773 | 0,8008 |
|
||
| PHY header, оба вызова | 0,0591 | 0,0545 | 0,0867 | 0,2697 |
|
||
| Подготовка тела без Viterbi/header/parser | 0,4588 | 0,4268 | 0,6474 | 1,1569 |
|
||
| Viterbi | 0,2839 | 0,2710 | 0,3398 | 0,6717 |
|
||
| Protocol/CRC parser | 0,0074 | 0,0072 | 0,0088 | 0,0137 |
|
||
| Обработка фрагмента после строгого verdict | 0,0268 | 0,0264 | 0,0419 | 0,0504 |
|
||
| Строгий пакет целиком, включая организационные затраты | **7,0164** | **6,8617** | **8,2923** | **12,6110** |
|
||
|
||
Средняя стоимость с последующей обработкой фрагмента —7,0432 мс. Квантили
|
||
строгой обработки и фрагмента не складываются. Для бюджета40 пакетов/с:
|
||
**40×7,016407 мс =280,656 мс/с** строгой работы одного работника; с фрагментами
|
||
около281,728 мс/с. Длительность по perf_counter включает задержки планирования
|
||
ОС и служит бюджетом обслуживания, а не точным числом активных тактов CPU.
|
||
|
||
Дополнительно записаны process_time и thread_time. Полный CPU процесса в
|
||
выбранном paced-опыте3,234375 с. Thread-time на этой Windows квантуется по
|
||
15,625 мс: медиана отдельного короткого пакета получается0. Этот счётчик
|
||
не используется для заявления «нулевой обработки» или пер-пакетных квантилей.
|
||
Сырые измерения оставлены в JSON. Отдельный throughput-проход: CPU4,140625 с,
|
||
wall4,010478 с; разные стадии действительно работают одновременно.
|
||
|
||
## Разбиение полного времени A–J
|
||
|
||
| Часть выбранного paced-опыта | Время, с |
|
||
|---|---:|
|
||
| A. Чтение IQ и подготовка входного кольца | 0,345752 |
|
||
| B. Общий front-end: децимация | 1,371813 |
|
||
| C. Грубое обнаружение без B | 0,374433 |
|
||
| D. Дешёвая проверка Lab052 | 0,428823 |
|
||
| E. Строгая обработка настоящих пакетов без G | 1,614029 |
|
||
| F. Строгая обработка ложных кандидатов | 0,043819 |
|
||
| G. Viterbi и protocol/CRC | 0,069909 |
|
||
| H. Фрагменты/сборка объекта | 0,006432 |
|
||
| I. JPEG decode | 0,006325 |
|
||
| J. Проверка свежести после JPEG | 0,000045 |
|
||
| Прочая организация, кластеризация и инструментирование | 0,123409 |
|
||
| **Сумма** | **4,384788** |
|
||
|
||
Чтение файла отдельно0,130580 с; подготовка кольца0,215171 с.
|
||
Viterbi теперь занимает около1,55% этой суммы. Основные вычислительные затраты —
|
||
общая FIR-децимация и timing/RRC/уточнение настоящих пакетов.
|
||
|
||
## Конвейер, параллелизм и порядок
|
||
|
||
Конвейер имеет отдельные потоки источника IQ и сборки/JPEG output. Между ними
|
||
работает RX с обнаружением и строгим декодированием. При2/4 работниках строгие
|
||
представители групп поступают в ограниченный ThreadPool. IQ не копируется
|
||
отдельно каждому работнику: им передаётся неизменяемый view общего кольца.
|
||
|
||
Это не полностью асинхронная пятиступенчатая архитектура: обнаружение следующего
|
||
RX-блока ждёт завершения строгих jobs текущего. Такое ограничение сохраняет
|
||
политику принятия и безопасное время повторного использования кольца. Источник
|
||
и JPEG output в это время могут обрабатывать другие блоки/пакеты.
|
||
|
||
Результаты строгих jobs применяются в прежнем порядке групп/альтернатив.
|
||
Раннее завершение не даёт права изменить accepted_until. Неиспользованные
|
||
опережающие результаты отброшены и учтены отдельно; они не становятся пакетами.
|
||
Все альтернативы также идут через pool — главный поток не создаёт скрытого
|
||
дополнительного строгого работника. После ошибки ожидается завершение всех jobs,
|
||
сохраняется первоначальная ошибка, затем освобождаются IQ и счётчики.
|
||
|
||
| Строгих работников | Полный throughput wall/RF | Paced работа стадий/RF | Fresh FPS | Max age, мс | IQ peak | Candidate peak |
|
||
|---:|---:|---:|---:|---:|---:|---:|
|
||
| **1, выбран** | **0,663501** | **0,725428** | **5,0** | **176,062** | **5** | **1** |
|
||
| 2 | 0,689214 | 0,732485 | 5,0 | 176,126 | 6 | 2 |
|
||
| 4 | 0,676192 | 0,734393 | 5,0 | 189,207 | 7 | 2 |
|
||
|
||
Для2/4:271 опережающая проверка представителя,28 результатов затем пропущены
|
||
по уже принятому кадру. Логических строгих проверок всё равно255, из них15false.
|
||
Внутриблочного полезного параллелизма мало. Выбран один строгий работник;
|
||
дополнительные workers не дали выигрыша в итоговом сравнении. multiprocessing
|
||
не применялся. Существующий ObjectAssembler принимает фрагменты по индексам;
|
||
отдельный тест подтверждает сборку при обратном порядке. Конвейер дополнительно
|
||
сохраняет порядок подачи между изображениями в существующий ImageSink.
|
||
|
||
## Свежесть и остаточная задержка
|
||
|
||
INPUT5fps,30 изображений; RECEIVED30, DISPLAYED30, FRESH DISPLAYED30,
|
||
FRESH DISPLAY FPS=5. Возраст в выбранном paced-проходе:
|
||
**150,298 /153,996 /176,062 мс** (min/median/max).
|
||
MAX_VIDEO_AGE остаётся200мс. Три повторения и оба варианта2/4workers уложились.
|
||
|
||
Восемь физических пакетов занимают92,256 мс IQ на JPEG. Медианное время от
|
||
окончания последнего радиопакета JPEG до выдачи RX-пакета —61,284 мс
|
||
(диапазон57,438–83,117мс). Последующая выдача JPEG —медиана0,309мс,
|
||
max0,643мс. Здесь основной остаток задержки — bounded lookahead и ожидание/
|
||
обработка пачки IQ, а не JPEG decode. Lookahead289792 отсчёта=36,224мс,
|
||
core-блок65536=8,192мс. Ошибка фактической подачи источником достигала15,830мс.
|
||
|
||
Запас бюджета по сумме работы стадий —27,46%; по отдельной пропускной
|
||
способности —33,65%. Максимальный возраст выбранного короткого опыта имеет
|
||
23,94мс до предела. Это наблюдаемый запас на данном компьютере, не гарантия
|
||
жёсткого реального времени при произвольной нагрузке ОС.
|
||
|
||
**Камера и физический экран UNKNOWN.** В неизменном формате фрагмента нет
|
||
capture timestamp. Сопоставление с сохранённым временем создания источника
|
||
делается после независимых PHY/CRC, сборки и JPEG decode. Оно не влияет на RX
|
||
verdict. Получен программный критерий свежести в стенде, а не независимый
|
||
аппаратный контроль возраста живой камеры.
|
||
|
||
## Очереди, память и длинная сессия
|
||
|
||
Очередь IQ —8 блоков по65536 complex64, предел4МиБ. В выбранном paced-опыте
|
||
пик5 блоков=2,5МиБ, в24-секундном —7. В throughput-опыте источник специально
|
||
упирается в8 блоков и ждёт; это обратное давление конечного replay.
|
||
В paced-опыте источник не замедляет свою временную шкалу: Full вызывает
|
||
IQ_QUEUE_OVERFLOW и остановку сессии. Пропущенные участки IQ не склеиваются.
|
||
|
||
Очередь строгих jobs —4, выбранный пик1; для2/4worker пик2. Вместимость
|
||
включает ожидающие и ещё не потреблённые результаты. Полный список дешёвых
|
||
кандидатов ограничен размером одного IQ-окна и уничтожается после сканирования.
|
||
Очередь выходных пакетов —16; переполнение также видно отдельным счётчиком.
|
||
Все штатные итоговые проходы имеют IQ/candidate/output overflow=0.
|
||
|
||
| Память | Величина |
|
||
|---|---:|
|
||
| Максимальный полезный retained IQ | 3177728 байт =3,031МиБ |
|
||
| Реально выделенные две половины кольца | 6797824 байта =6,483МиБ |
|
||
| Оценка временных рабочих буферов, включая кольцо/очереди | 35224064 байта |
|
||
| Максимальный резерв кеша16 переносов для допустимых PHY lengths | 36581376 байт |
|
||
| Резерв8 переносов обнаружителя | 3398912 байт |
|
||
| Резерв констант/решётки | 1048576 байт |
|
||
| Рабочие массивы с перечисленными резервами | **76252928 байт =72,720МиБ** |
|
||
| Измеренный RSS peak выбранного процесса | **206778368 байт =197,199МиБ** |
|
||
| RSS peak длинного опыта | **208031744 байта =198,395МиБ** |
|
||
|
||
Оценка массивов — инженерный резерв, не универсальная верхняя граница временных
|
||
C/SciPy/LLVM-аллокаций. RSS включает весь Python, NumPy/SciPy, Numba/LLVM,
|
||
аллокатор и диагностические результаты опыта. Это разные показатели, их нельзя
|
||
складывать. Резерв rotation-cache рассчитан для максимального допустимого
|
||
кадра285792 отсчёта, а не только для размера основного JPEG-пакета.
|
||
|
||
Длинный источник:120 изображений,960 физических пакетов,24,044416с IQ,
|
||
1538842624байта на диске. Изображения C повторены по содержимому с новыми ID;
|
||
радиокадры формируются заново, шум продолжается с тем же воспроизводимым seed.
|
||
Все960/960 и120/120 точных JPEG приняты. Fresh FPS=5; возраст
|
||
149,337 /155,733 /189,396мс. Работа стадий17,861142с,ratio0,742840.
|
||
Медианы первой/второй половины155,662 /156,001мс: накопления задержки не видно.
|
||
|
||
Retained IQ в контрольных точках2653440байт, candidate jobs после блока0,
|
||
очереди не выходят за предел. Поздний RSS197709824–201424896байт, без
|
||
монотонного накопления; линейная оценка на последней половине+105078байт/с
|
||
на фоне колебаний. Конечный опыт не доказывает абсолютно нулевой долгосрочный
|
||
дрейф RSS. Массивы/кеши/очереди RX имеют явные пределы; история строк измерений
|
||
принадлежит внешнему эксперименту. После close retained IQ/decimator/ring=0,
|
||
pending jobs=0, все потоки завершены.
|
||
|
||
## Неуспешные варианты и исправления
|
||
|
||
- Только локальные окна:240/240,30/30, но ratio1,108 и fresh FPS0.
|
||
- Добавление кольца без JIT в ранней событийной оценке:ratio0,931,fresh FPS4,5.
|
||
- Фактический paced-конвейер без JIT:IQ queue overflow1,239 пакетов,29 JPEG,
|
||
fresh FPS3,667. Его ratio не считается результатом полного потока.
|
||
- Искусственная задержка20мс на блок:IQ queue peak8,overflow1,явный STOP,
|
||
состояние освобождено. Это проверка отказа, не throughput PASS.
|
||
- Первый общий runner ошибочно сопоставлял ID JPEG с нуля вместо единицы.
|
||
Отрицательные SHA-сравнения были ошибкой внешней диагностики; lookup исправлен
|
||
до итоговых paced/throughput серий. Итоговые JSON заново получены целиком.
|
||
- Adversary воспроизвёл early exception, при котором ожидание оставшихся futures
|
||
прекращалось после второй ошибки. Исправлено ожидание всех jobs с сохранением
|
||
первой ошибки; повторный сценарий подтвердил0 активных workers и closed=True.
|
||
- Verifier воспроизвёл третье параллельное decode приworkers2. Альтернативы
|
||
переведены в тот же пул; прежний вход теперь имеетpeak_active2.
|
||
- Missing/empty source раньше теряли отчёт из-за повторного stat или деления
|
||
на0 после cleanup. Теперь возвращаются SOURCE_EXCEPTION/EMPTY_IQ_SOURCE,
|
||
ratio=None и освобождённое состояние. Оба сценария повторены adversary.
|
||
|
||
## CPU-зависимости и GPU
|
||
|
||
GPU=**NOT USED**. После локальных вычислений и CPU-JIT цель выполнена. Общая
|
||
децимация остаётся заметной, однако стоимость запусков/переносов GPU для блоков
|
||
по64К отсчётов не измерялась; убедительного прогноза полного выигрыша нет.
|
||
Не выполнялись GPU-инвентаризация, CUDA-опыты или автоматический multiprocessing.
|
||
|
||
Numba0.61.2 и llvmlite0.44.0 установлены локально в
|
||
`.lab053_cpu_runtime/packages`; системное окружение не изменено.
|
||
Пакеты закреплены в requirements-lab053-cpu.txt; SHA wheel-файлов сохранены.
|
||
Поддержка Python3.13 и NumPy2.2 указана в
|
||
[официальной таблице Numba](https://numba.readthedocs.io/en/stable/user/installing.html).
|
||
`nogil` и `fastmath` — параметры
|
||
[CPU JIT](https://numba.readthedocs.io/en/0.61.2/user/jit.html).
|
||
|
||
Первый отдельный прогрев занял1,221810с; прогрев с дисковым кешем выбранного
|
||
процесса0,151137с. Он выполнен **до начала приёма IQ**, отдельно от основного
|
||
таймера. Импорт библиотек также относится к запуску процесса. Без доступного
|
||
Numba предусмотрен прежний NumPy decoder, но целевые результаты требуют CPU-JIT;
|
||
их нельзя переносить на fallback без отдельного измерения.
|
||
|
||
Первоначальная установка pip перенесла каталоги с правами временной папки.
|
||
Изменение ACL было отклонено автоматической проверкой и не выполнялось.
|
||
Официальные wheel-файлы распакованы обычным sandbox в новый доступный каталог.
|
||
Старая локальная попытка установки, wheel и JIT-кеши не добавляются в Git.
|
||
|
||
## Проверки и воспроизведение
|
||
|
||
50 целевых тестов проверяют побитную эквивалентность Viterbi на шуме, ties,
|
||
больших значениях и допустимых длинах; валидацию входов; timing на всём диапазоне;
|
||
CFO/фазу/PHY/CRC, в том числе намеренно испорченную CRC; запрет тела до header;
|
||
параллельные verdict, обратный порядок фрагментов, стыки кольца, bounded queues,
|
||
реальное переполнение, исключения и предел работников. Оба независимых
|
||
проверяющих подтвердили закрытие своих воспроизведённых находок.
|
||
|
||
Старая15-секундная запись Lab047 обработана штатным Lab048:36/36фрагментов,
|
||
CRC PASS,JPEG320×240/8724байта SHA MATCH,19ошибок доFEC,0после,0байтовых.
|
||
SHA:`e913dab9ac32795250880a4be67fbbbf89a4f96536842476ab591d1acaafc02a`.
|
||
Обработка14,147788с. Код20ксимв/с и весь protocol не изменялись.
|
||
|
||
Полный pytest: 768 passed за 77,81 с, одно предупреждение о недоступном
|
||
`.pytest_cache`; проваленных тестов нет. Численные критерии, SHA исходного IQ
|
||
и поведение при принудительном переполнении пересчитываются в acceptance.json.
|
||
Финальный quick_gate PASS: 768 тестов, 26 функциональных проверок, 13 штатных
|
||
пропусков. Все 20 критериев acceptance PASS; git diff --check PASS, концевых
|
||
пробелов в новых исходниках и отчёте нет. Verifier и adversary независимо
|
||
пересчитали свежесть, медианный выбор, память и границы отрицательных опытов;
|
||
остаточных воспроизведённых дефектов нет. Индекс Git пуст.
|
||
|
||
```powershell
|
||
python -m pip install -r requirements-lab053-cpu.txt
|
||
# Команда установки нужна для нового обычного расчётного окружения.
|
||
# В текущем workspace пакеты уже доступны в .lab053_cpu_runtime/packages.
|
||
python experiments/lab053_viterbi.py
|
||
python experiments/lab053_receiver_profile.py --stage profile
|
||
python experiments/lab053_receiver_profile.py --stage source
|
||
python experiments/lab053_pipeline.py --workers 1 --unpaced --name throughput_1_repeat_1.json
|
||
python experiments/lab053_pipeline.py --workers 1 --name paced_1_repeat_1.json
|
||
# Аналогично repeat_2/repeat_3; сравнение --workers 2 и --workers 4.
|
||
python experiments/lab053_receiver_profile.py --stage source --frames 120
|
||
python experiments/lab053_pipeline.py --frames 120 --source data/raw/lab053/source_120.c64 --name long_stream.json
|
||
python experiments/lab053_regression.py --stage equivalence
|
||
python experiments/lab053_regression.py --stage sensitivity
|
||
python experiments/lab053_pipeline.py --numpy-viterbi --name without_jit_paced.json
|
||
python experiments/lab053_pipeline.py --processing-delay 0.02 --name overflow_probe.json
|
||
python experiments/lab053_receiver_profile.py --stage report
|
||
python tools/quick_gate.py
|
||
python -m pytest tests/ -q
|
||
git diff --check
|
||
```
|
||
|
||
Lab048 воспроизводится командой с --run-saved-capture, исходным
|
||
`C:\Users\user\Documents\SDR_Rover_Lab047_raw\20260903_115747\rx_stream.cs8`,
|
||
его independent_result.json,--tx-image data/processed/lab047/tx_image.jpg
|
||
и --output-directory data/processed/lab053/regression20k.
|
||
|
||
Основные файлы: [профиль/сводка](../experiments/lab053_receiver_profile.py),
|
||
[строгие вычисления](../experiments/lab053_packet_processing.py),
|
||
[потоковый RX](../experiments/lab053_streaming_receiver.py),
|
||
[Viterbi](../experiments/lab053_viterbi.py),
|
||
[конвейер](../experiments/lab053_pipeline.py),
|
||
[регрессии](../experiments/lab053_regression.py),
|
||
[тесты](../tests/test_lab053_packet_pipeline.py),
|
||
[основной поток](../data/processed/lab053/stream.json),
|
||
[пропускная способность](../data/processed/lab053/throughput.json),
|
||
[память](../data/processed/lab053/memory.json),
|
||
[критерии](../data/processed/lab053/acceptance.json),
|
||
[график](../data/processed/lab053/performance_and_age.png).
|
||
|
||
Lab053 git add/commit иpush **не выполнялись**. BPSK,Fs,Rs,SPS,PRBS7,PHY,FEC,CRC,
|
||
формат фрагментов и candidate policy сохранены. RF TX=0. Следующий этап —
|
||
рассмотрение программных результатов ChatGPT. QPSK,180МГц,новый FEC,
|
||
аппаратные500ксимв/с и RF не разрешены. **STOP.**
|