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