บั๊ก Pentium FDIV ของ Intel
-
ภูมิหลัง: ในปี 1993 Intel ได้เปิดตัวโปรเซสเซอร์ Pentium ประสิทธิภาพสูง Pentium มีการปรับปรุงหลายอย่าง รวมถึงอัลกอริทึมการหารเลขทศนิยมลอยตัวที่เร็วกว่าโปรเซสเซอร์ Intel 486 รุ่นก่อนหน้า อย่างไรก็ตาม หนึ่งปีต่อมา ศาสตราจารย์คณิตศาสตร์ Nicely ได้ค้นพบว่าระหว่างการศึกษาส่วนกลับของจำนวนเฉพาะคู่แฝด Pentium สร้างผลลัพธ์ที่ผิดพลาดเมื่อทำการหารเลขทศนิยมลอยตัว
-
การค้นพบบั๊กและผลกระทบ: Intel มองปัญหานี้ว่าเป็น "ปัญหาทางเทคนิคเล็กน้อยมาก" แต่บั๊กนี้กลับกลายเป็นประเด็นใหญ่ในสื่อ ในที่สุด Intel ตัดสินใจเปลี่ยนชิป Pentium ที่มีข้อบกพร่องทั้งหมด ซึ่งทำให้บริษัทมีค่าใช้จ่าย 475 ล้านดอลลาร์
-
สาเหตุของบั๊ก: อัลกอริทึมการหารของ Pentium ใช้ตารางค้นหา Intel ประกาศในปี 1994 ว่าสาเหตุของบั๊กมาจากข้อผิดพลาดในสคริปต์ที่ทำให้รายการในตารางหายไปห้ารายการ แต่ในความเป็นจริงมีรายการที่หายไป 16 รายการเนื่องจากความผิดพลาดทางคณิตศาสตร์ และในบรรดารายการที่หายไปนั้น มี 5 รายการที่ทำให้เกิดบั๊ก FDIV
-
ภาพรวมของเลขทศนิยมลอยตัว: เลขทศนิยมลอยตัวสามารถใช้แทนทั้งตัวเลขที่ใหญ่มากและเล็กมากได้ ชิปตัวประมวลผลร่วมเลขทศนิยมลอยตัว 8087 ของ Intel มีส่วนช่วยในการพัฒนามาตรฐาน IEEE 754 และคอมพิวเตอร์ส่วนใหญ่รวมถึง Pentium ก็ได้นำมาตรฐานนี้ไปใช้
-
การหารแบบ SRT: Pentium ใช้อัลกอริทึม SRT ในการหาร ซึ่งเร็วเป็นสองเท่าเมื่อเทียบกับการหารแบบไบนารีมาตรฐาน อัลกอริทึม SRT ใช้วิธีที่ไม่ปกติเพื่อทำให้การเลือกหลักของผลหารทำได้ง่ายขึ้น
-
โครงสร้างของตารางค้นหา: ตารางค้นหาของ Pentium มี 2048 รายการ และมี 5 รายการที่หายไปซึ่งก่อให้เกิดบั๊ก FDIV ตารางนี้ถูกนำไปใช้งานด้วย programmable logic array (PLA)
-
ขอบเขตทางคณิตศาสตร์ของบั๊ก: ขั้นตอนสำคัญของอัลกอริทึมการหารคือการนำเศษย่อยไปหารด้วยตัวหารเพื่อให้ได้หลักของผลหาร หากมีการเลือกค่า q ที่ผิดในกระบวนการนี้ อัลกอริทึมจะไม่สามารถกู้คืนได้
-
ตัวบวกแบบ carry-save และ carry-lookahead: วงจรการหารของ Pentium ใช้ตัวบวกแบบ carry-save เพื่อให้การบวกและการลบมีประสิทธิภาพ ตัวบวกนี้มีบทบาทสำคัญต่อการเกิดบั๊ก FDIV
-
การแก้ไขบั๊ก: Intel แก้บั๊กโดยเติมค่า 2 ลงในทุกรายการที่ไม่ได้ใช้งานของตาราง วิธีนี้ช่วยตัดความเป็นไปได้ในการเข้าถึงรายการที่ไม่ถูกต้อง และยังทำให้สมการ PLA เรียบง่ายขึ้น ส่งผลให้ PLA มีขนาดเล็กลง
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผู้เขียนพร้อมตอบคำถามเกี่ยวกับบั๊ก Pentium
ในเอกสารไวท์เปเปอร์ของ Intel อ้างว่าผู้ใช้ทั่วไปจะเจอปัญหานี้เพียงครั้งเดียวในรอบ 27,000 ปี แต่ IBM วิเคราะห์ว่าลูกค้าอาจเจอปัญหาทุก ๆ ไม่กี่วัน
มีเพียงคนเดียวเท่านั้นที่ค้นพบบั๊กนี้ระหว่างการใช้งานจริง
มีการแชร์ประสบการณ์ว่าต้องเพิ่มโค้ดพิเศษเข้าไปในไลบรารีเพื่อแก้ปัญหา เพราะไม่สามารถควบคุม CPU ของลูกค้าได้
ชี้ให้เห็นปัญหาในอัลกอริทึมการสร้างตารางของ Intel พร้อมเน้นว่าในงาน PR อธิบายว่าเป็นปัญหาเล็กน้อย แต่จริง ๆ แล้วเป็นปัญหาที่ใหญ่กว่านั้น
สงสัยว่าเหตุใด Intel จึงเติมค่า 2 ลงในช่องที่ไม่ได้ใช้งานทั้งหมดของตาราง