34
Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

Embed Size (px)

Citation preview

Page 1: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

Der Pentium Bug

Vortrag: Boris Ljepoja

Ausarbeitung: Thomas Pfennig & Stefan Rosenegger

30. Oktober 2002

Page 2: 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

Page 3: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

Überblick

• Zeitlicher Hergang

• SRT-Divisionsalgorithmus

• Look-up-Tabelle

• Entstehung eines Fehlers

• Bitmuster

Page 4: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 5: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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)

Page 6: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 7: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 8: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 9: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 10: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

3D-Fehlerdarstellung

Page 11: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 12: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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“

Page 13: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 14: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 15: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

← „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 + …

Page 16: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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)

Page 17: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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)

Page 18: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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 + ...

Page 19: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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)

Page 20: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 21: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 22: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

Auswahlfunktion

Look-up-Table:

grün

blau

violett

rot

braun

~

~

~

~

~

2

1

0

- 1

- 2

Page 23: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 24: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 25: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 26: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 27: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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+

Page 28: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 29: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 30: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 31: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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.“

Page 32: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002
Page 33: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

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

Page 34: Der Pentium Bug Vortrag: Boris Ljepoja Ausarbeitung: Thomas Pfennig & Stefan Rosenegger 30. Oktober 2002

• 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

- -