Введение

Ошибка в блоке вычислений с плавающей запятой Intel Pentium

Ошибка Pentium FDIV — это аппаратная ошибка, затрагивающая блок вычислений с плавающей запятой (FPU) ранних процессоров Intel Pentium. Из-за этой ошибки процессор выдавал неверные результаты бинарных вычислений с плавающей запятой при делении определенных пар чисел высокой точности. Ошибка была обнаружена в 1994 году Томасом Р. Нисли, профессором математики Линчбургского колледжа. Отсутствие значений в таблице поиска, используемой алгоритмом деления с плавающей запятой в FPU, приводило к возникновению небольших ошибок в вычислениях. Хотя в большинстве случаев эти ошибки возникали редко и приводили к незначительным отклонениям от правильных результатов, в определенных ситуациях ошибки могли возникать часто и приводить к более существенным отклонениям. Серьезность ошибки FDIV является предметом споров. Несмотря на то, что большинство пользователей редко сталкивались с этой проблемой (журнал Byte оценил, что 1 из 9 миллиардов операций деления с плавающей запятой со случайными параметрами приводил к неточным результатам), как сама ошибка, так и первоначальная реакция Intel на неё вызвали резкую критику со стороны технологического сообщества. В декабре 1994 года Intel отозвала дефектные процессоры, что стало первым полным отзывом компьютерного чипа. В своем годовом отчете за 1994 год Intel сообщила о понесенных "затратах в размере 475 миллионов долларов США до уплаты налогов на возмещение стоимости замены и списание этих микропроцессоров".

Открытие и ответ

Томас Найсли, профессор математики в Линчбургском колледже, написал код для перечисления простых чисел, пар простых чисел, простых троек и четверок простых чисел. Найсли заметил некоторые несоответствия в расчетах 13 июня 1994 года, вскоре после добавления системы Pentium в парк его компьютеров, но не смог исключить другие факторы (такие как ошибки программирования, чипсеты материнской платы и т. д.) до 19 октября 1994 года. По сообщениям, Intel узнала о проблеме независимо к июню 1994 года и начала её устранять, но решила не публиковать никаких подробностей и не отзывать затронутые процессоры. 30 октября 1994 года Найсли отправил электронное письмо с описанием ошибки различным научным контактам, запросив сообщения о тестировании на 486 DX4, Pentium и клонах Pentium, и впоследствии об этом сообщила CNN в репортаже, вышедшем в эфир 22 ноября. Об этом также написали New York Times и Boston Globe, причем в последней статья была на первой полосе. В связи с этим Intel признала ошибку в вычислениях с плавающей точкой, но заявила, что она несерьезная и не повлияет на большинство пользователей. Intel предложила заменить процессоры пользователям, которые могли бы доказать, что они затронуты. Однако, хотя большинство независимых оценок показали, что ошибка окажет очень ограниченное влияние на большинство пользователей, она вызвала значительный негативный резонанс для компании. Во время выступления в 2019 году, размышляя о разработке Quake, Джон Ромеро описал, как часто и устойчиво эта ошибка воспроизводилась, описав поведение, которое Майкл Абраш потратил часы на отладку, в результате чего части уровня игры неожиданно появлялись при просмотре с определенных углов камеры. IBM приостановила продажу ПК с процессорами Intel, а цена акций Intel значительно упала. Мотивы решения IBM вызвали вопросы у некоторых в отрасли; в то время IBM производила процессоры PowerPC и потенциально могла извлечь выгоду из репутационного ущерба Pentium или Intel как компании. Однако это решение привело к тому, что корпоративные покупатели компьютерного оборудования потребовали замены существующих процессоров Pentium, и вскоре после этого другие производители ПК начали предлагать замену дефектных чипов Pentium без лишних вопросов. 17 января 1995 года Intel объявила об убытке до налогообложения в размере 475 миллионов долларов, который, как утверждалось, представляет собой общую стоимость замены дефектных процессоров. Реакция Intel на ошибку FDIV была приведена в качестве примера того, как влияние проблемы на общественные отношения затмевает практическое влияние этой проблемы на клиентов. Хотя большинство пользователей вряд ли столкнутся с этой ошибкой в повседневных вычислениях, первоначальная реакция компании на отказ заменять чипы, если клиенты не могли гарантировать, что они затронуты, вызвала критику со стороны небольшого, но влиятельного числа экспертов отрасли. Последовавшая огласка подорвала доверие потребителей к процессорам и привела к требованиям принять меры даже со стороны людей, которые вряд ли пострадали от этой проблемы. Энди Гроув, генеральный директор Intel в то время, был процитирован в The Wall Street Journal со словами: "Я думаю, что суть проблемы, которую мы упустили, заключалась в том, что мы позволили себе говорить кому-то, о чем ему следует или не следует беспокоиться, или что ему следует или не следует делать". Intel начала активно использовать формальную верификацию при разработке более поздних архитектур процессоров. При разработке Pentium 4 были использованы символическая оценка траектории и доказательство теорем для выявления ряда ошибок, которые могли привести к аналогичному отзыву, если бы они остались незамеченными. Nehalem, разработанная в 2008 году, стала первой микроархитектурой Intel, в которой формальная верификация использовалась в качестве основного метода проверки.

Затронутые модели

Ошибка FDIV влияет на процессоры Pentium P5 800 с частотой 60 и 66 МГц в модификациях до D1, а также на процессоры Pentium P54C 600 с частотой 75, 90 и 100 МГц в модификациях до B5. Процессоры P54C и P54CQS с частотой 120 МГц не подвержены этой ошибке.

Платформа для исправления

Различные программные патчи были выпущены производителями для обхода ошибки. Один конкретный алгоритм, описанный в статье в журнале IEEE Computational Science & Engineering, заключается в проверке делителей, которые могут привести к доступу к ячейкам программируемой логической матрицы, ошибочно содержащим нуль, и, в случае их обнаружения, умножении числителя и знаменателя на 15/16. Это выводит их за пределы "проблемного" диапазона. Данное исправление влечет за собой измеримое снижение производительности. В худшем случае, для программы, выполняющей исключительно операции FDIV с неудачными делителями, время выполнения удвоится, так как каждая операция FDIV будет занимать около 80 вместо 40 тактов. При использовании большего количества случайных делителей среднее время выполнения одной операции FDIV составляло приблизительно 50 тактов, то есть на проверку делителя добавлялось 10 тактов: только 5 из 1024 случайных делителей вызывали применение корректирующего множителя. Поскольку FDIV – редкая операция в большинстве программ, типичное замедление при установленном исправлении составляло один процент или меньше.