Lab053: achieve real-time 5 fps software video receiver
This commit is contained in:
160
PROJECT_LOG.md
160
PROJECT_LOG.md
@@ -2003,3 +2003,163 @@ Lab052 git add/commit иpush не выполнялись;индекс пуст.
|
||||
Следующий этап: STOP. Для отдельно согласованной Lab053 исследовать стоимость
|
||||
настоящих пакетов, общей децимации/FFT/копирования IQ и задержку JPEG-пачки.
|
||||
Не переходить автоматически к10fps,QPSK,180 МГц,аппаратным500 ксимв/с или RF.
|
||||
|
||||
# Запись 042
|
||||
|
||||
## Дата
|
||||
|
||||
8 сентября 2026 года
|
||||
|
||||
## Тема
|
||||
|
||||
Lab053 — стоимость настоящих пакетов, конвейер на CPU и пять свежих JPEG в секунду
|
||||
|
||||
## Выполнено
|
||||
|
||||
Перед изменениями выполнен аудит Lab052 и состояния Git. Повторные шлюзы:
|
||||
quick_gate — 718 тестов, 20 функциональных проверок, 13 штатных пропусков;
|
||||
pytest — 718 passed за 79,79 с, одно предупреждение .pytest_cache.
|
||||
Независимый verifier подтвердил готовность. По явному разрешению пользователя
|
||||
выборочно добавлены и показаны 27 файлов Lab052; выполнен коммит
|
||||
`cc38900caea4b310568edc691be7db124503fd21`, `Lab052: suppress false preamble candidates`.
|
||||
Push не выполнялся. Указание в записи 041 об отсутствии коммита описывает
|
||||
состояние на момент завершения Lab052; прежняя запись сохранена без изменений.
|
||||
|
||||
Lab053 выполнена только программно. Сохранены BPSK 500 ксимв/с, Fs 8 Мвыб/с,
|
||||
16 отсчётов/символ, PRBS7, PHY/FEC/CRC и профиль C: 128×96 RGB JPEG q25.
|
||||
Вход — 30 JPEG за 6 с, 5 кадров/с, предел возраста 200 мс. Управление остаётся
|
||||
за ELRS; в SDR-видеоканал управление не добавлено. RF TX=0, аппаратных
|
||||
инвентаризаций, запусков и проверок не было. GPU не использована.
|
||||
|
||||
Исходный IQ сформирован тем же генератором и сценарием Lab052:
|
||||
48355328 отсчётов complex64, 386842624 байта, 6,044416 с.
|
||||
SHA256: `9b4f5469b21985f796a77e22981f93bcd3b7a203b573349e8bdf7ea55891bea0`.
|
||||
Приёмник получает только последовательные блоки IQ и параметры физического
|
||||
режима. Границы, число кадров, содержимое JPEG и TX truth не передаются
|
||||
обнаружителю, строгому декодеру или сборщику. Сверка SHA и модель capture-time
|
||||
применяются после независимого JPEG verdict. Камера и экран остаются UNKNOWN.
|
||||
|
||||
Новый подробный профиль прежнего Lab052: 7,774377 с с измерителями,
|
||||
240 настоящих и 15 ложных строгих проверок. Настоящий пакет в среднем
|
||||
17,354 мс, медиана 17,122 мс, p95 19,520 мс; сумма 4,165062 с.
|
||||
Уточнение старта 1,082006 с, локальный согласованный фильтр 0,779990 с,
|
||||
timing 0,488404 с, Viterbi 1,367891 с. Общая децимация 1,388460 с.
|
||||
Исторический чистый baseline Lab052 сохранён отдельно: 7,369795 с,
|
||||
отношение обработки к IQ 1,219273. Вложенные времена не складываются дважды.
|
||||
|
||||
Строгие расчёты перенесены в локальные окна. Исходные тела функций связаны
|
||||
с частными зависимостями; глобальная подмена режима при работе потоков устранена.
|
||||
Шаблоны, RRC taps и опорные биты совпадают побитно. Сохранены весь диапазон
|
||||
уточнения старта, все 1601 timing-offset и прежние правила CFO/фазы/полярности.
|
||||
Тело кадра вычисляется после допустимого PHY header, затем header проверяется
|
||||
повторно прежним правилом. Общая децимация и корреляции Lab052 сохранены.
|
||||
Зеркальное кольцо копирует только новый IQ-блок вместо всего остатка.
|
||||
|
||||
Viterbi R=1/2, K=7 с теми же полиномами реализован теми же операциями на CPU
|
||||
через Numba: без fastmath, изменения порядка сложений, ties и traceback.
|
||||
Это изменение вычислителя, а не FEC. Набор протокола protocol не менялся.
|
||||
Numba 0.61.2 и llvmlite 0.44.0 закреплены отдельно и доступны в локальном
|
||||
`.lab053_cpu_runtime/packages`; системное окружение не изменено. Первое
|
||||
создание машинного кода 1,221810 с, прогрев выбранного процесса из кеша
|
||||
0,151137 с — до приёма IQ. Без JIT доступен старый NumPy fallback,
|
||||
но измеренные целевые показатели к нему не относятся.
|
||||
|
||||
Конвейер имеет отдельный источник IQ, RX и сборку/декодирование JPEG.
|
||||
Внутри RX проверены 1/2/4 работника; следующий блок ожидает завершения
|
||||
строгих работ текущего окна. Полностью независимые пять вычислительных
|
||||
стадий не реализованы. Порядок фиксации решений детерминирован; только
|
||||
успешный PHY/FEC/CRC разрешает пропуск уже принятого кадра.
|
||||
При 2/4 работниках возникают 28 лишних спекулятивных проверок; устойчивого
|
||||
выигрыша нет. Выбран один работник. Ограничения очередей: IQ 8 блоков,
|
||||
кандидаты 4 задания, выход 16 пакетов. Переполнение явно останавливает сессию.
|
||||
|
||||
Три полных запуска с реальной подачей IQ по часам дали отношения суммарной
|
||||
работы стадий к длительности IQ 0,725428 / 0,712269 / 0,731542.
|
||||
Выбран целиком медианный по времени первый запуск: 4,384788 с работы стадий
|
||||
на 6,044416 с IQ. Полное настенное время с ожиданием источника 6,074946 с;
|
||||
оно не выдаётся за время вычислений. Отдельные полные проходы без ожидания:
|
||||
4,001807 / 4,010478 / 4,114974 с. Медианный второй — 0,663501 с обработки
|
||||
на секунду IQ. Источник в этом опыте ограничен обратным давлением очереди.
|
||||
Возраст кадров оценивается только в опыте с подачей IQ по часам.
|
||||
|
||||
В выбранном потоке: 240/240 пакетов, 30/30 JPEG SHA MATCH, 255 строгих проверок,
|
||||
15 ложных, 0 потерь, DISPLAYED=FRESH DISPLAYED=30, FRESH DISPLAY FPS=5.
|
||||
Возраст минимум/медиана/максимум: 150,298 / 153,996 / 176,062 мс.
|
||||
По работе стадий свободны 27,46% бюджета секунды; без ожидания — 33,65%.
|
||||
Это измеренный программный запас, не гарантия жёсткого реального времени ОС.
|
||||
Варианты 2/4 также приняли всё: отношения 0,732485 / 0,734393,
|
||||
максимальный возраст 176,126 / 189,207 мс, пять свежих кадров/с.
|
||||
|
||||
Настоящий пакет после оптимизации: среднее 7,016 мс, медиана 6,862 мс,
|
||||
p95 8,292 мс, максимум 12,611 мс. Для 40 пакетов/с требуется около
|
||||
0,280656 с последовательной работы обработчика; сборка фрагментов добавляет
|
||||
около 0,001072 с. Это бюджет perf_counter, а не точная метрика загрузки ядра:
|
||||
Windows thread_time имеет квант учёта 15,625 мс. Process CPU основного запуска
|
||||
3,234375 с сохранён отдельно. Теперь Viterbi занимает 0,068129 с на весь поток.
|
||||
|
||||
Непересекающиеся составляющие 4,384788 с: чтение/подготовка IQ 0,345752 с;
|
||||
децимация 1,371813 с; грубое обнаружение 0,374433 с; дешёвая проверка 0,428823 с;
|
||||
настоящие пакеты без Viterbi/CRC 1,614029 с; ложные 0,043819 с;
|
||||
Viterbi/CRC 0,069909 с; сборка 0,006432 с; JPEG decode 0,006325 с;
|
||||
проверка свежести 0,000045 с; прочая организация и измерители 0,123409 с.
|
||||
Главные оставшиеся расходы — общая обработка IQ, timing и локальная фильтрация.
|
||||
Физическая JPEG-пачка занимает 92,256 мс; медиана от её конца до выдачи пакета
|
||||
61,284 мс, от выдачи до JPEG 0,309 мс. Lookahead 36,224 мс и пачечная обработка
|
||||
влияют на задержку существенно сильнее собственно JPEG decoder.
|
||||
|
||||
Пик удерживаемого IQ 3177728 байт (3,031 МиБ); кольцо выделяет 6797824 байта
|
||||
(6,483 МиБ). Основная IQ-очередь достигла 5/8 блоков, кандидаты 1/4;
|
||||
переполнений всех очередей 0. Инженерная оценка временных массивов с резервами
|
||||
ограниченных кешей 76252928 байт (72,720 МиБ), не универсальный предел C/LLVM.
|
||||
Измеренный peak RSS процесса 206778368 байт (197,199 МиБ); эти показатели
|
||||
не складываются. Для пустого/недоступного источника и переполнения предусмотрены
|
||||
явные причины отказа, полное ожидание работников и освобождение состояния.
|
||||
|
||||
Длинный источник содержит 120 JPEG за 24 с, 192355328 отсчётов /24,044416 с IQ.
|
||||
Приняты 960/960 пакетов и 120/120 точных JPEG; свежесть 5 кадров/с,
|
||||
возраст 149,337 / 155,733 / 189,396 мс. Работа 17,861142 с, отношение 0,742840.
|
||||
Медиана первых/последних 60 кадров 155,662 / 156,001 мс: накопления отставания
|
||||
не наблюдается. IQ-очередь достигла 7/8, кандидаты 1/4, переполнений 0.
|
||||
В поздних контрольных точках RSS 197709824–201424896 байт; линейный наклон
|
||||
около +105078 байт/с. Ограничены рабочие массивы и очереди, но нулевой рост
|
||||
RSS на бесконечной сессии не доказан. После закрытия IQ и незавершённых работ 0.
|
||||
|
||||
Отрицательные результаты сохранены. Локальные окна без остальных изменений
|
||||
не достигали реального времени. Кольцо без JIT давало средний запас, но
|
||||
возраст до 222,90 мс. Полный опыт без JIT с подачей по часам остановился
|
||||
при переполнении: 239 пакетов, 29 JPEG, 3,667 свежих кадров/с, максимум 207,954 мс.
|
||||
Замедление на 20 мс/блок воспроизвело IQ_QUEUE_OVERFLOW при 8/8 блоках,
|
||||
явный неполный источник и очистку состояния; короткое время такого отказа
|
||||
не считается хорошей пропускной способностью полного потока.
|
||||
|
||||
Независимые verifier и adversary воспроизвели и проверили исправления:
|
||||
исключение первого future больше не оставляет остальные работы активными;
|
||||
fallback-проверка больше не создаёт третьего работника при лимите 2;
|
||||
пустой и недоступный источник возвращают диагностический отчёт вместо
|
||||
необработанного исключения. Проверены кольцо на 1,8 млн случайных отсчётов,
|
||||
реальное переполнение IQ/выхода, слабый VALID возле ложной преамбулы,
|
||||
изоляция глобального режима и ContextVar. Все воспроизведённые дефекты закрыты.
|
||||
|
||||
Эквивалентность на всём потоке для 1/2/4 работников: одинаковые 240 стартов,
|
||||
концов, timing, полярностей, CRC и байтов, одинаковые 255 строгих кандидатов.
|
||||
Максимальное расхождение soft 6,715e-7, CFO 5,487e-7 Гц, фазы 4,681e-9 рад;
|
||||
допуски заданы явно. На 45 слабых сценариях прежний и новый RX приняли 37,
|
||||
новых потерь 0. Старая запись 20 ксимв/с штатным Lab048: 36/36, CRC PASS,
|
||||
JPEG 320×240 /8724 байта SHA MATCH, 19 ошибок до FEC, 0 после, 0 байтовых.
|
||||
|
||||
Добавлены 50 целевых тестов вычислений, кольца, очередей, порядка и исключений.
|
||||
Полный pytest: 768 passed за 77,81 с, одно предупреждение .pytest_cache.
|
||||
Финальный quick_gate PASS: 768 тестов, 26 функциональных проверок,
|
||||
13 штатных пропусков. git diff --check PASS; новые исходники и отчёт отдельно
|
||||
проверены на концевые пробелы. Verifier и adversary независимо пересчитали
|
||||
итоговые JSON, возраст по временным отметкам, выбор целого медианного прохода,
|
||||
суммы стадий и памяти, проверили SHA кода, ссылки, график и прежний префикс
|
||||
журнала. Остаточных воспроизведённых дефектов нет; все 20 критериев PASS.
|
||||
Численные критерии, SHA исходного IQ и отрицательное переполнение проверяются
|
||||
в data/processed/lab053/acceptance.json; подробности и команды воспроизведения
|
||||
в docs/lab053_current_state.md. Графики и результаты сохранены локально.
|
||||
Lab053 git add/commit и push не выполнялись; индекс пуст. RF TX=0.
|
||||
|
||||
Следующий этап: STOP, рассмотрение программных результатов ChatGPT.
|
||||
Не переходить автоматически к 10 fps, QPSK, 180 МГц, новому FEC,
|
||||
аппаратным 500 ксимв/с или любому RF-эксперименту.
|
||||
|
||||
Reference in New Issue
Block a user