Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober...
-
Upload
elfi-rediger -
Category
Documents
-
view
105 -
download
1
Transcript of Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober...
Der Pentium Bug
Vortrag: Boris Ljepoja
Ausarbeitung: Thomas Pfennig & Stefan Rosenegger
30. Oktober 2002
Was ist der Bug?
• Fließkommadivision kann falsche bzw. ungenaue Ergebnisse liefern
• Abhängigkeit von den Eingabewerten
• Fehler frühestens ab der vierten (Dezimal-)Stelle
Überblick
• Zeitlicher Hergang
• SRT-Divisionsalgorithmus
• Look-up-Tabelle
• Entstehung eines Fehlers
• Bitmuster
Vorgeschichte
• Ende 1993: Markteinführung des Intel Pentium™ als 486-Nachfolger
• Bis dahin umfangreichste Marketing-Kampagne um neuen Markennamen „Pentium“ bekannt zu machen
• U.a. schnellerer Dividierer in der FPU,5x schneller als 486 gleichen Takts
Zeitlicher HergangEntdeckung:• 1994 Prof. Thomas Nicely untersucht
numerisch Primzahleigenschaften
• Pentium-System liefert abweichende Ergebnisse
• Juni 94: Ursachenlokalisation in FPU des Pentium (Befehl FDIV) nach Elimination aller übrigen Fehlerquellen
Nicelys Bsp.:1/824633702441 (ab der 8. Stelle falsch)
Zeitlicher Hergang
• 24. Oktober: Nicely kontaktiert Intel
• Intel ohne Lösung,neuere Chips durch Revision aber fehlerfrei
• 30. Oktober: Nicely fragt in verschiedenen Foren nach Lösungsvorschlägen
• Nicely unterzeichnet NonDisclosure Agreement mit Intel
Coes Funktionsmodell
Timothy Coe, FPU Designer, entwickelt ein
Modell des FP-Dividierers
• Genaue Aussagen über die auftretenden Fehler:- Entstehung eines Fehlers- Bestimmung kritischer Operanden
- Wahrscheinlichkeiten für Fehlerauftreten
• Fehler ermöglicht Einblick in die Funktionsweise des Pentium-FDIV
Fehlerhäufigkeit
• Vaughan Pratt führt basierend auf Coes Modell empirische Untersuchungen durch
• 1 Million Divisionenganzzahlige Eingabegrößen {1...1000}
• 627 fehlerhafte Ergebnisse,davon 427 mit einem relativen Fehler größer als 10-7 und 14 größer als 10-5
Ausmaß
• Extrembeispiel:4195835 : 3145727
= 1,33382045(korrekt)
= 1,33373907(fehlerhafter Pentium)
• relativer Fehler ≈ 6∙10-5
• vermutlich größtmöglicher Fehler
f(x,y) = x - (x/y)∙y
f(4195835,3145727) =
= 0
= 256
3D-Fehlerdarstellung
WahrscheinlichkeitenFirmenanalysen:
• INTEL: P(FDIV-Error) = 1 : 9 Mio.- zufällig verteilte Daten- 15 min intensiver FPU Nutzung täglich
=> ein Fehler alle 27 000 Jahre
• IBM:- eine FDIV-Instruktion pro 1000 Maschinentakte
=> ein Fehler alle 28 Tage
• Pratt:- Verwendung problematischer Operanden- häufige Divisionen
=> mehr als ein Fehler pro Millisekunde
Verhalten bei Intel
• 27. November 1994:Intel räumt unter Vorbehalt „gefährdeten“ Kunden nach Prüfung der Berechtigung ein Umtauschrecht ein
• „Nicht alle User seien von der Ungenauigkeit betroffen, und wenn, dann sei es vertretbar“
Folgen• Pentiumbesitzer verstehen die
Haftungsausschluss-Politik bzw. selektiven Umtauschaktionen nicht
• Medien berichten ausführlich, so dass Empörung weit über die „Computer-Welt“ hinaus herrscht
• Mitte Dezember:Intel versucht Rufschädigung zu begrenzen und bietet bedingungslosen Austausch aller defekten Pentium CPUs an
Non-Restoring-Division
Restoring-Division
Probesubtraktion des Divisors:– Positives Ergebnis = Weiterrechnen– Negatives Ergebnis = Ursprünglichen Wert
wiederherstellen (restore) & neue Subtraktion
Non-Restoring-Division
Akzeptierung von negativen Resten und
spätere Korrektur
← „Shift“ um eine Dezimalstelle
← „Shift“ um eine Dezimalstelle
5
0 - 20 –
,2
0 - 8 2
4- 16 1
17 : 4 =
Schuldivision
= 4∙100 + 2∙10-1 + 5∙10-2 + 0∙10-3 + …
Bezeichnungen
p Dividendd Divisorq Quotient
pk Divisionsrest im (k+1)-ten Schritt
qk Quotientenbit im (k+1)-ten Schritt
o.B.d.A.: 1 ≤ p, d < 2 (Radix 4)
Divisionsalgorithmus
p0 := pfor k = 0,1,... {
Wähle Quotientenziffer qk є
als Funktion von pk und d, so dass gilt:
pk+1 := (pk - qk∙d)
pk+1 є [0,10d[}p/q = q0 + q1∙10-1 + q2∙10-2 + ...
{0,...,9}{-a,...,0,...,a}
10r
|pk+1| ≤ adr/(r-1)
p/q = q0 + q1∙r-1 + q2∙r-2 + ...
Basis r = 10:Basis r: (2a +1 ≥ r)
Radix 4-SRT-Division Basis r = 4
p0 := p
for k = 0,1,... {
Wähle Quotientenziffer qk є {-2,-1,0,1,2}
als Funktion von pk und d, so dass gilt:
pk+1 := 4(pk - qk∙d)
|pk+1| ≤ 8/3d
}p/q = q0 + q1∙4-1 + q2∙4-2 + ...
Radix 4-SRT-Division
Bedingungen für Korrektheit:
pk+1 := 4(pk - qk∙d) |pk+1| ≤ 8/3d
Gültige (nicht eindeutige) Darstellung von p/d:p/d = q0.q1q2q3q4q5... (Basis 4)
Radix 4-SRT-Division
Vorteile:
• Multiplikation mit {-2,-1,0,1,2} einfach auf Rechnern realisierbar
• Redundanz ermöglicht Berechnung zweier (binärer) Quotientenbits in einem Takt
• Kompatibilität mit rechnerüblicherCarry-Save-Addition
Ziffernauswahl
• Bestimmung der aktuellen Quotientenziffer aus 2-dim PD-Table
• Indizierung durch Näherungswerte für d (fest) und pk (variabel)
• Festlegung:
D = x.yyyy P = xxxx.yyy
D ≤ d < D+ = D + 1/16
Pk ≤ pk < Pk + 1/4
Auswahlfunktion
Look-up-Table:
grün
blau
violett
rot
braun
~
~
~
~
~
2
1
0
- 1
- 2
FDIVD := floor1/16[d]; for k = 0,1,...,N {
Pk := floor1/4[pk];
qk := table-lookup(Pk,D);
Berechne (-qkd) über Nullierung oder Shift und/oder 1-Komplement;
pk+1 := 4(pk + (-qkd)); // 2x Shift
Korrigiere 1-Komplement falls qk < 0 durch Einfügen von „1“ am LSB von ck+1
}p/q = q0 + q1∙4-1 + q2∙4-2 + ... + qN∙4-N
Physische Ursache
• 5 Einträge am oberen Ende des erreichbaren Bereichs des PLA sind fehlerhaft
• Zellen wurden bei der Produktion mit „0“ anstelle der korrekten „2“ belegt
• Auslesen der falschen Werte produziert fortschreitend falsche Quotientenbits
Physische Ursache
• Steuerungsskript übertrug nur 1061 von 1066 Einträgen des Entwurfs
• Grund war laut Intel zu kurze FOR-Schleife
• Fehlerhafte Einträge entsprechen unterer Schranke für Obergrenze
• Korrespondenz mit 5 unerreichbaren Einträgen am anderen Ende
Fehlercharakteristika
• Kritische Divisorwerte:2/3D+ = n∙1/8 mit n є {1,2,...}
D = 17/16 = 1.0001D = 20/16 = 1.0100D = 23/16 = 1.0111D = 26/16 = 1.1010D = 29/16 = 1.1101
• Fehlerhafte Einträge:PBad = 8/3D+ - 1/8
Erreichbarkeit
• PBad nur vom Eintrag unmittelbar unterhalb (Foothold) erreichbar
• Foothold nur auf vier Wegen erreichbar
Beschreibung Symbol Wert
oberes Ende q = - 2 Bereich P-2max - 1/4 - 4/3D+
oberes Ende q = - 1 Bereich P-1max - 1/4 - 1/3D+
Eintrag unterhalb Foothold PBad - 1/4 - 3/8 + 8/3D+
Foothold PBad - 1/8 - 1/4 + 8/3D+
Fehlerentstehung
• nur erstere beiden Wege können über Foothold unmittelbar im folgenden Schritt zu PBad führen
• Fehlerentstehungsmuster
P: P-2max/P-1
max → PBad - 1/8 → PBad
q: - 2/- 1 → 2 → 0
Bitmuster
• Erreichen des Footholds führt nicht zwingend zu PBad
• Fehlerentstehung funktioniert nur mit bestimmten Bitmustern
• Notwendiges Bitmuster:
d = d1d2d3d4...
d1 bis d4 ergeben kritischen Divisor
d5 bis d10 müssen „1“ sein
Bitmuster
• Analyse der Bitmuster zeigt:frühestens im 7. Schritt kann zum ersten Mal qk < 0 auftreten
• Fehler kann daher frühestens im 9. Schritt entstehen(q0 bis q7 stets korrekt)
• Ursache für obere absolute Fehlerschranke bei ca. 5∙10-5, meist deutlich darunter
Erfahrungen
• Immenser Imageschaden für Intel
• Kosten für Austauschaktion lagen bei $464 Mio.
• Pentium späterer Baureihen nach Revision korrigiert
• „The bug in the Pentium was an easy mistake to make, and a difficult one to catch.“
Carry-Save-Addition
• Speicherung der Übertragbits in zusätzlichem „carry-word“
• Vermeidung der „carry-propagation“
• Darstellung des Rests im Carry-Save-Format:
pk = sk + ck
• Bestimmung des neuen Näherungswertes Pk+1 durch:
Pk+1 := 4(Pk - qkD+) + Rk
• Korrekturterm Rk ≤ Rkmax:
q = 2: Rkmax = 5/4
q = 1: Rkmax = 1
q = 0: Rkmax = 7/8
q = 1: Rkmax = 3/4
q = 2: Rkmax = 3/4
Divisionsrest
- -