Σφάλμα FDIV των επεξεργαστών Pentium

δεξιά|μικρογραφία| Επεξεργαστής Intel Pentium 66 MHz (sSpec=SX837) με το σφάλμα FDIV
Το **σφάλμα FDIV των επεξεργαστών Pentium** είναι ένα σφάλμα υλικού που επηρεάζει τη μονάδα κινητής υποδιαστολής (FPU) των πρώτων επεξεργαστών Intel Pentium. Λόγω του σφάλματος, ο επεξεργαστής επιστρέφει εσφαλμένα αποτελέσματα κινητής υποδιαστολής δυαδικής μορφής κατά τη διαίρεση ορισμένων ζευγών αριθμών υψηλής ακρίβειας. Το σφάλμα ανακαλύφθηκε το 1994 από τον Τόμας Νάισλι, καθηγητή μαθηματικών στο Lynchburg College. Ορισμένες τιμές που λείπουν από έναν πίνακα αναζήτησης που χρησιμοποιείται από τον αλγόριθμο διαίρεσης κινητής υποδιαστολής της FPU οδήγησαν σε υπολογισμούς με μικρά σφάλματα. Ενώ αυτά τα σφάλματα στις περισσότερες περιπτώσεις εμφανίζονται σπάνια και οδηγούν σε αποτελέσματα πράξεων με μικρές αποκλίσεις από τις σωστές τιμές, κάποιες φορές είναι δυνατό να εμφανίζονται συχνά και να οδηγούν σε πιο σημαντικές αποκλίσεις.

Η σοβαρότητα του σφάλματος FDIV είναι αμφιλεγόμενη. Αν και εμφανιζόταν σπάνια στους περισσότερους χρήστες (το περιοδικό *[[Byte (περιοδικό)|Byte]]* υπολόγισε ότι 1 στις 9 δισεκατομμύρια διαιρέσεις κινητής υποδιαστολής με τυχαίες παραμέτρους θα παρήγαγαν ανακριβή αποτελέσματα), τόσο το ίδιο το σφάλμα όσο και η αρχική διαχείριση του θέματος από την Intel επικρίθηκαν έντονα από την τεχνολογική κοινότητα. 

Τον Δεκέμβριο του 1994, η Intel ανακάλεσε τους ελαττωματικούς επεξεργαστές, γεγονός που αποτέλεσε την πρώτη πλήρη ανάκληση ενός ολοκληρωμένου κυκλώματος υπολογιστή. Στην ετήσια αναφορά της για το 1994, η Intel ανέφερε ότι επιβαρύνθηκε με «προ φόρων χρέωση 475 εκατομμυρίων δολαρίων&nbsp;[...] για την κάλυψη των εξόδων αντικατάστασης και διαγραφής αυτών των μικροεπεξεργαστών».

## Περιγραφή
Προκειμένου να βελτιώσει την ταχύτητα των υπολογισμών διαιρέσεων κινητής υποδιαστολής στον επεξεργαστή Pentium έναντι του 486DX, η Intel επέλεξε να αντικαταστήσει τον αλγόριθμο ολίσθησης και αφαίρεσης με τον αλγόριθμο Sweeney, Robertson και Tocher (SRT). Ο αλγόριθμος SRT μπορεί να υπολογίσει δύο bit του πηλίκου της διαίρεσης ανά κύκλο ρολογιού, ενώ ο αλγόριθμος του 486 μπορεί να υπολογίσει μόνο ένα. Λειτουργεί χρησιμοποιώντας έναν προγραμματιζόμενο λογικό πίνακα με 2.048 κελιά, εκ των οποίων τα 1.066 κελιά έχουν συμπληρωθεί με μία από πέντε τιμές: . Όταν δημιουργήθηκε ο αρχικός πίνακας για τον επεξεργαστή Pentium, πέντε τιμές δεν στάλθηκαν σωστά στον εξοπλισμό που χαράσσει τους πίνακες στα τσιπ − έτσι πέντε από τα κελιά του πίνακα περιέχουν μηδέν όταν θα έπρεπε να περιέχουν +2.

Ως αποτέλεσμα, οι υπολογισμοί που χρησιμοποιούν αυτά τα πέντε κελιά αποκτούν σφάλματα. Αυτά τα σφάλματα μπορεί να αρχίσουν να συσσωρεύονται, λόγω της αναδρομικής φύσης του αλγόριθμου SRT. Σε ιδιαίτερες περιπτώσεις το σφάλμα μπορεί να επηρεάσει μέχρι και το τέταρτο σημαντικό ψηφίο του αποτελέσματος, αλλά αυτό αποτελεί σπάνιο γεγονός. Το σφάλμα συνήθως περιορίζεται στο ένατο ή δέκατο σημαντικό ψηφίο. 

Μόνο συγκεκριμένοι συνδυασμοί αριθμητή και παρονομαστή προκαλούν το σφάλμα. Ένα συχνά αναφερόμενο παράδειγμα είναι η διαίρεση του 4.195.835 με το 3.145.727. Η εκτέλεση αυτού του υπολογισμού σε οποιοδήποτε λογισμικό χρησιμοποιεί την μονάδα κινητής υποδιαστολής, όπως την αριθμομηχανή των Windows, επέτρεπε στους χρήστες να ανακαλύψουν αν ο δικός τους επεξεργαστής Pentium είχε επηρεαστεί από το σφάλμα.

Η σωστή τιμή που προκύπτει από τη διαίρεση είναι:

Αν μετατρέψουμε τον αριθμητή και τον παρονομαστή στη δεκαεξαδική μορφή που χρησιμοποιεί ο επεξεργαστής, 4.195.835 = 0x4005FB and 3.145.727 = 0x2FFFFF. Το «5» στο 0x4005FB ενεργοποιεί την πρόσβαση στα 5 «κενά» κελιά. Ως αποτέλεσμα, η τιμή που προκύπτει είναι λανθασμένη από το τέταρτο ψηφίο και μετα:

}}

το οποίο στην πραγματικότητα είναι το πηλίκο της διαίρεσης  = .

## Ανακάλυψη και ανταπόκριση
Ο Τόμας Νάισλι, καθηγητής μαθηματικών στο Lynchburg College, είχε γράψει κώδικα που απαριθμούσε πρώτους, δίδυμους πρώτους, τρίδυμους πρώτους, and τετράδυμους πρώτους αριθμούς. Ο Νάισλι παρατήρησε κάποιες ασυνέπειες στους υπολογισμούς στις 13 Ιουνίου 1994, έχοντας προσθέσει προηγουμένως ένα σύστημα με επεξεργαστή Pentium στην ομάδα υπολογιστών του, αλλά δεν μπόρεσε να αποκλείσει άλλους παράγοντες που θα μπορούσαν να προκαλέσουν το σφάλμα (όπως προγραμματιστικά λάθη, το chipset της μητρικής πλακέτας, κ.ά.) μέχρι τις 19 Οκτωβρίου 1994. Στις 24 Οκτωβρίου 1994, ανέφερε το σφάλμα στην Intel. Λέγεται ότι η Intel είχε επίγνωση του σφάλματος ήδη από τον Ιούνιο του 1994 και ότι είχε ξεκινήσει να το επιδιοpθώνει, αλλα επέλεξε να μην το ανακοινώσει δημόσια και να μην ανακαλέσει τους επηρεασμένους επεξεργαστές.

Στις 30 Οκτωβρίου 1994, ο Νάισλι έστειλε ένα email περιγράφοντας το σφάλμα σε διάφορες ακαδημαϊκές επαφές του, ζητώντας αναφορές ελέγχων για το σφάλμα σε επεξεργαστές 486-DX4, Pentiums και κλώνους Pentium. Το σφάλμα επιβεβαιώθηκε γρήγορα από άλλους και τα νέα εξαπλώθηκαν στο Διαδίκτυο. Το σφάλμα ονομάστηκε «Σφάλμα FDIV του επεξεργαστή Pentium» (Pentium FDIV bug) από την εντολή της συμβολικής γλώσσας x86 για την διαίρεση κινητής υποδιαστολής, την πιο συχνά χρησιμοποιημένη εντολή που επηρεάστηκε.

Η ιστορία εμφανίστηκε για πρώτη φορά στον Τύπο στις 7 Νοεμβρίου 1994, σε ένα άρθρο στους *[[Electronic Engineering Times]]*, «Η Intel επιδιορθώνει ένα πρόβλημα FDIV του Pentium» (Intel fixes a Pentium FPU glitch) του Αλεξάντερ Γουόλφ και αναφέρθηκε έπειτα από το CNN σε μια είδηση που μεταδόθηκε στις 22 Νοεμβρίου. Αναφέρθηκε επίσης στους *New York Times* και την *Boston Globe*, κάνοντας πρωτοσέλιδο στην τελευταία.

Σε αυτό το σημείο η Intel αναγνώρισε το σφάλμα, αλλα ισχυρίστηκε ότι δεν ήταν σημαντικό και ότι δεν θα επηρεάσει τους περισσότερους χρήστες. Η Intel προσφέρθηκε να αντικαταστήσει τους επεξεργαστές χρηστών που μπορούσαν να αποδειξουν ότι είχαν επηρεαστεί. Όμως, αν και οι περισσότερες ανεξάρτητες εκτιμήσεις έδειξαν ότι το σφάλμα θα είχε πολύ μικρό αντίκτυπο στους χρήστες, δημιούργησε αρνητική δημοσιότητα για την εταιρεία. Κατά τη διάρκεια μιας ομιλίας το 2019, καθώς στοχαζόταν τα γεγονότα της ανάπτυξης του *[[Quake (βιντεοπαιχνίδι)|Quake]],* ο Τζον Ρομέρο εξήγησε πόσο συχνά και παρατεταμένα εμφανιζόταν το σφάλμα, εξηγώντας μια παράξενη συμπεριφορά που ο Μάικλ Άμπρας εξέταζε για ώρες: μέρη ενός επιπέδου του παιχνιδιού εμφανίζονταν απρόοπτα όταν τα έβλεπε κανείς από συγκεκριμένες γωνίες θέασης. Η IBM σταμάτησε την πώληση προσωπικών υπολογιστών με επεξεργαστές Intel και η τιμή της μετοχής της τελευταίας παρουσίασε σημαντική πτώση. Κάποιοι αμφισβήτησαν τους στόχους πίσω από την απόφαση της IBM: την ίδια περίοδο η IBM παρήγαγε τους επεξεργαστές PowerPC και δυνητικά θα επωφελούταν από κάθε ζημιά στη δημοτικότητα των επεξεργαστών Pentium ή της Intel σαν εταιρεία. Παρ' όλα αυτά, η απόφαση ώθησε πολλούς επαγγελματικούς αγοραστές προσωπικών υπολογιστών να απαιτήσουν αλλαγή των υπάρχοντων επεξεργαστών Pentium και, λίγο αργότερα, άλλοι κατασκευαστές υπολογιστών άρχισαν να προσφέρουν αντικατάσταση των επηρεασμένων επεξεργαστών «χωρίς ερωτήσεις».

Η αυξανόμενη δυσαρέσκεια με την ανταπόκριση της Intel οδήγησε την εταιρεία στο να προσφέρει αντικατάσταση όλων των επηρεασμένων επεξεργαστών Pentium κατόπιν αιτήματος του χρήστη στις 20 Δεκεμβρίου. Στις 17 Ιανουαρίου 1995, η Intel ανακοίνωσε μια προ φόρων χρέωση 475 εκατομμυρίων δολλαρίων έναντι της εισροής, φαινομενικά αντιπροσωπεύοντας το συνολικό κόστος της αντικατάστασης των επηρεασμένων επεξεργαστών. Το ποσό αυτό αντιστοιχεί σε  δολλάρια το . Η Intel επικρίθηκε επειδή απαγόρευσε σε μεταπωλητές και παραγωγούς πρωτότυπου εξοπλισμού να συμμετάσχουν στο πρόγραμμα, αναγκάζοντας τους χρήστες να αντικαταστήσουν τους επεξεργαστές τους μόνοι τους. Η δικαιολογία της Intel, την οποία ανέρτησε στη σελίδα υποστήριξής της στο Διαδίκτυο, ήταν ότι οι τελικοί χρήστες θα έπρεπε να αποφασίσον αν το σφάλμα επηρέαζε την ακρίβεια των δικών τους εφαρμογών.

Ένα άρθρο του 1995 στο περιοδικό *[[Science]]* περιγράφει την αξία των προβλημάτων θεωρίας αριθμών στην ανακάλυψη σφαλμάτων υπολογιστών και παρουσιάζει το μαθηματικό υπόβαθρο και την ιστορία της σταθεράς Brun, το πρόβλημα πάνω στο οποίο δούλευε ο Νάισλι όταν ανακάλυψε το σφάλμα.

Η ανταπόκριση της Intel στο σφάλμα FDIV έχει αναφερθεί ως μια από τις περιπτώσεις στις οποίες οι δημόσιες σχέσεις είχαν σημαντικότερο αντίκτυπο από το ίδιο το πρόβλημα στους καταναλωτές. Ενώ οι πιθανότητες να συναντήσουν οι περισσότεροι χρήστες το πρόβλημα στην καθημερινότητά τους ήταν μικρές, η αρχική απόφαση της εταιρείας να μην αντικαταστήσει τους επεξεργαστές εκτός αν οι χρήστες μπορούσαν να αποδείξουν ότι είχαν επηρεαστεί προκάλεσε αντιδράσεις από ορισμένους ειδικούς του κλάδου. Η δημοσιότητα που επακολούθησε μείωσε την εμπιστοσύνη των καταναλωτών για τους επεξεργαστές τους, γεγονός που οδήγησε στο να ζητούν καλύτερη αντιμετώπιση ακόμη και χρήστες οι οποίοι πιθανώς δεν θα επηρεάζονταν από το σφάλμα. Ο Άντυ Γκρόουβ, τότε διευθύνων σύμβουλος της Intel, είπε σύμφωνα με τη *Wall Street Journal*: «Πιστεύω ότι ο πηρύνας του προβλήματος, τον οποίο δεν παρατηρήσαμε [...] ήταν ότι προσπαθήσαμε να πούμε σε κάποιον για τι πρέπει και δεν πρέπει να ανησυχεί, ή τι πρέπει και τι δεν πρέπει να κάνει».

Μετά το σφάλμα και την επακόλουθη ανάκληση, υπήρξε σημαντική άνοδος στη χρήση τυπικής επαλήθευσης στις πράξεις που χρησιμοποιούν υλικό κινητής υποδιαστολής στον κλάδο των ημιαγωγών. Λόγω της ανακάλυψης του σφάλματος, μια τεχνική που μπορεί να εφαρμοστεί και στον αλγόριθμο SRT που ονομάζεται «έλεγχος μοντέλου επιπέδου λέξης» (word-level model checking) αναπτύχθηκε το 1996. Η Intel χρησιμοποίησε σε μεγάλο βαθμό την τυπική επαλήθευση κατά την ανάπτυξη μεταγενέστερων αρχιτεκτονικών επεξεργαστών. Κατά την ανάπτυξη του Pentium 4, η συμβολική αξιολόγηση τροχιάς και η απόδειξη θεωρημάτων χρησιμοποιήθηκαν για να βρουν ορισμένα σφάλματα, τα οποία θα μπορούσαν να είχαν προκαλέσει παρόμοια περιστατικά αν δεν είχαν βρεθεί. Η πρώτη μικροαρχιτεκτονική της Intel που χρησιμοποίησε την τυπική επαλήθευση ως την κύρια μέθοδο επαλήθευσης ήταν η Nehalem, η οποία αναπτύχθηκε το 2008.

## Επηρεασμένα μοντέλα
Το σφάλμα FDIV επηρεάζει τους επεξεργαστές Pentium P5 800 60 και 66 MHz στα κλιμακωτά επίπεδα (stepping levels) πριν το D1, και τους Pentium P54C 600 75, 90, and 100 MHz στα επίπεδα πριν το B5. Οι P54C 120 MHz και οι P54CQS δεν επηρεάζονται.

## Πρόχειρες διορθώσεις λογισμικού
Πολλές πρόχειρες διορθώσεις λογισμικού (software patches) αναπτύχθηκαν από κατασκευαστές υπολογιστών για να παρακάμπτουν το σφάλμα. Ένας αλγόριθμος, ο οποίος περιγράφεται σε μια εργασία στο *IEEE Computational Science & Engineering*, ελέγχει αν ο διαιρέτης ενεργοποιεί την πρόσβαση στα κελιά του προγραμματιζόμενου λογικού πίνακα που λανθασμένα περιέχουν μηδέν και, αν αυτό ισχύει, πολλαπλασιάζει τον αριθμητή και τον παρονομαστή με 15/16. Αυτό τους απομακρύνει από την περιοχή αριθμών που προκαλούν το σφάλμα. Αυτή η διόρθωση επιδρά αρνητικά στην ταχύτητα των υπολογισμών − στη χειρότερη περίπτωση, ένα πρόγραμμα που κάνει μόνο υπολογισμούς FDIV με διαιρέτες που προκαλούν το σφάλμα θα εκτελούταν σε διπλάσιο χρόνο, αφού κάθε FDIV θα χρειάζεται περίπου 80 αντί για 40 κύκλους ρολογιού. Με πιο τυχαίους διαιρέτες, ο μέσος χρόνος εκτέλεσης ανά FDIV ήταν περίπου 50 κύκλοι, δηλαδή 10 επιπλέον κύκλοι για τον έλεγχο του διαιρέτη: Μόνο 5 στους 1024 τυχαίους διαιρέτες ενεργοποιούσαν την αναλογική διόρθωση. Καθώς ο FDIV είναι σπάνιος υπολογισμός στα περισσότερα προγράμματα, συνήθως η διαφορά στην ταχύτητα εκτέλεσης προγραμμάτων ήταν ίση ή μικρότερη από 1%.

Η μεγαλύτερη δυσκολία που αντιμετώπισαν οι εταιρείες λογισμικού ήταν η ενσωμάτωση της διόρθωσης σε ήδη υπάρχον λογισμικό, μεγάλο μέρος του οποίου βασιζόταν σε βιβλιοθήκες που δεν ήταν υπό τον έλεγχό τους. Κάποιες εταιρείες, όπως η Wolfram Research, τροποποίησαν τη γλώσσα μηχανής των υπάρχοντων εκτελέσιμων αρχείων τους για να αλλάξουν την εντολή FDIV με μια παράνομη εντολή. Αυτή η εντολή θα ενεργοποιούσε μια εξαίρεση, την οποία θα εξέταζε ένας (επίσης τροποποιημένος) χειριστής εξαιρέσεων. Από εκεί, κάποιο κομμάτι κώδικα θα εκτελούταν για να παρακάμψει το σφάλμα.

Η Microsoft προσέφερε παρακάμψεις σε επίπεδο λειτουργικού συστήματος σε εκδόσεις των Windows μέχρι τα Windows XP. Το λειτουργικό σύστημα περιελάμβανε εργαλεία που έλεγχαν αν υπάρχει το σφάλμα και απενεργοποιούσαν την μονάδα κινητής υποδιαστολής αν το έβρισκαν.

## Δείτε επίσης
*Σφάλμα F00F των επεξεργαστών Pentium
*Σφάλματα και ιδιαιτερότητες του MOS Technology 6502
*Σφάλματα ακρίβειας στην αριθμητική κινητής υποδιαστολής
*MaverickCrunch

## Παραπομπές

## Εξωτερικοί σύνδεσμοι
*Προσωπική ιστοσελίδα του Δρ. Νάισλι, ο οποίος ανακάλυψε το σφάλμα
*Μια ιστοσελίδα με ακριβείς πληροφορίες για την αιτία του σφάλματος
**Αρχείο ZIP με ακόμα περισσότερες πληροφορίες (Δείτε το λήμμα για τη μορφή αρχείου ZIP για περισσότερες πληροφορίες)
*Αρχείο της επίσημης σελίδας πληροφοριών της Intel για το σφάλμα
*Μη ανοιγμένο κουτί επεξεργαστή Intel από το πρόγραμμα αντικατάστασης επεξεργαστών με το σφάλμα FDIV

Κατηγορία:Επιστήμη υπολογιστών
Κατηγορία:Σφάλματα υλικού