Профессор, калькулятор и 475 миллионов долларов убытка Intel
Если рядом есть калькулятор, неважно, виндовый или в телефоне, то за полминуты можно повторить эксперимент, который осенью 1994 года проделали тысячи людей по всему миру. Нужно разделить 4195835 на 3145727, умножить полученное на 3145727 и вычесть исходное число. На исправном железе получится ноль. Штатный калькулятор Windows на компьютере с ранним Pentium уверенно выдавал 256, и владелец новенькой машины, заплативший за неё две-три тысячи долларов, впервые всерьёз усомнился, можно ли доверять процессору даже в таком простом деле, как деление.
Ошибку обнаружил профессор математики из небольшого колледжа в Вирджинии. Он изучал простые числа и относился к компьютерам примерно так, как плотник к рубанку: вспоминал о них лишь тогда, когда стружка ложилась криво. Спустя полтора месяца после его письма о баге рассказали в вечерних новостях CNN, IBM приостановила отгрузку машин на Pentium, ночные телешоу высмеивали Intel, а в январе 1995 года компания списала в убытки 475 миллионов долларов.
Для Intel особенно досадно, что исправить сам кремний почти ничего не стоило. Новую ревизию чипа компания тихо запустила ещё летом, задолго до того, как о проблеме узнал кто-либо посторонний. Почти вся сумма набежала позже, за те несколько недель, пока Intel втолковывала покупателям, о чём им следует волноваться.
Близнецы из Линчберга
Томас Найсли преподавал в Линчбургском колледже и подсчитывал простые числа-близнецы, то есть пары вроде 11 и 13 или 29 и 31, разница между которыми равна двум. Его занимала константа Бруна — сумма обратных величин всех таких пар, сходящаяся примерно к 1,902. Вычислить её с приличной точностью можно лишь перебором: машины неделями складывают триллионы крошечных дробей, и любая погрешность в далёком знаке рано или поздно проявляется при сверке. Трудно представить задачу, которая лучше подошла бы для выявления ошибок в арифметике процессора, хотя Найсли ничего подобного не планировал.
Расчёты шли параллельно на нескольких машинах. Летом 1994 года к ним присоединился компьютер с Pentium, и уже 13 июня Найсли заметил, что его результаты расходятся с данными старых 486-х. Дальше началась работа, знакомая каждому, кто хоть раз охотился за плавающим багом. Четыре месяца он поочерёдно исключал собственный код, компилятор, чипсет материнской платы и прочих подозреваемых, и к 19 октября в списке остался один процессор. Сбой обнаружился в обратной величине простого числа 824633702441: ошибка пряталась где-то в девятом-десятом знаке. Обычный человек не заметил бы её никогда, но для суммы из миллиардов подобных слагаемых это означало, что месяцы вычислений можно выбрасывать.
24 октября Найсли сообщил о проблеме в Intel, но там его фактически отправили восвояси. Тогда 30 октября он разослал письмо знакомым, у которых стояли Pentium, 486DX4 или клоны других производителей, и попросил прогнать тест и поделиться результатами. С этого письма история перестала быть личным делом одного математика.
Пять пустых клеток
Чтобы понять, откуда взялась ошибка, стоит вспомнить, зачем Intel вообще взялась переделывать деление. В 486-м оно работало по школьной схеме со сдвигами и вычитанием и давало один бит частного за такт. Для Pentium хотелось большей скорости, поэтому в FPU внедрили алгоритм SRT (по фамилиям Sweeney, Robertson и Tocher), выдающий сразу два бита за такт. Суть SRT в том, что очередную цифру частного он угадывает по таблице, ориентируясь на старшие биты делителя и текущего остатка. Цифра может принимать одно из пяти значений, от -2 до +2, а небольшую неточность выбора алгоритм сам исправляет на следующих шагах.
Таблицу в Pentium реализовали как программируемую логическую матрицу (PLA) на 2048 ячеек, из которых заполненными должны были оказаться 1066. При переносе данных в производственную маску пять ячеек со значением +2 до литографии не добрались, и в готовом кремнии на их месте оказались нули. Сама Intel объясняла это ошибкой в скрипте, готовившем таблицу. Кен Ширрифф, в 2024 году изучавший этот участок кристалла под микроскопом, насчитал шестнадцать пропавших ячеек, но одиннадцать из них алгоритм никогда не читает. Опасными остаются ровно пять, как Intel и утверждала.
Когда деление попадает в такую ячейку, SRT берёт ноль вместо двойки. Промах оказывается больше того, что алгоритм способен исправить, поэтому он остаётся в результате и тянется через все последующие цифры. Под удар попадают лишь пары чисел, у которых делитель в двоичной записи после первых битов содержит длинную серию единиц, как у 3145727, в шестнадцатеричном виде 0x2FFFFF. Самую наглядную пару нашёл Тим Коу из Vitesse Semiconductor. По обрывочным описаниям из сети он собрал модель бага и искал, где ошибка получается крупнее всего. Проверка на этой паре умещается в несколько строк:
double x = 4195835.0;
double y = 3145727.0;
double q = x / y;
printf("%.15f\n", q); // 1.333820449136241 на исправном железе
printf("%.1f\n", x - q * y); // должен быть ноль, ранний Pentium выдавал 256
Для этой пары Pentium возвращал 1.333739068902037, то есть ошибался уже в четвёртом знаке. Именно такой пример, понятный любому бухгалтеру без всякой теории чисел, превратил математическую диковинку в газетную новость.
Тихая ревизия
К моменту письма Найсли Intel о баге уже знала: её собственные инженеры независимо обнаружили его примерно к июню 1994 года. Исправленную таблицу заложили в новые степпинги — D1 для Pentium на 60 и 66 МГц и B5 для моделей на 75, 90 и 100 МГц, — а всё, что уже лежало на складах и в магазинах, продолжали продавать, не упоминая о проблеме в документации ни словом.
Изнутри такое решение выглядит вполне инженерным. У каждого процессора есть перечень известных ошибок, производители годами живут с такими списками, сбой случается редко, отзыв стоит дорого, а тихая смена маски при продолжающихся отгрузках кажется разумной экономией. Беда в том, что в 1994 году Pentium покупали и обычные люди, которым Intel несколько лет подряд рассказывала с экранов телевизоров, что внутри у них стоит лучшее из возможного. Списков ошибок эти люди не читали, зато прекрасно умели делить на калькуляторе.
Письмо, которое ушло дальше адресатов
Письмо от 30 октября за считаные дни разлетелось по CompuServe и Usenet. Люди запускали тесты на своих машинах и выкладывали результаты, и всё развивалось по сценарию, для которого в 1994 году ещё не придумали названия. 7 ноября в Electronic Engineering Times вышла статья Александра Вулфа, где Intel признала ошибку и заверила, что уже её исправила. 22 ноября сюжет показал CNN, затем о проблеме написали New York Times и Boston Globe, причём вторая поместила материал на первой полосе.
К истории подключились все, кто умел шутить, и несколько недель Intel оставалась главным героем анекдотов — от ночных телешоу до подписей в почтовых рассылках. Самый живучий из них спрашивал, сколько инженеров Intel нужно, чтобы вкрутить лампочку, и сам отвечал: 1,99904274017, но для нетехнических пользователей и так сойдёт. Эта шутка довольно точно передаёт позицию, которую компания тогда отстаивала публично.
Раз в 27 000 лет
30 ноября Intel опубликовала white paper со статистическим анализом, из которого следовало, что средний пользователь электронных таблиц столкнётся с ошибкой примерно раз в 27 000 лет. Журнал Byte позднее прикинул, что на случайных операндах неверным оказывается примерно одно деление из девяти миллиардов. Цифры выглядели солидно, но опирались на допущение, будто числа в реальных программах похожи на случайные. Именно это допущение 12 декабря оспорила IBM.
В своём отчёте IBM показала, что в финансовых расчётах обычные десятичные значения после пары операций нередко превращаются в двоичные числа с длинными сериями единиц, которые как раз и попадают в опасную область таблицы. По её оценке, пользователь таблиц мог получить ошибку примерно раз в 24 дня. Вместе с отчётом IBM объявила о приостановке отгрузок компьютеров на Pentium, а акции Intel за несколько часов просели примерно на десять пунктов. В индустрии тут же напомнили, что IBM в то время продвигала собственный PowerPC и от неприятностей конкурента ничего не теряла.
Кто был ближе к истине, спорят до сих пор, а большинство независимых оценок сходилось на том, что обычный пользователь бага, скорее всего, не встретит никогда. Тем, кто делал игры, повезло меньше. Джон Ромеро в 2019 году рассказывал, как Майкл Абраш во время работы над Quake раз за разом воспроизводил этот баг и часами выяснял точные условия, при которых куски уровня внезапно проступали на экране под определёнными углами камеры. Так что 27 000 лет в id Software, судя по всему, уместились в пару рабочих недель.
Справка о необходимости точности
Пока шли эти споры, Intel соглашалась заменить процессор лишь тем, кто сумеет доказать, что ошибка влияет на его работу. Выходило, что человек, купивший компьютер, сначала должен объяснить производителю, зачем ему правильное деление. Энди Гроув, тогдашний глава компании, даже написал в конференцию comp.sys.intel: он признал проблему и снова убеждал всех в её редкости. Конференция отреагировала так, как реагирует любой форум, когда директор приходит к нему лично.
Программисты тем временем чинили деление своими силами. Один из обходных путей работал так: проверялся делитель, и если он попадал в опасную зону, то и делимое, и делитель умножались на 15/16, после чего деление уходило в безопасную часть таблицы. На случайных данных проверка срабатывала примерно на пяти делителях из 1024 и стоила программе процента-другого скорости. В Wolfram Research зашли ещё дальше: прямо в машинном коде уже выпущенных программ они заменили инструкцию FDIV на недопустимую, чтобы процессор проваливался в обработчик исключения, а тот считал как надо. Подобный хак в продакшене, по-моему, заслуживает отдельной витрины в музее. Microsoft же добавила в Windows утилиту, которая обнаруживала баг и попросту отключала FPU, превращая дорогой процессор в очень быстрый компьютер без сопроцессора.
20 декабря, через неделю после заявления IBM, Intel сдалась и объявила, что заменит процессор любому владельцу, который об этом попросит. Впрочем, к программе замены не допустили реселлеров и сборщиков, и менять чип каждому приходилось самостоятельно. Позже в интервью Wall Street Journal Гроув признал, что компания взялась решать за людей, о чём им следует беспокоиться, и более ёмкого описания всей этой истории, пожалуй, никто так и не придумал.
Счёт за молчание
17 января 1995 года Intel объявила о списании 475 миллионов долларов до налогов. В эту сумму вошли замена процессоров и списание запасов бракованных чипов, а в долларах 2026 года она составляет почти 900 миллионов. Исправленную таблицу компания к тому времени уже полгода выпускала в новых ревизиях, и стоимость самого исправления на фоне этой цифры теряется где-то в погрешности — той самой, с которой всё началось.
Забавно, но Pentium в те месяцы продавался вполне бойко, и в годовом отчёте за 1994 год Intel с некоторой гордостью писала, что продажи продолжали расти прямо посреди скандала. Зато впервые в истории компьютерный чип отозвали целиком, и после этого никто в индустрии уже не мог делать вид, будто ошибки в кремнии остаются внутренним делом производителя.
Следующие годы Intel потратила на то, чтобы подобное не повторилось, и ей помогала вся индустрия. Уже в 1996 году появился метод word-level model checking, созданный в том числе для проверки SRT-деления. При разработке Pentium 4 доказательство теорем выявило несколько ошибок, способных закончиться таким же отзывом, а в Nehalem 2008 года формальная верификация стала для Intel основным способом валидации. Кроме того, начиная с Pentium Pro процессоры научились принимать обновления микрокода, и часть ошибок, которые прежде означали замену железа, теперь закрываются патчем в составе обновления BIOS, о котором вы, скорее всего, даже не узнаете.
Часть бракованных Pentium Intel, к слову, залила в прозрачный пластик и превратила в брелоки с фразой Гроува о том, что плохие компании кризис уничтожает, хорошие — переживают, а великие после него становятся лучше. Найсли же после всей этой истории продолжил считать свою константу и ещё много лет публиковал новые оценки. Из всех участников событий он, похоже, единственный с самого начала хотел от процессора лишь одного — чтобы тот правильно делил.
Как осмыслить резонанс, если мы привыкли воспринимать мир как неподвижный?
ИИ-сотрудник за один день разобрал 1072 открытые задачи теории групп, и одна из них, похоже, поддалась
Почему автобус вечно опаздывает, или Доказанная теорема вашего невезения
Заводам не требуются 3,5 миллиона работников?
Звёздные карусели в Hen 2–10
Спросите Итана: если разумная жизнь за пределами Земли существует, удастся ли нам выйти на связь?
Ответ Итана: что человечество должно сказать Вселенной?
Кэти Мак: как закончится существование Вселенной (интервью)