Der Intel Pentium FDIV Bug - bigigloo.de fileDer Intel Pentium Prozessor P5 • Vorgestellt 1993 von...

24
Technische Universität München Der Intel Pentium FDIV Bug oder 2.0 + 2.0 = 3.999998456? Software-Fehler, SoSe 2010, Markus Dauberschmidt, [email protected], 02.07.2010

Transcript of Der Intel Pentium FDIV Bug - bigigloo.de fileDer Intel Pentium Prozessor P5 • Vorgestellt 1993 von...

Technische Universität München

Der Intel Pentium FDIV Bug

oder 2.0 + 2.0 = 3.999998456?

Software-Fehler, SoSe 2010, Markus Dauberschmidt, [email protected], 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

Technische Universität München

Vielen Dank für Eure Aufmerksamkeit!Vielen Dank für Eure Aufmerksamkeit!

02.07.2010Software Fehler, Der Intel Pentium FDIV Bug, SoSe2010, Markus Dauberschmidt

24