Одиннадцать наносекунд (продолжение)
(Начало - здесь.)
3.
Кофе оказался растворимым. Кружка — ещё мокрая, с лёгким сколом на ручке. Он этого почти не заметил.
Нора поправила шнурок за ухом и развернула второй красный узел.
Он был хуже входного. Кто-то увлёкся красотой кода на стенде и забыл, что памяти после импульса нужно время, чтобы прийти в себя. Два участка, которые на бумаге казались независимыми, в железе дрались за один проход.
— Здесь мы были в среду утром, — сказала Нора. — Пробовали развести по времени. Получили четыре такта и сломали выходной буфер.
Она вывела на экран закомментированный блок. Его глаза зацепились за структуру — знакомую и неправильную одновременно. Они разводили по времени. Он бы развёл по месту.
— Покажи карту памяти, — сказал он.
Нора переключила экран. Карта выглядела как перенаселённая коммуналка — всё сидело друг у друга на голове.
— Вот эти два, — он ткнул пальцем. — Они не зависят по данным. Они зависят по адресу. Разнеси их в разные банки.
— Банков не хватит, — сказал Мел из-за соседнего стола. — Третий банк занят под буферизацию выхода.
— Освободи его. Выход буферизуй через локальную память седьмого.
Мел замолчал. Потом кивнул.
— Через локальную. Да. Это пройдёт.
Нора уже перекидывала адреса. Цифры на боковом экране менялись — она к клавиатуре не прикасалась. Он смотрел на это две секунды дольше, чем нужно, потом отвёл глаза и полез в код.
Они работали вместе. Он правил логику, Нора считала стоимость, Мел знал, какие куски железа ещё дышат.
В какой-то момент Нора остановила его.
— Не трогай загрузку. Я уже переложила её на седьмое ядро.
Он посмотрел. Она была права — но сделала это в лоб, через два лишних обращения к шине.
— Так дороже на три такта.
— Зато не ломает выходной буфер, — сказала Нора. — Мы это проходили в среду.
Мел поднял голову от кабелей.
— Среда была до его правки. Буфер теперь свободен.
Нора помолчала. Проверила. Убрала свои два обращения.
— Да, — сказала она. — Чисто.
Минус три такта.
Когда он в следующий раз поднял голову, верхний свет уже убрали. Кто-то успел погасить панели, и пространство сузилось до экранов, столов и лиц, выхваченных из темноты голубым. Часы на запястье не горели. Он не помнил, когда они погасли.
Он покосился. Человек в куртке жевал beef jerky, отрывая полоски зубами. Нора не комментировала.
Мел сидел у стойки, привалившись спиной к кабелям, с закрытыми глазами. Не спал — пальцы изредка шевелились, будто перебирали строки в голове.
Нора работала рядом. В синем свете экрана шнурок за её ухом светился тонкой молочной линией.
Он вернулся в код. Вынес проверку туда, где она выглядела нелепо ранней. Убрал чей-то красивый комментарий — leave state clean for reuse — и превратил аккуратный handshake в слепой захват без обратной связи. Код стал грубее. Суше. Правильнее.
Последний узел оказался проще. Или он уже перестал замечать сопротивление. Пальцы пошли сами, и в какой-то момент он поймал себя на том, что больше не читает строки — слышит их. Ритм кода стал частотой, давлением, чем-то, что шло не через глаза. Он не остановился. Не испугался. Просто продолжил работать.
Нора рядом работала молча. Её пальцы иногда замирали, а экран продолжал двигаться. Он больше не пытался это объяснить.
Рядом с клавиатурой появилась вторая кружка. Он не видел, кто её поставил.
Мел открыл глаза.
— Запускай полную цепь, — сказала Нора.
На большом экране выстроилось всё: импульс, окно, три исправленных узла, выход. Он впервые видел картинку целиком и чистой. Зелёная линия прошла ровно. Без провалов, без дрожи, без сюрпризов. Идеально гладкая лабораторная кривая.
Мел выдохнул сквозь зубы и потянулся к стенду — отщёлкивать фиксаторы на тестовой плате.
Что-то было не так.
Не в цифрах — в ощущении. За эти часы тело привыкло к тому, как это железо дышит: рвано, грязно, с люфтами и перекосами. А линия на экране шла так, будто железа нет.
Нора тоже не двигалась. Она смотрела на линию.
Его ладонь легла на текстолит.
Плата была холодной.
— Модель, — сказал он.
— Модель, — сказала Нора одновременно.
Мел медленно убрал руку от фиксаторов.
— Ровный температурный дрейф. Аккуратная просадка, — сказал он. — Это не то, что будет после импульса. Там будет рваная грязь. Шум на шине, просадка по питанию, и окно начнёт плавать.
Человек у стены на секунду перестал жевать.
— Грязный профиль берегли, — сказала Нора. — Шесть прогонов, может семь. Дальше начнём терять плату.
Она посмотрела на человека у стены. Тот коротко кивнул.
Нора перенастроила среду. Тронула клавишу.
Под столом взвыл нестройный хор — и вразнобой полез вверх. Между контактами затрещали искры. Нора вжала голову в плечи.
Резко ударило — смачно, басовито, с хлёстким верхом, от которого заныли зубы. Все трое у стола дернулись.
Человек у стены оценивающе приподнял брови, продолжая жевать.
На экране первый участок — жёлтый. Второй — красный. На третьем система захлебнулась. График рухнул.
Мел медленно отступил от стола.
— Окно плавает, — сказал он. — Автоматика не попадает в такт.
Тишина. Вентиляторы. Собственное дыхание, слишком громкое.
4.
Он обогнул стол.
Нора сидела неподвижно. Она смотрела на мёртвый график так, как смотрят на знакомого, который только что сказал что-то непоправимое.
Мел стоял у стойки, упершись ладонями в край.
— Сколько прогонов осталось? — спросил он.
— Пять, — сказала Нора. — Может, шесть. Дальше рискуем платой.
Рядом, на соседнем экране, всё ещё висела цепочка — та самая, которую Нора показала ему днём. Импульс, окно, узлы, выход. Красивая, прямая, мёртвая. Она была рассчитана на мир, где железо ведёт себя по спекам.
— Эта схема не взлетит, — сказал он.
Мел посмотрел на него.
— Не эта конкретная реализация. Вся схема. Последовательная цепь через плавающее окно. Мы можем вылизать каждый блок до такта, и всё равно не попадём, потому что цель двигается.
— И что, — сказал Мел.
— Код тут ни при чём. Плавает окно. После импульса всё дрейфует — питание, температура, шина. Окно уезжает в любую сторону.
— Автоматика не успевает, — сказал Мел. — Потому что к тому моменту, когда софт вычисляет поправку, окно уже уехало.
— Надо не ловить окно. Надо его создать.
Нора повернулась. Он продолжил.
— Седьмое ядро. Прерывания привязаны к шине — они не случайные, они отражают реальный дрейф. Перезапустить его после первого блока. Пусть его прерывания будут пульсом. PLL на выходе подхватит.
Нора уже считала. На её экране побежали цифры — быстро, быстрее, чем он мог отследить.
— Шум на шине меняет фактуру под нагрузкой, — сказала она. — Не частоту — форму огибающей. Если брать захват по огибающей и дотягивать фазу PLL, окно будет дышать вместе с платой. Не фиксированное. Живое.
— Какой ширины? — спросил Мел.
Нора считала. Цифры менялись. Она к клавиатуре не прикасалась.
— Зависит от того, насколько точно попасть в момент перезапуска. В идеале — от десяти до двенадцати наносекунд. На старой схеме потолок был девять. Здесь — больше, потому что PLL сидит на реальном ритме, а не на идеальном такте.
Мел тихо присвистнул.
— Когда перезапустить, — сказала Нора. И остановилась. — Если слишком рано — ядро не увидит реальную нагрузку. Если слишком поздно — окно уже уехало. Зазор — может быть, сотня миллисекунд. Может, полторы. Шина за это время уедет не раз. А софт не успеет даже начать считать.
— Не софтом, — сказал он.
Они оба посмотрели на него.
— Руками.
Нора не сразу ответила.
— Двести миллисекунд, — сказала она. Время реакции человека.
— Сто пятьдесят, если знаешь, чего ждёшь, — сказал он. Медленно, потому что ему самому нужно было это услышать. — Мне не надо вычислять. Мне надо услышать, когда плата задышала. Грубый фронт. PLL подтянет.
— Ты хочешь перезапускать ядро вручную. На слух.
— Да.
— На стенде.
— И в поле.
Тишина.
— Нормальную петлю уже не успеем, — сказал Мел. Потёр лицо. — Тебе не надо попасть в наносекунды. Тебе надо попасть в сотню миллисекунд. А PLL доведёт.
— Да. Выведи огибающую шины на динамик, — сказал он. — Без сглаживания. Готовность матрицы — на сервисный диод. Перезапуск седьмого — на аппаратный пин. Без софта.
Нора собирала обвязку. На втором экране оставила старую цепь — пусть молотит параллельно.
Мел тянул провода от платы к динамику — толстые, экранированные, в потрескавшейся серой изоляции.
Он сидел на стуле и смотрел на свои руки. Пальцы не дрожали.
Нора протянула ему два зачищенных конца провода.
— Замкнёшь — перезапуск.
Он взял провода. Медный срез холодил подушечки пальцев.
— Пускай.
Он уже знал, как это звучит. Вой поднялся. Он стиснул провода. Ударило — и всё равно дёрнулся. Медный срез впился в подушечки пальцев.
Динамик затрещал — плотный, рваный шум, хаос после импульса. Он смотрел на диод и слушал.
Шум был живой. Не белый, не ровный — у него была фактура: толчки, провалы, заикания. Он искал ритм, которого ещё не было. Искал момент, когда железо начнёт дышать, а не захлёбываться.
Диод мигнул. Матрица поднялась.
Он замкнул провода.
На экране — красный.
— Рано, — сказала Нора.
Он услышал это за мгновение до того, как она сказала.
— Сброс. Ещё раз.
Вой. Удар. Пальцы обожгло.
Шум пошёл иначе — или он уже привыкал, начинал различать. Те же толчки, те же провалы, но теперь между ними проступал рисунок.
Пенка.
Не мысль — вспышка. Поверхность, которая дрожит за мгновение до того, как сорваться. Он всю жизнь снимал турку не когда пена поднималась, а когда вода начинала дрожать.
Он ждал паузу. А надо было бить в дрожь.
Шум дрогнул — коротко, удушливо, как будто тактовый генератор поперхнулся.
Он замкнул провода.
Тишина.
Зелёный.
— Одиннадцать и три, — сказала Нора.
На втором экране — красный. Автоматика не попала.
Мел посмотрел на неё.
— Это окно?
— Окно. PLL поймал фронт и открыл окно на одиннадцать и три.
Одиннадцать наносекунд. В чертеже их не было.
Он выдохнул. Разжал пальцы. Медь оставила вмятины на подушечках.
— Ещё раз, — сказал он. — Не празднуем. Ещё раз.
Нора сбросила. Вой. Удар. Стенд зашумел тяжелее — плата грелась, дрейф усиливался.
Динамик. Шум. Он перестал смотреть на диод — ему нужно было раньше. Только слух.
Дрожь.
Он замкнул.
Зелёный. Десять и шесть.
— Ещё.
Четвёртый. Вой. Удар отдался в запястья. Шум стал гуще, труднее. Он искал дрожь и не находил — толчки шли ровнее, и момент расплывался. Замкнул чуть позже, чем хотел.
Красный.
На плате сухо щёлкнул конденсатор. Потянуло горелым — лак и стеклоткань.
Нора быстро глянула на телеметрию.
— Ёмкость на входе питания. Вылетела.
Нора сняла питание. Человек у стены уже шёл к столу. Без спешки, без вопросов. Открыл ящик, порылся, достал конденсатор, паяльник и пинцет. Сел на корточки у платы. Пока Нора диктовала позицию, он уже нашёл место, выпаял сгоревший, впаял новый. Прижал жало к выводу и площадке, подождал, пока олово затечёт как следует. Убрал. Тронул пайку пинцетом — проверил, что не шевелится.
Встал. Вернулся к стене. Вытер пальцы о куртку.
— Пятый, — сказала Нора. Посмотрела на телеметрию. — Стенд ещё держит.
Вой. Между контактами банки треснуло — коротко, сухо. Запахло горячей изоляцией. Удар.
Замкнул.
Зелёный. Десять и девять.
На втором экране тоже зелёный. Впервые.
От платы тянуло сладковатым — не дым, хуже. Текстолит подгорал. У дальнего края лак потемнел и вспучился, дорожка начала отходить.
Шестой.
Вой оборвался раньше, чем должен, — что-то в банке не набрало заряд. Удар вышел короче и тише. Между дорожками обвязки сверкнуло.
Динамик хрипел. Шум стал тише и гуще, как будто железу не хватало воздуха. Диод горел тускло и неровно.
Дрожь.
Он замкнул.
Зелёный. Десять и восемь.
Нора подняла руку. Стенд зашипел и замолчал. Экран погас. Вентиляторы остановились один за другим, и стало очень тихо.
Он положил провода на стол. Пальцы дрожали. Глаза щипало от едкого дыма.
— Четыре из шести, — сказала Нора. — Окно — от десяти и шести до одиннадцати и трёх. Среднее — десять и девять.
Она помолчала.
— Автоматика на тех же прогонах — два из шести.
Нора медленно вынула шнурок из-за уха и положила коннектор перед собой — аккуратно, как вещь, которая больше не нужна. Потом повернулась к нему. Впервые за всю ночь посмотрела не на его руки, а в лицо.
Мел сидел на краю стола и смотрел в пол.
Человек у стены больше не жевал. Смотрел не на экран — в стену. Губы беззвучно шевелились, будто что-то считал. Не такты.
— Это воспроизводимо? — спросил он.
— Четыре из шести на стенде. В поле — нужен аналоговый пусковик на борту. Руками. Без софта.
— Вашими руками.
Он посмотрел на свои пальцы. Они всё ещё дрожали.
— Да, — сказал он. — Моими.
Человек у стены достал телефон, набрал номер. Назвал две цифры. Слушал долго. Убрал телефон, не сказав больше ни слова.
— Правку окна — по звену. Куда успеете, — сказал человек у стены.
— Во все не ляжет, — сказала Нора.
— Значит, в те, что поднимутся с нами.
Нора кивнула. Мел уже шёл к стойке.
Снаружи светало.
Он вышел в коридор. За боковой дверью был бетон, утро и чужая парковка. Его машина стояла там, где он её оставил. Восемнадцать часов назад.
Телефон в кармане куртки. Moleskine остался там, на столе, рядом с клавиатурой. Он достал телефон. На экране — кактус, переживший три переезда. Под кактусом — четырнадцать уведомлений. Он не стал разблокировать. Подержал в руке, как держат вещь, которую собираются положить обратно.
5.
Когда он вернулся, обвязку уже перебирали. Банки на стенде заменили, кабели перетянули. Плата — та же, со свежей пайкой на входе питания и отходящей дорожкой на дальнем краю.
Нора порылась в ящике, нашла микрик, припаяла провода, воткнула между кнопкой и пином крошечный формирователь и замотала всё чёрной изолентой. Получилась грубая кнопка — мёртвый ход и короткий щелчок.
Он повертел её в руках. Щёлкнул. Ещё раз. Пальцы запомнили.
Сунул в карман куртки.
Дальше всё двигалось быстро и не через него. Его пересаживали с места на место, один раз принесли еду, дважды просили показать пуск на стенде, но уже не объясняли, куда именно всё идёт и кто дал команду.
К вечеру во рту стоял металлический привкус кофе и недосыпа, и если он слишком быстро поворачивал голову, взгляд собирался не сразу.
Мел упаковал модуль в армированный кейс. Человек в куртке куда-то позвонил — коротко, без имён. Нора отключила шнурок от терминала и смотала его в ладони привычным, домашним жестом, как сматывают наушники.
Его вывели через боковой док. Снаружи была ночь. Воздух был холодный и мокрый и после целого дня в сухом электрическом свете ударил по лицу, как вода.
В фургоне без окон он сел напротив Мела. Кейс лежал у Мела на коленях. Ехали молча. Фургон пах соляркой и сырым металлом. Вибрация пола отдавалась в коленях.
Мел смотрел в рифлёный пол.
— Мел, — сказал он.
Мел поднял глаза.
— На схеме не было обратного маршрута.
Мел ответил не сразу.
— У остальных бортов будет автоматика. Старая схема. Без перезапуска седьмого ядра.
— Один из трёх.
— Один из трёх, — повторил Мел.
Где-то за стенкой фургона прошла встречная — короткий тяжёлый гул, и снова тихо.
Фургон остановился. Двери открылись в ветер и натриевый свет. Бетонная полоса, запах авиационного керосина — резкий, сладковатый, ни на что не похожий.
Ноги несли его по плитам, мимо техников в сером, по ребристой аппарели внутрь — и всё это было уже не вполне с ним, а чуть в стороне, как бывает, когда слишком долго не спал и тело продолжает двигаться по инерции.
Внутри было тесно. Голый металл, кабели, запах смазки и перегретой электроники. Кейс зафиксировали в носовой стойке. За пульт села женщина с коротким ёжиком и впалыми щеками. На затылке, у основания черепа, торчал стационарный разъём — несъёмный, вросший в кожу, с потёртым кольцом вокруг. Она вогнала штекер, тело коротко дёрнулось, лицо расслабилось, и она перестала моргать.
Ему указали на место у борта. Ремни легли на грудь. Из подголовника — плотные чашки наушников, прижавшие виски.
Он достал из кармана кнопку. Вытащил заглушку из сервисного порта на кейсе. Коннектор, который Нора обжала на конце провода, вошёл в разъём со щелчком. Из второго порта вытянул штатный штекер и воткнул в гнездо ложемента — огибающая шины, сырая, без сглаживания, пошла прямо в левое ухо. Чёрная изолента на кнопке выглядела дико на фоне матового военного металла вокруг.
Впереди, в командирском ложементе, сидел человек в куртке. Затылок ровный, плечи неподвижны.
Люк втянулся в пазы. Свет переключился на красный. По корпусу пошла вибрация, перешла в тонкий вой.
Ускорение вдавило его в кресло, выбило воздух из лёгких. Рука с кнопкой стала тяжёлой и чужой. Он ждал. Не команды. Не сигнала. Короткой, удушливой дрожи в левом наушнике.
В правом ожил голос — сухой, ровный, диктующий координаты с той пустотой, с какой читают прогноз погоды. Слух зацепило название — Киренск, — но мысль не удержалась.
Человек в командирском ложементе нажал клавишу интеркома. Эфир бормотал позывные, цифры маршрутных точек.
— Полковник Корто. Борт принял.
Голос в эфире повторил что-то, уже другому борту.
Он сжал кнопку крепче. Мёртвый ход пружины. Короткое сопротивление перед щелчком.
Четыре из шести.
Он закрыл глаза и стал слушать.