хорошие друзья попросили записывать сны, чтобы гулять по ним вместе.
а у вас есть такие друзья?
-
Одиннадцать наносекунд (окончание)
(Начало — здесь. Предыдущая часть — здесь.)
4.
Он обогнул стол.
Нора сидела неподвижно. Она смотрела на мёртвый график так, как смотрят на знакомого, который только что сказал что-то непоправимое.
Мел стоял у стойки, упершись ладонями в край.
— Сколько прогонов осталось? — спросил он.
— Пять, — сказала Нора. — Может, шесть. Дальше рискуем платой.
Рядом, на соседнем экране, всё ещё висела цепочка — та самая, которую Нора показала ему днём. Импульс, окно, узлы, выход. Красивая, прямая, мёртвая. Она была рассчитана на мир, где железо ведёт себя по спекам.
— Эта схема не взлетит, — сказал он.
Мел посмотрел на него.
— Не эта конкретная реализация. Вся схема. Последовательная цепь через плавающее окно. Мы можем вылизать каждый блок до такта, и всё равно не попадём, потому что цель двигается.
— И что, — сказал Мел.
— Код тут ни при чём. Плавает окно. После импульса всё дрейфует — питание, температура, шина. Окно уезжает в любую сторону.
— Автоматика не успевает, — сказал Мел. — Потому что к тому моменту, когда софт вычисляет поправку, окно уже уехало.
— Надо не ловить окно. Надо его создать.
Нора повернулась. Он продолжил.
— Седьмое ядро. Прерывания привязаны к шине — они не случайные, они отражают реальный дрейф. Перезапустить его после первого блока. Пусть его прерывания будут пульсом. PLL на выходе подхватит.
Нора прогнала цепь заново. Цифры на её экране побежали быстро, быстрее, чем он мог отследить.
— Шум на шине меняет фактуру под нагрузкой, — сказала она. — Не частоту — форму огибающей. Если брать захват по огибающей и дотягивать фазу PLL, окно будет дышать вместе с платой. Не фиксированное. Живое.
— Какой ширины? — спросил Мел.
Нора проверила расчёт.
— Зависит от того, насколько точно попасть в момент перезапуска. В идеале — от десяти до двенадцати наносекунд. На старой схеме потолок был девять. Здесь — больше, потому что PLL сидит на реальном ритме, а не на идеальном такте.
Мел тихо присвистнул.
— Когда перезапустить, — сказала Нора. И остановилась. — Если слишком рано — ядро не увидит реальную нагрузку. Если слишком поздно — окно уже уехало. Зазор — может быть, сотня миллисекунд. Может, полторы сотни. Шина за это время уедет не раз. А софт не успеет даже начать считать.
— Не софтом, — сказал он.
— Компаратор тоже не поможет, — сказала Нора. — Это не порог. Это момент, когда шум перестаёт быть хаосом и ещё не стал режимом.
Они оба посмотрели на него.
— Руками.
Нора не сразу ответила.
— Двести миллисекунд, — сказала она. — Время реакции человека.
— Сто пятьдесят, если знаешь, чего ждёшь, — сказал он. Медленно, потому что ему самому нужно было это услышать. — Мне не надо вычислять. Мне надо услышать, когда плата задышала. Грубый фронт. PLL подтянет.
— Ты хочешь перезапускать ядро вручную. На слух.
— Да.
— На стенде.
— И в поле.
Тишина.
— Нормальную петлю уже не успеем, — сказал Мел. Потёр лицо. — Тебе не надо попадать в наносекунды. Тебе нужно попасть в сотню миллисекунд. А PLL доведёт.
— Да. Выведи огибающую шины на динамик, — сказал он. — Без сглаживания. Готовность матрицы — на сервисный диод. Перезапуск седьмого — на аппаратный пин. Без софта.
Нора собирала обвязку. На втором экране оставила старую цепь — пусть молотит параллельно.
Мел тянул провода от платы к динамику — толстые, экранированные, в потрескавшейся серой изоляции.
Он сидел на стуле и смотрел на свои руки. Пальцы не дрожали.
Нора протянула ему два зачищенных конца провода.
— Замкнёшь — перезапуск.
Он взял провода. Медный срез холодил подушечки пальцев.
— Пускай.
Он уже знал, как это звучит. Вой поднялся. Он стиснул провода. Ударило — и всё равно дёрнулся. Медный срез впился в подушечки пальцев.
Динамик затрещал — плотный, рваный шум, хаос после импульса. Он смотрел на диод и слушал.
Шум был живой. Не белый, не ровный — у него была фактура: толчки, провалы, заикания. Он искал ритм, которого ещё не было. Искал момент, когда железо начнёт дышать, а не захлёбываться.
Диод мигнул. Матрица поднялась.
Он замкнул провода.
На экране — красный.
— Рано, — сказала Нора.
Он услышал это за мгновение до того, как она сказала.
— Сброс. Ещё раз.
Вой. Удар. Пальцы обожгло.
Шум пошёл иначе — или он уже привыкал, начинал различать. Те же толчки, те же провалы, но теперь между ними проступал рисунок.
Пенка.
Не мысль — вспышка. Поверхность, которая дрожит за мгновение до того, как сорваться. Он всю жизнь снимал турку не когда пена поднималась, а когда вода начинала дрожать.
Он ждал паузу. А надо было бить в дрожь.
Шум дрогнул — коротко, удушливо, как будто тактовый генератор поперхнулся.
Он замкнул провода.
Тишина.
Зелёный.
— Одиннадцать и три, — сказала Нора.
На втором экране — красный. Автоматика не попала.
Мел посмотрел на неё.
— Это окно?
— Окно. PLL поймал фронт и открыл окно на одиннадцать и три.
Одиннадцать наносекунд. В чертеже их не было.
Он выдохнул. Разжал пальцы. Медь оставила глубокие вмятины на подушечках.
— Ещё раз, — сказал он. — Не празднуем. Ещё раз.
Нора сбросила. Вой. Удар. Стенд зашумел тяжелее — плата грелась, дрейф усиливался.
Динамик. Шум. Он перестал смотреть на диод — ему нужно было раньше. Только слух.
Дрожь.
Он замкнул.
Зелёный. Десять и шесть.
— Ещё.
Четвёртый. Вой. Удар отдался в запястья. Шум стал гуще, труднее. Он искал дрожь и не находил — толчки шли ровнее, и момент расплывался. Замкнул чуть позже, чем хотел.
Красный.
На плате сухо щёлкнул конденсатор. Потянуло горелым — лак и стеклоткань.
Нора быстро глянула на телеметрию.
— Ёмкость на входе питания. Вылетела.
Нора сняла питание. Человек в куртке уже шёл к столу. Без спешки, без вопросов. Открыл ящик, порылся, достал конденсатор, паяльник и пинцет. Сел на корточки у платы. Пока Нора диктовала позицию, он уже нашёл место, выпаял сгоревший и впаял новый. Некрасиво. Быстро и достаточно чисто. Тронул пайку пинцетом — проверил, что не шевелится.
Встал. Вернулся к стене. Вытер пальцы о куртку.
— Пятый, — сказала Нора. Посмотрела на телеметрию. — Стенд ещё держит.
Вой. Между контактами банки треснуло — коротко, сухо. Запахло горячей изоляцией. Удар.
Замкнул.
Зелёный. Десять и девять.
На втором экране тоже зелёный. Впервые.
От платы тянуло сладковатым — не дым, хуже. Текстолит подгорал. У дальнего края лак потемнел и вспучился, дорожка начала отходить.
Шестой.
Вой оборвался раньше, чем должен, — что-то в банке не набрало заряд. Удар вышел короче и тише. Между дорожками обвязки сверкнуло.
Динамик хрипел. Шум стал тише и гуще, как будто железу не хватало воздуха. Диод горел тускло и неровно.
Дрожь.
Он замкнул.
Зелёный. Десять и восемь.
Нора подняла руку. Стенд зашипел и замолчал. Экран погас. Вентиляторы остановились один за другим, и стало очень тихо.
Он положил провода на стол. Пальцы дрожали. Глаза щипало от едкого дыма.
— Четыре из шести, — сказала Нора. — Окно — от десяти и шести до одиннадцати и трёх. Среднее — десять и девять.
Она помолчала.
— Автоматика на тех же прогонах — два из шести.
Нора медленно вынула шнурок из-за уха и положила коннектор перед собой — аккуратно, как вещь, которая больше не нужна. Потом повернулась к нему. Впервые за всю ночь посмотрела не на его руки, а в лицо.
Мел сидел на краю стола и смотрел в пол.
Человек в куртке больше не жевал. Смотрел не на экран — в стену. Губы беззвучно шевелились, будто что-то считал. Не такты.
— Это воспроизводимо? — спросил он.
— Четыре из шести на стенде. В поле — нужен аналоговый пусковик на борту. Руками. Без софта.
— Вашими руками.
Он посмотрел на свои пальцы. Они всё ещё дрожали.
— Да, — сказал он. — Моими.
Человек в куртке достал телефон, набрал номер. Назвал две цифры. Слушал долго. Убрал телефон, не сказав больше ни слова.
— Правку окна — по звену. Куда успеете, — сказал человек в куртке.
— Во все борта не ляжет, — сказала Нора.
— Значит, в те, что поднимутся с нами.
Нора кивнула. Мел уже шёл к стойке.
Снаружи светало.
Он вышел в коридор. За боковой дверью был бетон, утренний холод и чужая парковка. Его машина стояла там, где он её оставил. Восемнадцать часов назад.
Телефон в кармане коротко завибрировал.
Он достал его. На экране висело новое уведомление:
Incident resolved. Ownership graph updated.
Он посмотрел на гладкое стекло. Потом на свои пальцы — на тёмные вмятины от меди.
Телефон он положил на крышу машины. Осторожно, экраном вниз.
И вернулся к серой двери.
5.
Когда он вернулся, обвязку уже перебирали. Банки на стенде заменили, кабели перетянули. Плата — та же, со свежей пайкой на входе питания и отходящей дорожкой на дальнем краю.
Нора порылась в ящике, нашла микрик, припаяла провода, воткнула между кнопкой и пином крошечный формирователь и замотала всё чёрной изолентой. Получилась грубая кнопка — мёртвый ход и короткий щелчок.
Он повертел её в руках. Щёлкнул. Ещё раз. Пальцы запомнили.
Сунул в карман.
В кармане кнопка упёрлась в твёрдый угол Moleskine. Он машинально провёл большим пальцем по потёртой обложке и отпустил.
Дальше всё двигалось быстро и не через него. Его пересаживали с места на место, один раз принесли еду, дважды просили показать пуск на стенде, но уже не объясняли, куда именно всё идёт и кто дал команду.
К вечеру во рту стоял металлический привкус кофе и недосыпа, и, если он слишком быстро поворачивал голову, взгляд собирался не сразу.
Мел упаковал модуль в армированный кейс. Человек в куртке куда-то позвонил — коротко, без имён. Нора отключила шнурок от терминала и смотала его в ладони привычным, домашним жестом, как сматывают наушники.
Его вывели через боковой док. Снаружи была ночь. Воздух был холодный и мокрый и после целого дня в сухом электрическом свете ударил по лицу, как вода.
В фургоне без окон он сел напротив Мела. Кейс лежал у Мела на коленях. Ехали молча. Фургон пах соляркой и сырым металлом. Вибрация пола отдавалась в коленях.
Мел смотрел в рифлёный пол.
— Мел, — сказал он.
Мел поднял глаза.
— На схеме не было обратного маршрута.
Мел ответил не сразу.
— У остальных бортов будет автоматика. Старая схема. Без перезапуска седьмого ядра.
— Два из шести.
— Два из шести, — повторил Мел. И, помолчав: — Я считал эти борта три месяца. На бумаге всё сходилось.
В лаборатории это называлось статистикой. Здесь — бортами.
Где-то за стенкой фургона прошла встречная — короткий тяжёлый гул, и снова тихо.
Фургон остановился. Двери открылись в ветер и натриевый свет. Бетонная полоса, запах авиационного керосина — резкий, сладковатый, ни на что не похожий.
Ноги несли его по плитам, мимо техников в сером, по ребристой аппарели внутрь — и всё это было уже не вполне с ним, а чуть в стороне, как бывает, когда слишком долго не спал и тело продолжает двигаться по инерции.
Внутри было тесно. Голый металл, кабели, запах смазки и перегретой электроники. Кейс зафиксировали в носовой стойке. За пульт села женщина с коротким ёжиком и впалыми щеками. На затылке, у основания черепа, торчал стационарный разъём — несъёмный, вросший в кожу, с потёртым кольцом вокруг. Она вогнала штекер, тело коротко дёрнулось, лицо расслабилось, и она перестала моргать.
Ему указали на место у борта. Ремни легли на грудь. Из подголовника — плотные чашки наушников, прижавшие виски.
Он достал из кармана кнопку. Вытащил заглушку из сервисного порта на кейсе. Коннектор, который Нора обжала на конце провода, вошёл в разъём со щелчком. Из второго порта вытянул штатный штекер и воткнул в гнездо ложемента — огибающая шины, сырая, без сглаживания, пошла прямо в левое ухо. Чёрная изолента на кнопке выглядела дико на фоне матового военного металла вокруг.
Впереди, в командирском ложементе, сидел человек в куртке. Затылок ровный, плечи неподвижны.
Люк втянулся в пазы. Свет переключился на красный. По корпусу пошла вибрация, перешла в тонкий вой.
Ускорение вдавило его в кресло, выбило воздух из лёгких.
Потом время распалось на шум, красный свет и пустые куски памяти. Он не спал — просто минуты выпадали, как бракованные кадры. Каждый раз возвращался к одной проверке: кнопка в руке, левое ухо живое.
Кто-то менялся у пульта. Кто-то говорил в интерком. Мел один раз наклонился к кейсу, проверил крепление и снова сел напротив.
За стенкой корпуса менялся гул. Или ему казалось, что менялся.
Когда в правом наушнике ожил голос — сухой, ровный, диктующий координаты с той пустотой, с какой читают прогноз погоды, — он уже не проваливался.
Слух зацепило название — Киренск. Рука с кнопкой стала чужой. Он перехватил её.
Впереди человек в куртке нажал клавишу интеркома. Эфир бормотал позывные, цифры маршрутных точек.
— Полковник Корто. Борт принял.
Голос в эфире повторил что-то, уже другому борту.
Он ждал. Не команды. Не сигнала. Короткой, удушливой дрожи в левом наушнике.
Он сжал кнопку крепче. Мёртвый ход пружины. Короткое сопротивление перед щелчком.
Четыре из шести.
Он закрыл глаза и стал слушать.
(читать далее...)Одиннадцать наносекунд (продолжение)
(Начало — здесь.)
2.
Серая дверь и правда была открыта.
За ней тянулся короткий коридор с бетонным полом. Верхний свет бил плоско и ровно — ни теней, ни углов. Глаза после калифорнийского белого утра привыкали медленно, и всё выглядело как чуть пересвеченная фотография.
В конце коридора ждал Мел.
Он постарел не резко, а буднично: подсох, осунулся, у висков проступила седина. Но в этом плоском свете всё читалось жёстче — как будто с лица убрали лишний слой, и осталась только кость и натянутая кожа. Стоял, чуть подавшись вперёд, будто уже собирался идти дальше.
— Привет, — сказал Мел.
— Привет.
Они постояли секунду.
— Спасибо, что приехал.
— Сам не ожидал.
Мел кивнул, как будто именно такого ответа и ждал.
— Извини за LinkedIn.
— Нормальный защищённый канал. Особенно между open to work и grateful for the journey.
У Мела дёрнулся угол рта.
— Пойдём.
Внутри бывший офис был перегорожен чёрными матовыми панелями. Пахло озоном, перегретым текстолитом, старой пылью и чем-то мясным, тяжёлым. Вентиляторы тянули одну ровную ноту — негромкую, плотную, забивающую мелкие звуки. Через минуту он перестал её слышать. Осталась только поверхность: голоса, щелчки реле, своё дыхание.
У дальнего стола сидела женщина в тёмной майке. Перед ней — три экрана, осциллограф и логический анализатор, настроенный на что-то очень быстрое. За правым ухом у неё шла тонкая линия, которую он в первый момент принял за падающую прядь. Потом понял — оптический шнур, матовый, уходящий к терминалу. Она подняла глаза, коротко посмотрела на Мела, потом на него. Он ничего не спросил.
— Нора, — сказала она.
Посмотрела на Мела.
— Это он?
— Он самый, — сказал Мел.
Чуть поодаль, у стены, стоял человек в простой тёмной куртке и ел что-то из бумажного лотка маленькой пластиковой вилкой. От лотка несло твёрдокопчёной колбасой — густой, неуместный кухонный запах в стерильном электрическом воздухе.
— У нас тут и так горелым тянет, — сказала Нора, не отрываясь от экрана.
— Значит, живём, — сказал тот и продолжил есть.
Мел кивнул на стойку.
На столе — плата размером с толстый журнал во временном стальном каркасе, блоки питания, кабели, телеметрия. Под столом — приземистый металлический ящик с жёлтыми наклейками и силовыми проводами в палец толщиной.
На отдельном экране был код. Архитектура была незнакомая, но религия узнавалась сразу: узкие векторные ядра, ручное движение данных, крошечный запас по времени. Никаких подарков от компилятора.
— Сырые счётчики покажи, — сказал он.
— Сначала контекст, — сказала Нора. — Тут три дня работы, которые ты не видел.
— Контекст я прочитаю по сырым.
Мел чуть качнул головой в её сторону.
— Покажи.
Нора помолчала. Потом убрала красивую картинку. Пальцы на клавиатуре двигались быстро.
На экране стало грязнее, но больше похоже на правду.
— Видимых ядер сколько? — спросил он.
— Восемь, — ответил Мел.
Он поднял глаза.
— Видимых для моего кода.
Мел прищурился.
— Шесть с половиной. Седьмое жрёт прерывания, на восьмом битый кэш.
Он стоял за плечом Норы. Она показывала трассу, счётчики, графики. Переключала окна, прокручивала код на отдельном экране. В какой-то момент он потянулся к стеклу.
— Покажи вот отсюда. Вверх, к началу развёртки.
Нора прокрутила. Не туда.
— Выше. К заголовку модуля.
Ещё. Опять не то.
— Дай я сам.
Нора помедлила. Потом встала — не резко, но и не сразу. Отодвинула стул ровно настолько, чтобы он мог сесть, и осталась у него за плечом.
Он сел. Moleskine упёрся в бедро через ткань кармана. Он вынул его и положил рядом с клавиатурой.
Две чёрные выгнутые половины, разведённые в стороны, как раскрытая книга.
Он спустился по файлу вниз, вернулся, нашёл начало развёртки.
Тот же почерк, что в LinkedIn. Только длиннее. И без подпорок.
Он полез глубже. К соседнему модулю, обратно, вверх к развёртке. Пальцы искали привычные комбинации — сдвинуть блок, перепрыгнуть к определению, вернуться — и стали промахиваться. Не каждый раз, но достаточно. Левая рука шла через середину, за привычными клавишами, и била в пустоту — в голый пластик стола. Правая срезала угол, которого больше не было. Каждый промах обрывал мысль, и приходилось возвращаться.
Он стиснул зубы. Выделил блок, хотел сдвинуть на два уровня — для себя, чтобы увидеть вложенность. Палец соскользнул с Shift, и вместо сдвига строка удалилась.
— Чёрт.
Отменил. Попробовал снова. Тот же промах.
Он снял руки с клавиатуры. Отодвинул её от себя.
Пластик скрипнул по столу.
Потом очень спокойно спросил:
— У вас есть нормальная клавиатура?
Нора стояла чуть позади. Она видела всё — и промахи, и как он терял нить. Ничего не сказала.
— Где-то была, — сказал Мел.
Мел ушёл к соседнему столу. Вернулся с дешёвой проводной клавиатурой — плоской, офисной.
— Другой не нашёл.
— Хватит.
Он подвинул её к себе, положил пальцы и только тогда почувствовал, как отпустило плечи. Не быстро. Не как раньше. Но хотя бы теперь можно было думать руками.
Вернулся к тому же месту. Теперь код выстроился. Шесть ядер. Общая шина. Буферы, открытые на такт дольше, чем безопасно. И на третьем развороте — чтение данных, которых там ещё нет.
— Ты здесь живёшь в долг, — сказал он, не отрывая глаз.
Нора ткнула в один из графиков.
— Срыв на третьем развороте. Не всегда в одном месте, но всегда где-то там.
— Потому что output живёт на один разворот дольше, чем должен. Перестраховались скорее всего.
Он уже видел, как это взять. Не барьером. Ритмом.
Сузить место, где код делал вид, что данные уже на месте. Сдвинуть умножения. Прижать распаковку ближе к чтению, чтобы буферы не болтались открытыми.
Текст стал складываться наклонной ёлочкой — его старой ёлочкой, которую руки помнили лучше головы.
— Два и восемь, — сказала Нора.
Он остановился.
— Что?
— Окно. Когда запустишь — будет два и восемь.
Окно. Не латенси. Не время прохода. Зазор.
Он посмотрел на неё. Потом вернулся в код, доправил последние строки.
— Запускай.
Первый прогон прошёл тихо. Второй — тоже. На третьем линия дёрнулась и встала.
— Да, — сказала Нора. — Два и восемь. Это наш рекорд; мы додумались до этого во вторник ночью. Лучше не смогли.
Он убрал руки с клавиатуры. Ёлочка лежала перед ним на экране — чистая, аккуратная, правильная. И теперь — бесполезная. Его лучший фокус здесь уже знали. Пройденная страница.
— Сколько нужно? — спросил он.
— Девять, — сказал Мел. — Лучше одиннадцать.
Девять наносекунд. Он выжимал такты из начала, чтобы зазор стал шире.
Он не встал. Смотрел на трассу ещё секунду, потом сказал:
— Покажи весь проход. Такт за тактом.
Нора развернула трассу. Каждый такт — строчка. Каждая строчка — кто чем занят: ядра, шина, буферы, очереди на запись.
Он стал считать. Такты уходили на ожидание. На пустые слоты. На моменты, когда одно ядро простаивало, потому что другое ещё не отдало данные. Каждый зазор казался крошечным, неизбежным. Но их было много.
— Вот здесь слот пустой, — он ткнул в экран. — А здесь ты ждёшь шину, хотя результат уже в регистре.
Мысль побежала быстрее слов. Сдвинуть первую запись. Подтянуть распаковку в тень ожидания. Спрятать умножение в паузу шины. Каждое движение тянуло за собой три других, и нужно было видеть танец целиком, а не отдельные шаги.
Он переставил одну строку. Вторую. Третью.
— Минус четыре, — сказала Нора. — Но ты сломал зависимость на шестом ядре.
Он посмотрел. Да. Сломал.
— Откати последнее. Предыдущие оставь.
— Минус три. Чисто.
Три такта. Меньше наносекунды. С двух и восьми до трёх и семи.
До девяти — ещё семнадцать тактов. Перестановками не обойтись.
Он сидел, глядя на трассу. Шесть ядер делили одну шину и воевали за одни и те же буферы загрузки. Каждое из них в каждый момент либо считало, либо ждало данных. Что бы он ни делал, код упирался в одно и то же: мало рук, мало воздуха.
— Расскажи мне про мёртвые ядра, — сказал он.
Мел поднял голову.
— Какая разница? Седьмое жрёт прерывания. Восьмое — битый кэш. Полтора мёртвых ядра не дадут тебе семнадцати тактов.
— Мне не нужны ядра.
Он замолчал, потому что мысль ещё складывалась. Шесть живых ядер делили общую шину. Каждое в каждый момент либо считало, либо ждало данных. Но у каждого ядра была своя scratch-память. Свой локальный кэш. И у мёртвых ядер — тоже.
Живыми эти ядра уже не были. Считать на них было нельзя. Но мёртвое железо всё ещё могло помнить.
— Мне нужна их scratch-память, — сказал он.
— И локальные кэши, — сказала Нора.
Они посмотрели друг на друга.
— Седьмое, — сказала Нора быстро. — Прерывания жрут конвейер, но кэш живой. Адресуется нормально.
Мел молчал. Потом выпрямился.
— На восьмом я писал напрямую в загрузочные буфера, — сказал Мел. — Когда гонял диагностику. Минуя шину. Код до сих пор внизу модуля. Если через те же буфера гнать данные — они пойдут мимо основной шины. Вообще мимо.
— Вот почему диагностика проходила, — сказала Нора.
— Не считать на них, — сказал он. — Ставить данные в очередь, пока живые ядра заняты. Держать промежуточное в чужих кэшах и буферах, чтобы шина не задыхалась.
Нора прогнала новый расклад.
— Три такта за обращение к кэшу седьмого. Но это развязывает очередь на шине — минус восемь-десять тактов ожидания за проход.
— А через буфера восьмого — полтора, — сказал Мел. — И путь уже готов.
Он уже не слышал.
Пальцы шли ёлочкой, но другой — не два конвейера в такт, а восемь дорожек веером. Рисунок уже не помещался в голове целиком. Ничего. Руки ещё держали.
Он перекраивал проход целиком. Рвал зависимости, раскидывал данные по чужим кэшам, выстраивал конвейер заново. Вместо шести живых ядер, задыхающихся на одной шине, у него под пальцами собиралась восьмичастная машина: шесть считали, два мёртвых держали данные — седьмое в кэше, восьмое в буферах.
На экране Норы цифры менялись в реальном времени. Он бросал строку — она сразу говорила цену. Он двигал блок — она говорила, что поехало вслед.
Мел стоял за плечом. Дыхание изменилось. Мел видел.
Он дописал последний кусок. Оторвался. Пальцы гудели. Хрустнул шеей. Клавиатура была тёплой от его рук.
— Гони.
Нора запустила. Три прохода. На третьем линия просела, качнулась и выровнялась.
Она выпрямилась.
— Восемь и один.
Мел медленно выдохнул.
— Мёртвые ядра. Три дня смотрел на них и видел мусор.
Восемь и один. До девяти оставалось совсем немного.
Ещё час назад это было бы поражением. Теперь цифра выглядела почти достаточной.
Краем глаза он увидел, как человек у стены положил пустой лоток на ящик с кабелями и подошёл к экрану. Впервые за всё время — не к стене, а к цифрам. Посмотрел на восемь и один. Постоял. Вернулся к стене.
Он убрал руки с клавиатуры. Эту цифру здесь ждали не инженеры.
Нора молча переключила терминал на его участок кода и стала читать. Не результат — саму правку. Строчку за строчкой, быстрее, чем это можно читать глазами.
— Это не девять и не одиннадцать, — сказал Мел. — Но уже не два. Нам осталось три-четыре такта. Дальше мы и сами дожмём. Спасибо, что приехал.
Нора молчала.
Он встал и убрал Moleskine в карман.
— Подожди, — сказала Нора. Не оборачиваясь.
Мел поднял голову. Быстро, глухо:
— Нора.
— Он должен видеть. Там десять тактов. Даже если бы смогли, не успеем.
— Он сделал то, о чём я просил. Пусть едет.
Нора развернула ещё одно окно.
На большом экране выстроилась цепочка целиком.
Сначала он смотрел на неё как на тайминг. На структуру блоков. На длину линии. На два красных узла подготовки. На узкий переход. На выходной модуль без обратной связи. Всё было сжато слишком плотно. Всё рассчитано на один проход. Без перезагрузки. Без второй попытки.
Потом он сделал шаг назад.
И только тогда увидел не такты, а форму. Окно, которое они только что вытянули, было только входом. Дальше шла одноразовая схема. Ни петли, ни повтора. Сигнал двигался в одну сторону. Возврата не было.
На выходе были зашиты координаты.
— Куда идёт выход? — спросил он.
Мел не ответил.
Он снова посмотрел на координаты. Сначала он прочитал их как поле в структуре. Просто хвост последнего модуля. Но в тишине Мела цифры обрели вес. Они стали местом. Точкой на земле, куда вся эта цепь должна была дотянуться один раз — и больше ничего не обещала. Не цикл. Не петля. Выстрел.
— Мел. Куда идёт сигнал?
— В деку, — сказал Мел. Не глядя на него.
Он хотел сказать: нет.
Не Мелу. Не Норе. Всей этой комнате, серой двери, плате, координатам, человеку у стены.
Но на экране всё ещё висели восемь и один, два красных узла и выход без обратного маршрута. Они не закрывали проект. Они уже считали, что успеют поднять.
Он посмотрел на Мела. Потом на Нору. Потом на человека у стены.
Человек у стены стоял неподвижно. Не у экрана, не у стола — чуть в стороне, там, откуда было видно всех.
Тот выдержал его взгляд. Потом негромко спросил:
— Вам чёрный или с молоком?
Нора фыркнула, не отрываясь от экрана.
Мел потёр переносицу.
— Чёрный, — сказал он. — И покажите мне второй красный блок.
3.
Кофе оказался растворимым. Кружка — ещё мокрая, с лёгким сколом на ручке. Он отпил и поставил её рядом с клавиатурой.
Нора поправила шнурок за ухом и развернула второй красный узел.
После слова «дека» код не изменился.
Изменилось только то, как он его видел.
Те же буферы. Те же банки памяти. Те же красные узлы.
Только теперь за выходным модулем была не линия на экране, а точка на земле.
Он мог встать. Выйти наружу.
На экране уже горел второй красный узел.
Он посмотрел на свои руки — и снова положил их на клавиатуру.
Второй красный узел был хуже входного. Кто-то увлёкся красотой кода на стенде и забыл, что памяти после импульса нужно время, чтобы прийти в себя. Два участка, которые на бумаге казались независимыми, в железе дрались за один проход.
— Здесь мы были в среду утром, — сказала Нора. — Пробовали развести по времени. Получили четыре такта и сломали выходной буфер.
Она вывела на экран закомментированный блок. Его глаза зацепились за структуру — знакомую и неправильную одновременно. Они разводили по времени. Он бы развёл по месту.
— Покажи карту памяти, — сказал он.
Нора переключила экран. Карта выглядела как перенаселённая коммуналка — всё сидело друг у друга на голове.
— Вот эти два, — он ткнул пальцем. — Они не зависят по данным. Они зависят по адресу. Разнеси их в разные банки.
— Банков не хватит, — сказал Мел из-за соседнего стола. — Третий банк занят под буферизацию выхода.
— Освободи его. Выход буферизуй через локальную память седьмого.
Мел замолчал. Потом кивнул.
— Через локальную. Да. Это пройдёт.
Нора перекинула адреса. На боковом экране пересчиталась цепь. Он проследил её до выхода, до зашитых координат, и только потом полез в код.
Они работали вместе. Он правил логику, Нора считала стоимость, Мел знал, какие куски железа ещё дышат.
В какой-то момент Нора остановила его.
— Не трогай загрузку. Я уже переложила её на седьмое ядро.
Он посмотрел. Она была права — но сделала это в лоб, через два лишних обращения к шине.
— Так дороже на три такта.
— Зато не ломает выходной буфер, — сказала Нора. — Мы это проходили в среду.
Мел поднял голову от кабелей.
— Среда была до его правки. Буфер теперь свободен.
Нора помолчала. Проверила. Убрала свои два обращения.
— Да, — сказала она. — Чисто.
Минус три такта.
Когда он в следующий раз поднял голову, верхний свет уже убрали. Кто-то успел погасить панели, и пространство сузилось до экранов, столов и лиц, выхваченных из темноты голубым. Часы на запястье не горели. Он не помнил, когда они погасли.
Он покосился. Человек у стены жевал полоску сушёного мяса, отрывая волокна зубами. Нора не комментировала.
Мел сидел у стойки, привалившись спиной к кабелям, с закрытыми глазами. Не спал — пальцы изредка шевелились, будто перебирали строки в голове.
Нора работала рядом. В синем свете экрана шнурок за её ухом светился тонкой молочной линией.
Он вернулся в код. Вынес проверку туда, где она выглядела нелепо ранней. Убрал чей-то красивый комментарий — leave state clean for reuse — и превратил аккуратный handshake в слепой захват без обратной связи. Код стал грубее. Суше. Правильнее.
Последний узел оказался проще. Или он уже перестал замечать сопротивление. В какой-то момент он поймал себя на том, что не читает строки, а слышит их — ритм, в котором сбой выпирает раньше, чем глаз доходит до места. Он не остановился. Просто продолжил работать.
Нора молча считала такты. Её пальцы иногда замирали, а экран продолжал двигаться. Он больше не пытался это объяснить.
Рядом с клавиатурой появилась вторая кружка. Он не видел, кто её поставил.
Мел открыл глаза.
— Запускай полную цепь, — сказала Нора.
На большом экране выстроилось всё: импульс, окно, три исправленных узла, выход. Зелёная линия прошла ровно. Без провалов, без дрожи, без сюрпризов.
Слишком ровно.
Мел потянулся к фиксаторам — снять плату.
Он и Нора коснулись платы одновременно.
Холодная.
— Это модель, — сказала Нора.
— Ровный температурный дрейф, аккуратная просадка, — сказал Мел. — После импульса так не будет. Там рваная грязь. Шум на шине, просадка по питанию, и окно начнёт плавать.
— Грязный профиль, — сказала Нора. — Дальше начнём терять плату.
Она посмотрела на человека в куртке. Тот коротко кивнул.
Нора перенастроила среду. Тронула клавишу.
Под столом взвыл нестройный хор — и вразнобой полез вверх. Между контактами затрещали искры. Нора вжала голову в плечи.
Резко ударило — смачно, басовито, с хлёстким верхом, от которого заныли зубы. Все трое у стола дёрнулись.
Человек в куртке на секунду перестал жевать и оценивающе приподнял брови.
На экране первый участок — жёлтый. Второй — красный. На третьем система захлебнулась. График рухнул.
Мел медленно отступил от стола.
— Окно плавает, — сказал он. — Автоматика не попадает в такт.
Тишина. Вентиляторы. Собственное дыхание, слишком громкое.
(Окончание — здесь.)
(читать далее...)Одиннадцать наносекунд
1.
Новость про Atlassian он дочитал, стоя у плиты, пока в турке поднималась пенка.
На матовом стекле телефона всё ещё висело вчерашнее обращение Майка Кэннона-Брукса. 1600 человек. Десять процентов. Текст был выверенный, гладкий, с той мягкой корпоративной пунктуацией, которая должна успокаивать. «Наш подход не в том, что ИИ заменяет людей. Но было бы лицемерием притворяться, что ИИ не меняет набор навыков…» Self-fund AI and enterprise sales.
Пенка дрогнула. Он снял турку с огня, подождал секунду, поставил обратно. Руки ещё помнили этот момент — когда можно снять и когда уже поздно.
Когда-то он так же ловил на стенде дурной режим: вентилятор процессора начинал дребезжать чуть иначе, дроссели тонко подпевали под нагрузкой, и становилось ясно, что цикл опять пошёл слишком плотно. Ещё немного — и всё начнёт сыпаться. Позже выяснялось, что DMA приходит не так, как обещала бумага. Тогда это значило, что цикл ещё можно сжать, если наплевать на чужие предупреждения. Теперь от того слуха осталась только турка.
Он смахнул текст.
На кухне было тихо. На подоконнике стоял кактус, переживший три переезда.
(читать далее...)поправка Зандера
ДОКУМЕНТ №1: Статья Хальберга
К вопросу о некеплеровской стабилизации орбиты 𝛼 Aquarii III
Р. В. Хальберг
Институт небесной механики, Уппсала
Acta Mechanica Caelestis, т. 14, fasc. 3
Аннотация
На основании данных наблюдений, относящихся к системе 𝛼 Водолея, рассматривается движение объекта 𝛼 Aquarii III по внешней циркумбинарной орбите. Секулярное интегрирование при параметрах, выводимых из наблюдений, даёт для времени вековой устойчивости орбиты оценку, на два порядка меньшую, чем изохронный возраст системы. Для согласования этих величин рассматривается гипотеза переменного квадрупольного момента объекта, допускающего частичную компенсацию внешней возмущающей функции1. Показано, однако, что подобная компенсация влечет за собой термодинамические следствия, не совместимые с наблюдаемым тепловым режимом поверхности. Вследствие этого вопрос сводится к определению таких распределений плотности, вязкости и тензора инерции, при которых компенсация возмущений не сопровождалась бы недопустимой диссипацией.
(читать далее...)398 ступеней
Я всё предусмотрел.
В кармане лежала потрёпанная купюра в тысячу иен.
План был прост: добраться до дальнего озера Мотосу, достать банкноту и сверить гравюру на обороте с реальностью.

Я живу в Сан-Франциско и слишком часто водил приятелей на набережную в августе, чтобы показать пальцем в плотный туман:
“Вот там – мост Золотые Ворота, а вон там, поверьте мне на слово, Алькатрас”.
Мы называем этот туман Карлом, у него есть имя и характер.
Поэтому к Фудзи я ехал не как оптимист, а как стратег.
Три дня, две ночи.
Я знал, что гора капризна, и был готов взять временем.
горчинка на 50 миль в час
@Alexey Frunze: Открыл для себя новый сериал.
Давно таких эмоций не испытывал во время киносеанса! Называется CppCon.
@Alexander Radchenko: пилотная серия там отличная, да
@Ivan Tarasov: требую спойлеры!
@aruslan: CppCon – абсолютный экстаз!

мы только-только сходили на замечательный фестиваль вкусной еды на Форт Мейсон в СФ, где собрали локальных производителей “артизанского” шоколада, мёда, кофе, карамели итд итп,
и вот я взял распробовать совершенно божественную Black Lava карамельку
– и подумал, какой всё-таки С++ удивительный язык:
янтарный и будто прозрачный издалека —- а ближе тянется нитями,
оставляя горчинку.
казалось бы, давайте не будем думать о всяких ужасах антиалиасинга и std::launder,
и сфокусируемся на ребристом, сермяжном варианте С++, например таком:
std::map<int, int> m;
m[0] = m.size(); // ах, какая терпкая нотка!
две топологии
@_winnie: Можно интерпретировать открытый и замкнутый круг как пицца без корочки и с корочкой. И получается, что пиццу без корочки можно нарезать на прямоугольники, а с корочкой нет.
приснилось собеседование.
всё как обычно: белая доска, маркер.
немного волнения.
интервьюер – вежливый, отстраненный, словно библиотекарь провинциального филиала – чертит на доске задачу.

круг.
строгий, идеальный, почти вызывающий.
надо замостить его прямоугольниками.
я выбираю С++, надёжный и тяжелый, как фасады семейных склепов Реколеты.
(читать далее...)двадцать лет мифического человекоопыта
решил я сегодня утром попить кофейку вкусного.
и что вы думаете.
std::launder<T>.
– и кофе растянулся на час.

в прошлом году мы тут уже обсуждали ужасы object lifetime и uninitialized memory.
и вот – Gloria in excelsis Deo – механизм std::launder спешит нам всем на помощь,
продолжая делить людей на тех, кто про шашечки, и тех, кто про ехать.
357 лет одиночества
@Andrew Jelly: У меня есть гипотеза, что за эту фразу Ферма и получил определенные блага от чёрта. А тот потом менял души математиков на доказательство сотни лет подряд.
вторник. тулуза. 1637 год.
дождь за окном не столько падает, сколько транслируется.
старый, зернистый шум.
в кабинете пахнет остывшим воском и страхом.

пьер де ферма сидит перед пустым листом.
он ясно ощущает, что его процесс подходит к концу.
четырнадцатое февраля
зима. сезон дождей в СФ.
я прилетел в СФ на 14 февраля, в далеком теперь уже 2008 году.
по несколько раз на дню город преображался, и я бродил по нему в немом восторге,
вдыхая тончайшее кружево разноцветного тумана над Президио и Мариной, где Лукасфильм.
впервые в жизни я увидел как призрачным вихрем горят в тумане отражающиеся от небоскребов солнечные лучи, и я влюбился в этот город так, как только может влюбиться 32-летний мужчина с сердцем мальчишки.
и вот теперь, почти 9 лет спустя, я еду в автобусе, и до меня медленно доходит,
что в С++17 приняли не то предложение о порядке вычисления выражений
четыре data() на пути к минотавру
вторник.
вторник – это в первую очередь волшебство квин-амана.

в каком-то смысле, вторник именно чудом квин-амана лучше понедельника.
чудом квин-амана, и еще тем, что по вторникам b. patisserie открыта,
в отличие от понедельника, а там самые лучшие квин-аманы в мире.
в Гугле СФ сегодня совершенно замечательные халявные клубнично-ревеневые квин-аманы из firebrand.
с такими очень приятно не торопясь попивать кофе с видом на Bay Bridge,
– и читать код.
по вторникам я люблю читать код.
бывает, выберешь I’m feeling lucky строчку, скажем пусть из публичного ну вот
например эту одну строчку –
memset(data->data()->data()->data(), 0, data->data()->data()->length());
привяжешь к ней ниточку от клубка, что Ариадна дала, вдохнёшь поглубже, –
(читать далее...)одна фика
докладываю про std::less прямо из траншей,
потому что работать лучше с комфортом,
а для этого нужно ездить в правильные места
и ходить на фику с правильными людьми.

вообще институт фики в Швеции совершенно изумителен:
(читать далее...)два ключевых уха Бэтмана
и о канбане:
(читать далее...)два хэша в ожидании манго
@Zeux: Коротко о С++.
Я тут попробовал в UE4 импортнуть меш на 500к треугольников и импорт занимает 5 минут
Я немножко расстроился и спросил людей в теме, как так?
5 минут это по таймеру а не фигура речи
половина lvalue
замечательный вопрос на кворе:
почему бы гуглу не сделать свой IDE типа Visual Studio.
случайно посмотрел на ответы, они забавные.
но, как говорится, не тулзами едиными.
вчера в совершенно невинном вопросе про битовые поля я внезапно наткнулся на знакомого персонажа в колосящейся ржи стандарта.
тернарный оператор рваными зигзагами убегал за горизонт, но из узкой бездонной
расщелины на меня немигающе смотрели глаза Ангела С++, знакомые нам по будущим сериям.

четыре истории
Борхес – совершенен.
бывает, откроешь немножко кода, – и на просвет между почти но не совсем точными копипейстами
видишь тонкий узор Вавилонской библиотеки.
и ищешь пурпурный шестигранник, чтобы среди фрактальных трещин разглядеть неповторимую нить своей судьбы.

под утро, вглядываясь в свой ночной крэшдамп, особенно остро понимаешь,
что историй – всего четыре.
и о погоде
иногда прошлое начинает затягивать,
и тогда я делаю его позапрошлым.
здесь можно найти мое позапрошлое:
aruslan.livejournal.com
добро пожаловать в моё настоящее
прошлое.
