Ошибка Pentium FDIV — это аппаратная ошибка, влияющая на блок с плавающей точкой (FPU) ранних процессоров Intel Pentium . Из-за этой ошибки процессор возвращал неверные двоичные результаты с плавающей точкой при делении определенных пар чисел высокой точности . Ошибка была обнаружена в 1994 году Томасом Р. Найсли, профессором математики в колледже Линчбурга . [1] Отсутствующие значения в таблице поиска, используемой алгоритмом деления с плавающей точкой FPU, приводили к тому, что вычисления приобретали небольшие ошибки. Хотя эти ошибки в большинстве случаев использования возникали редко и приводили к небольшим отклонениям от правильных выходных значений, в определенных обстоятельствах ошибки могут возникать часто и приводить к более значительным отклонениям. [2]
Серьёзность ошибки FDIV обсуждается. Хотя она редко встречается у большинства пользователей ( журнал Byte подсчитал, что 1 из 9 миллиардов делений с плавающей точкой со случайными параметрами даст неточные результаты), [3] как сама ошибка, так и первоначальное отношение Intel к этому вопросу подверглись резкой критике со стороны технического сообщества.
В декабре 1994 года Intel отозвала дефектные процессоры, что стало первым полным отзывом компьютерного чипа. [4] В своем годовом отчете за 1994 год Intel заявила, что понесла «расходы в размере 475 миллионов долларов до вычета налогов... на возмещение расходов по замене и списанию этих микропроцессоров». [5]
Чтобы повысить скорость вычислений с плавающей точкой деления на чипе Pentium по сравнению с 486DX , Intel решила заменить алгоритм деления со сдвигом и вычитанием на алгоритм Суини, Робертсона и Точера (SRT). Алгоритм SRT может генерировать два бита результата деления за такт , тогда как алгоритм 486 мог генерировать только один. Он реализован с использованием программируемой логической матрицы с 2048 ячейками, из которых 1066 ячеек должны были быть заполнены одним из пяти значений: −2, −1, 0, +1, +2 . Когда был скомпилирован исходный массив для Pentium, пять значений не были правильно отправлены на оборудование, которое вытравливает массивы в чипах, — таким образом, пять ячеек массива содержали ноль, когда они должны были содержать +2. [6]
В результате вычисления, основанные на этих пяти ячейках, приобретают ошибки; эти ошибки могут накапливаться многократно из-за рекурсивной природы алгоритма SRT. В патологических случаях ошибка может достигать четвертой значащей цифры результата, хотя это бывает редко. Ошибка обычно ограничивается девятой или десятой значащей цифрой. [3]
Только определенные комбинации числителя и знаменателя вызывают ошибку. Одним из часто встречающихся примеров является деление 4 195 835 на 3 145 727. Выполнение этого вычисления в любом программном обеспечении, использующем сопроцессор с плавающей точкой, например, в Windows Calculator , позволит пользователям узнать, затронут ли их чип Pentium. [7]
Правильное значение расчета:
При преобразовании в шестнадцатеричное значение, используемое процессором, 4 195 835 = 0x4005FB и 3 145 727 = 0x2FFFFF. «5» в 0x4005FB запускает доступ к «пустым» ячейкам массива. В результате значение, возвращаемое неисправным процессором Pentium, неверно на уровне четырех цифр или более: [8]
что на самом деле является значением .
Томас Найсли, профессор математики в колледже Линчберга, написал код для перечисления простых чисел , простых чисел-близнецов , простых троек и простых четверок . Найсли заметил некоторые несоответствия в вычислениях 13 июня 1994 года, вскоре после добавления системы Pentium к своей группе компьютеров, но не смог устранить другие факторы (такие как ошибки программирования, чипсеты материнской платы и т. д.) до 19 октября 1994 года. [1] 24 октября 1994 года он сообщил о проблеме в Intel. [9] Как сообщается, Intel самостоятельно узнала о проблеме к июню 1994 года и начала ее исправлять в этот момент, но решила не раскрывать публично никаких подробностей или не отзывать затронутые процессоры. [10]
30 октября 1994 года Nicely отправил электронное письмо с описанием ошибки различным академическим контактам, запрашивая отчеты о тестировании уязвимости на 486-DX4 , Pentium и клонах Pentium . [9] Ошибка была быстро проверена другими, и новости о ней быстро распространились в Интернете . Ошибка получила название «ошибка Pentium FDIV» из- за мнемоники языка ассемблера x86 для деления с плавающей точкой, наиболее часто используемой затронутой инструкции. [9]
История впервые появилась в прессе 7 ноября 1994 года в статье в Electronic Engineering Times под названием «Intel исправляет ошибку Pentium FPU» Александра Вулфа [11] и впоследствии была подхвачена CNN в сегменте, вышедшем в эфир 22 ноября. О ней также сообщили New York Times и Boston Globe , попав на первую страницу последней. [10] [12]
На этом этапе Intel признала наличие ошибки с плавающей точкой, но заявила, что она не является серьезной и не повлияет на большинство пользователей. Intel предложила заменить процессоры пользователям, которые могли доказать, что они были затронуты. Однако, хотя большинство независимых оценок показали, что ошибка окажет очень ограниченное влияние на большинство пользователей, она вызвала значительную негативную реакцию в прессе для компании. Во время выступления в 2019 году, размышляя о разработке Quake , Джон Ромеро описал, как часто и настойчиво эту ошибку мог воспроизводить Майкл Абраш . Абраш потратил часы на отслеживание точных условий, необходимых для возникновения ошибки, которая приводила к тому, что части игрового уровня неожиданно появлялись при просмотре с определенных углов камеры. [13] IBM приостановила продажу ПК с процессорами Intel, и цена акций Intel значительно снизилась. [14] Мотив решения IBM был подвергнут сомнению некоторыми представителями отрасли; в то время IBM производила процессоры PowerPC и потенциально могла выиграть от любого репутационного ущерба Pentium или Intel как компании. Однако это решение привело к тому, что корпоративные покупатели ПК-оборудования стали требовать замены существующих процессоров Pentium, и вскоре после этого другие производители ПК начали предлагать «без лишних вопросов» замену дефектных чипов Pentium. [4]
Растущее недовольство реакцией Intel привело к тому, что компания предложила заменить все неисправные процессоры Pentium по запросу 20 декабря. [15] 17 января 1995 года Intel объявила о предналоговом сборе в размере 475 миллионов долларов из прибыли, якобы общей стоимости, связанной с заменой неисправных процессоров. [9] Это эквивалентно 868 миллионам долларов в 2023 году. [16] Intel подверглась критике за то, что запретила реселлерам и OEM-производителям участвовать в программе отзыва, требуя от конечных пользователей самостоятельной замены чипов. Обоснование Intel, опубликованное на ее веб-странице поддержки, состояло в том, что «это индивидуальное решение конечного пользователя определить, влияет ли недостаток на точность его приложения». [14]
Статья в журнале Science за 1995 год описывает значение задач теории чисел для обнаружения компьютерных ошибок и дает математическое обоснование и историю константы Бруна , проблемы, над которой работал Найсли, когда обнаружил ошибку. [17]
Ответ Intel на ошибку FDIV был процитирован как случай влияния проблемы на связи с общественностью , затмевающего практическое влияние этой проблемы на клиентов. [18] Хотя большинство пользователей вряд ли столкнутся с этой ошибкой в своих повседневных вычислениях, первоначальная реакция компании не заменять чипы, если клиенты не могли гарантировать, что они затронуты, вызвала сопротивление со стороны активного меньшинства отраслевых экспертов. Последующая огласка пошатнула доверие потребителей к процессорам и привела к требованию действий даже со стороны людей, которых вряд ли коснулась эта проблема. Энди Гроув , генеральный директор Intel в то время, был процитирован в The Wall Street Journal : «Я думаю, что суть проблемы, которую мы упустили... заключалась в том, что мы предполагали, что говорим кому-то, о чем они должны или не должны беспокоиться, или что они должны или не должны делать». [4]
После ошибки и последующего отзыва, в полупроводниковой промышленности наблюдалось заметное увеличение использования формальной проверки операций с плавающей точкой оборудования. Под влиянием обнаружения ошибки в 1996 году была разработана методика, применимая к алгоритму SRT, называемая «проверка модели на уровне слов». [19] Intel продолжила широко использовать формальную проверку при разработке более поздних архитектур ЦП. При разработке Pentium 4 использовались символическая оценка траектории и доказательство теорем для поиска ряда ошибок, которые могли бы привести к аналогичному инциденту отзыва, если бы они остались незамеченными. [20] Первой микроархитектурой Intel, использовавшей формальную проверку в качестве основного метода проверки, была Nehalem , разработанная в 2008 году. [21]
Ошибка FDIV затрагивает 60 и 66 МГц Pentium P5 800 в степпингах до D1, а также 75, 90 и 100 МГц Pentium P54C 600 в степпингах до B5. Процессоры 120 МГц P54C и P54CQS не затрагиваются. [22] [23]
Производители выпустили различные исправления программного обеспечения для обхода ошибки. Один конкретный алгоритм, описанный в статье в IEEE Computational Science & Engineering , заключается в проверке делителей, которые могут вызвать доступ к ячейкам программируемой логической матрицы, которые ошибочно содержат ноль, и, если они найдены, умножении числителя и знаменателя на 15/16. Это выводит их из «глючного» диапазона. Это исправление действительно несет измеримый штраф скорости — в худшем случае для программы, не выполняющей ничего, кроме операций FDIV с плохими делителями, время выполнения удвоится, поскольку каждый FDIV займет около 80 вместо 40 тактов. При большем количестве случайных делителей среднее время на FDIV составит приблизительно 50 тактов, т. е. 10 тактов, добавленных для проверки делителя: только 5 из 1024 случайных делителей вызовут исправление масштабирования. Поскольку FDIV является редкой операцией в большинстве программ, нормальное замедление с установленным исправлением обычно составляло процент или меньше. [8]
Основная проблема, с которой столкнулись компании-разработчики программного обеспечения, заключалась в реализации исправления в уже существующем программном обеспечении, большая часть которого полагалась на библиотеки, находящиеся вне их контроля. Некоторые компании, такие как Wolfram Research , решили напрямую исправить машинный код существующих исполняемых файлов, чтобы заменить код операции FDIV на недопустимую инструкцию. Это затем вызвало бы исключение, которое обработчик исключений (также исправленный) перехватил бы. Отсюда можно было бы выполнить произвольный код, чтобы обойти ошибку. [2]
Microsoft предложила обходные пути на уровне операционной системы в версиях Windows вплоть до Windows XP. В состав операционной системы входили утилиты для проверки наличия ошибки и отключения FPU в случае ее обнаружения. [24] [25]