Lab053: achieve real-time 5 fps software video receiver
This commit is contained in:
@@ -348,6 +348,47 @@
|
||||
задержки JPEG-пачки; текущий этап завершить на программных результатах.
|
||||
- **RF / Git:** RF TX=0; Lab052 git add/commit и push не выполнялись. STOP.
|
||||
|
||||
## Lab053 — стоимость настоящих пакетов и потоковая обработка на CPU
|
||||
|
||||
- **Режим:** BPSK 500 ксимв/с, Fs 8 Мвыб/с, 16 отсчётов/символ;
|
||||
JPEG C (128×96 RGB, q25), 5 кадров/с, предел возраста 200 мс.
|
||||
- **База:** Lab052 закреплена коммитом
|
||||
`cc38900caea4b310568edc691be7db124503fd21` — 27 файлов, без push.
|
||||
- **Изменения:** локальные окна строгих расчётов, кольцевой IQ-буфер,
|
||||
неизменный алгоритм Viterbi с CPU JIT, раздельные стадии ввода/RX/JPEG.
|
||||
Общие децимация и корреляции сохранены; все 1601 timing-offset проверяются.
|
||||
PHY/FEC/CRC, пороги и порядок кандидатов Lab052 не изменены.
|
||||
- **Стоимость пакета:** среднее 7,016 мс, медиана 6,862 мс, p95 8,292 мс;
|
||||
40 пакетов/с требуют около 0,281 с работы обработчика на секунду потока.
|
||||
- **Производительность:** 4,384788 с суммарной работы стадий на 6,044416 с IQ,
|
||||
отношение 0,725428. Отдельный полный проход без ожидания источника:
|
||||
4,010478 с, отношение 0,663501. Прогрев JIT выполнен до приёма IQ.
|
||||
- **Свежесть:** 240/240 пакетов, 30/30 точных JPEG, 5 свежих кадров/с;
|
||||
возраст 150,298 / 153,996 / 176,062 мс. Три полных прохода прошли критерии.
|
||||
Проверены 1/2/4 работника; выбран один, дополнительные не дали выигрыша.
|
||||
- **Очереди и память:** IQ максимум 5/8 блоков, строгие задания 1/4;
|
||||
переполнений нет. IQ 3,031 МиБ, выделенное кольцо 6,483 МиБ,
|
||||
инженерная оценка рабочих массивов с резервами 72,720 МиБ,
|
||||
измеренный пик RSS процесса 197,199 МиБ. Это разные показатели памяти.
|
||||
- **Длинный поток:** 24,044416 с IQ, 960/960 пакетов, 120/120 точных JPEG,
|
||||
5 свежих кадров/с, максимальный возраст 189,396 мс, отношение 0,742840;
|
||||
IQ максимум 7/8, состояние ограничено, после закрытия очищено.
|
||||
- **Регрессии:** те же 240 решений и 255 строгих кандидатов при 1/2/4 работниках;
|
||||
37/45 слабых случаев у обоих приёмников, без новых потерь.
|
||||
Старая запись 20 ксимв/с: 36/36, CRC и SHA PASS.
|
||||
- **Проверки:** 50 новых тестов; полный pytest 768 passed;
|
||||
quick_gate 768 тестов /26 функциональных /13 штатных пропусков, PASS.
|
||||
Verifier и adversary подтвердили результаты. Отрицательные опыты
|
||||
без JIT и с замедлением ввода фиксируют переполнение и прекращение потока.
|
||||
- **Отчёт:** [состояние](lab053_current_state.md),
|
||||
[критерии](../data/processed/lab053/acceptance.json),
|
||||
[основной поток](../data/processed/lab053/stream.json),
|
||||
[графики](../data/processed/lab053/performance_and_age.png). Журнал: запись 042.
|
||||
- **Границы результата:** программная подача IQ по часам; камера, экран и
|
||||
аппаратный приём не проверены. GPU не использована, RF TX=0.
|
||||
- **Далее:** рассмотрение результатов ChatGPT. Lab053 git add/commit и push
|
||||
не выполнялись. STOP.
|
||||
|
||||
## Правило хранения данных
|
||||
|
||||
Большие записи IQ, потоки `cs8`, бинарные объекты и другие аппаратные исходные
|
||||
|
||||
438
docs/lab053_current_state.md
Normal file
438
docs/lab053_current_state.md
Normal file
@@ -0,0 +1,438 @@
|
||||
# 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.**
|
||||
Reference in New Issue
Block a user