Post on 20-Oct-2019
Technische Universität München
Der Intel Pentium FDIV Bug
oder 2.0 + 2.0 = 3.999998456?
Software-Fehler, SoSe 2010, Markus Dauberschmidt, daubersc@in.tum.de, 02.07.2010
Technische Universität München
Der Intel Pentium Prozessor P5
• Vorgestellt 1993 von Intel, als Nachfolger des i486
• Intel entschied sich gegen den Namen i586, weil dieser Name nicht geschützt werden konnte
• Erste Version der CPU: 3.1 Mio. Transistoren auf einer • Erste Version der CPU: 3.1 Mio. Transistoren auf einer Fläche von 16.7mm x 17.6mm, Taktrate 60/66 MHz
• Auf den P5 folgte eine Vielzahl von Pentium-Varianten (Pentium Pro, Pentium MMX, Pentium II/III/4, …)
• Der Pentium nutzte den Dividier-Algorithmus „SRT“, der ihn 3x schneller als den i486 machte
• Im November 1994 wurde der FDIV Bug entdeckt…
02.07.2010 2Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
• Der Bug wird gemeinhin „FDIV Bug“ genannt, aber er betrifft nicht nur FDIV, sondern auch FDIVP, FDIVRP, FPTAN, ... � alle Funktionen die den Radix 4 SRT
Algorithmus zur Berechnung verwenden
02.07.2010 3Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Wie berechnet der Pentium eine Division?
• Zahlen werden grundsätzlich normalisiert:
1011.1011 � 1.0111011 x 23
• Am Beispiel: 1011.1011 : 11.001000
)13(
1
3
1
3
21001000.1
0111011.1
2
2
1001000.1
0111011.1
21001000.1
20111011.1−
×=×=
×
×
02.07.2010 4Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Die „Carry-Save-Addition“
• Carry (Überträge) und Teilsummen werden separat gehalten bis zum Schluss.
• Beispiel: Addition von A,B und C
• Nachteil der Methode: CARRY + PARTIAL_SUM erfordert eine Betrachtung aller Stellen
02.07.2010 5Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Approximation
• Oftmals reicht aber auch ein Schätzwert aus!
� Verwerfen aller Stellen ab Position X
Man kann zeigen:
Schätzwert = Echter Wert – (Summe der abgeschnittenen Stellen)
02.07.2010 6Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Die iterative Divisions-Formel
))()(()1( DjqjRbasisjR ×−×=+
R(j+1) = Rest nach der (j+1)-ten IterationD = DivisorR(j) = Rest nach der j-ten IterationR(j) = Rest nach der j-ten IterationR(0) = Dividendq(j) = Quotient an der Stelle j
� Herleitung der Formel an der Tafel
,......23203125,7 =÷Dividend
Divisor Quotient
02.07.2010 7Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Hieraus folgt
DbasisR ×<≤0
Sowie
(mit n,m = kleinster/größter nutzbarer Quotientenstellenwert)
...).()1(...).( mmmmmDjRnnnnnD ×<+≤×
02.07.2010 8Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Beispiel einer „Lookup“-Table
9 9 4 3 2 1 1 1 1 1
8 8 4 2 2 1 1 1 1
7 7 3 2 1 1 1 1
6 6 3 2 1 1 1
5 5 2 1 1 1
Rest
5 5 2 1 1 1
4 4 2 1 1
3 3 1 1
2 2 1
1 1
0
0 1 2 3 4 5 6 7 8 9
Divisor
,...237 =÷
02.07.2010 9Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Der Radix 4 SRT Algorithmus
• Benannt nach Sweeny, Robinson, Tocher
• Rechnung mit Basis 4 nicht wie üblich 2 � dadurch 2 Ergebnisbits pro Rechenschritt anstatt 1 � Radix 4 SRT
• Quotientenmenge = [-2,1,0,1,2] � Vorteil: Nur Zahlen, die als Zweierpotenzen darstellbar sind.
• Somit sieht unsere bereits bekannte Formel nun so aus:
02.07.2010 10Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
))()((4)1( DjqjRjR ×−×=+
Technische Universität München
Unsere bereits ermittelten Gleichungen lauten also
...)2222.2()1(...)2222.2( ×<+≤× DjRD
)22( ≡−
2.2222…4 = 8/310, somit gilt auch:
bzw:
)3
8()1()
3
8( ×<+≤−× DjRD
)3
8())()((4)
3
8( ×<×−×≤−× DDjqjRD
02.07.2010 11Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
• Setzt man in die Formel die verschiedenen Werte von q (-2,-1,0,1,2) ein, ergeben sich die Intervalle:
• … mit folgender Lookup-Tabelle
12Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt 02.07.2010
Technische Universität München
Die Pentium Lookup Table
Die Grafik zeigt den Ausschnitt der Lookup Table für q(j)=2.
Im Bereich von q=2 gibt es 5 rotmarkierte Zellen.
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
13
Diese Zellen enthalten einen falschen Wert(0 anstatt 2).
Diese fünf falschen Wertesind die Ursache für denPentium Bug!
Technische Universität München
Konsequenzen
• Es lässt sich zeigen, dass mindestens sechs 1er Stellen im Divisor beginnend ab der 5. Stelle vorkommen müssen, damit der Fehler auftritt, und dass dies generell erst ab der 9. Stelle passieren kann.
• Die folgenden Werte wurden ermittelt:• Die folgenden Werte wurden ermittelt:
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
14
Anzahl der 1en in Folge Fehler ab Stelle
6 15
7 Tritt nicht auf
8 10
9 10
10 10
11 9
Technische Universität München
Ursache und Entdeckung des Fehlers
• Ein Intel Ingenieur hatte ein C-Programm geschrieben, welches die Tabelle in ein PLA (programmable logicalarray) schrieb, das Teil der FPU wurde.
• Dieses PLA wurde nicht getestet und gelangte in die Produktion…
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
15
Entdeckt wurde der Fehler von Prof. Thomas Nicely vom Lynchburg College in Virginia im Oktober 1994 bei der Durchführung numerischer Berechnungen mit Primzahlen.
Technische Universität München
• Er entdeckte Merkwürdigkeiten in den Ergebnissen, die nur bei den Pentium-Chips auftraten. Zufällig stieß er auf 2 Primzahlen, bei denen der Pentium sich verrechnete.
• Er kontaktierte den Intel-Support, doch dort konnte man ihm nicht helfen: Das Problem sei nicht bekannt.
• Dies ist erstaunlich, denn Intel will zu diesem Zeitpunkt den Fehler bereits selbst erkannt haben und lieferte auch schon im Oktober fehlerbereinigte Modelle.
02.07.2010 16Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
• Nicely wandte sich daraufhin an die Newsgroup comp.sys.intel, wo sich die Nachricht wie ein Lauffeuer verbreitete und sich weitere Personen meldeten, die ebenfalls auf den Fehler gestoßen waren.
• Tim Coe gelang es anhand der Problemmeldungen, den Algorithmus und die Lookup-Tabelle zu „reverse-engineeren“.
02.07.2010 17Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Behauptungen zur Auftritts-Häufigkeit
– Intel Whitepaper: Alle 27000 Jahre und nur unter speziellen Umständen
– c‘t Magazin: Statistisch gesehen alle 60 Stunden
– IBM: Alle 6h, aber: IBM war Intels Konkurrent – IBM: Alle 6h, aber: IBM war Intels Konkurrent (PowerPC, RS/6000)
Intels verharmlosende Aussage verstimmte die
Fachwelt und führte zu einer „Anti-Intel“-Propaganda.
02.07.2010 18Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
Technische Universität München
Intels Haltung und die Folgen
• Zunächst stritt Intel ab, dass es einen Fehler gibt.
• Als dessen Existenz bewiesen wurde, wurde er heruntergespielt.
• Ein genereller Austausch wurde nicht angeboten. • Ein genereller Austausch wurde nicht angeboten. Betroffene sollten beweisen, dass ein Austausch für sie nötig sei.
• Die immense negative Publicity zwang Intel zum Austausch aller Pentium CPUs auf Anfrage �Entstandener Schaden dadurch: über 400 Mio USD.
• Intel veröffentlichte Stellungnahmen und begann seitdem pro-aktiv über Fehler zu informieren.
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
19
Technische Universität München
• Trotz drastisch erhöhter Ausgaben für die QA sollte der FDIV Bug nicht der letzte Fehler sein:
Es folgte noch der „F00F“-Bug beim Pentium, bei dem Es folgte noch der „F00F“-Bug beim Pentium, bei dem die CPU „einfrieren“ konnte und der DAN-0411-Bug (float/int conversion) und auch spätere Generationen hatten anfangs immer wieder mit „Kinderkrankheiten“ zu kämpfen, welche durch „Microcode“ Updates behoben wurden (z.B. im Rahmen von BIOS Updates o.ä.)
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
20
Technische Universität München
• Test im Windows Taschenrechner
5506153 : 294911
• Korrektes Ergebnis: 18,67055823621
• Pentium Ergebnis: 18,66990719234
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
21
Technische Universität München
FDIV Workaround
/***************************************************************/
Q8: What about the so-called "workarounds" for the bug?
/***************************************************************/
RESPONSE: The workaround finally recommended by Intel is to replace each division
operation by a function call. The function checks the divisor for the critical bit
pattern; if it is not present, the result of a normal division is returned; if the
critical pattern is found, the numerator and denominator are each multiplied by
15/16 before the division is performed. The factor 15/16 was determined to shift 15/16 before the division is performed. The factor 15/16 was determined to shift
critical bit patterns to benign ones, while it does not shift any benign critical
bit patterns to erroneous ones. The replacement function for long double division
in C might look like the following.
long double ldQuotient(long double ldNumerator, long double ldDenominator) {
unsigned short int ui, *uip;
uip = (unsigned short int *)(ldDenominator);
ui = *(uip + 3);
if ((ui & 0x07e0)==0x07e0)
return(((15.0L/16.0L)*ldNumerator)/((15.0L/16.0L)*ldDenominator))
else
return(ldNumerator/ldDenominator);
}
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
22
Technische Universität München
P Produces
E Erroneous
N NumbersN Numbers
T Through
I Incorrect
U Understanding of
M Mathematics
02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt
23