Lỗi FDIV của Pentium của Intel
-
Bối cảnh: Năm 1993, Intel đã ra mắt bộ xử lý Pentium hiệu năng cao. Pentium có nhiều cải tiến, bao gồm thuật toán chia số dấu phẩy động nhanh hơn so với bộ xử lý Intel 486 trước đó. Tuy nhiên, một năm sau, giáo sư toán học Nicely khi nghiên cứu nghịch đảo của các số nguyên tố sinh đôi đã phát hiện Pentium tạo ra kết quả sai khi thực hiện phép chia số dấu phẩy động.
-
Việc phát hiện lỗi và tác động: Intel xem đây là một "vấn đề kỹ thuật rất nhỏ", nhưng lỗi này đã trở thành một sự kiện lớn trên truyền thông. Cuối cùng Intel quyết định thay thế toàn bộ các chip Pentium bị lỗi, khiến công ty tốn 475 triệu đô la.
-
Nguyên nhân của lỗi: Thuật toán chia của Pentium sử dụng một bảng tra cứu. Năm 1994, Intel công bố nguyên nhân của lỗi là do lỗi script khiến năm mục bị thiếu khỏi bảng, nhưng trên thực tế có 16 mục bị thiếu do một sai lầm toán học. Trong số đó, năm mục bị thiếu đã gây ra lỗi FDIV.
-
Tổng quan về số dấu phẩy động: Số dấu phẩy động có thể biểu diễn cả các số rất lớn lẫn rất nhỏ. Chip đồng xử lý dấu phẩy động 8087 của Intel đã góp phần vào việc phát triển tiêu chuẩn IEEE 754, và hầu hết máy tính, bao gồm cả Pentium, đã triển khai tiêu chuẩn này.
-
Phép chia SRT: Pentium sử dụng thuật toán SRT để thực hiện phép chia, nhanh gấp đôi phép chia nhị phân tiêu chuẩn. Thuật toán SRT dùng một cách tiếp cận không thông thường để giúp việc chọn chữ số thương trở nên dễ dàng hơn.
-
Cấu trúc của bảng tra cứu: Bảng tra cứu của Pentium chứa 2048 mục, và năm mục bị thiếu đã gây ra lỗi FDIV. Bảng này được triển khai bằng mảng logic khả trình (PLA).
-
Ranh giới toán học của lỗi: Bước cốt lõi của thuật toán chia là chia phần dư từng phần cho số chia để lấy chữ số thương. Nếu chọn sai giá trị q trong quá trình này, thuật toán sẽ không thể phục hồi.
-
Bộ cộng carry-save và carry-lookahead: Mạch chia của Pentium sử dụng bộ cộng carry-save để thực hiện phép cộng và phép trừ một cách hiệu quả. Bộ cộng này đóng vai trò quan trọng trong việc gây ra lỗi FDIV.
-
Cách sửa lỗi: Intel đã sửa lỗi bằng cách điền giá trị 2 vào toàn bộ các mục không sử dụng trong bảng. Điều này loại bỏ khả năng truy cập vào các mục sai và đơn giản hóa các phương trình PLA, giúp PLA nhỏ hơn.
1 bình luận
Ý kiến trên Hacker News
Tác giả cho biết sẵn sàng trả lời nếu có câu hỏi về lỗi Pentium
Trong sách trắng của Intel, hãng tuyên bố người dùng thông thường sẽ chỉ gặp sự cố một lần trong 27.000 năm, nhưng IBM phân tích rằng khách hàng có thể gặp vấn đề vài ngày một lần
Trên thực tế chỉ có một người phát hiện ra lỗi trong quá trình sử dụng
Có người chia sẻ trải nghiệm rằng vì không thể kiểm soát CPU của khách hàng, họ đã phải thêm mã đặc biệt vào thư viện để khắc phục vấn đề
Chỉ ra vấn đề trong thuật toán tạo bảng của Intel, nhấn mạnh rằng phía PR mô tả đây là lỗi nhỏ nhưng thực tế đó là vấn đề lớn hơn nhiều
Thắc mắc vì sao Intel lại điền số 2 vào toàn bộ các mục không sử dụng trong bảng