VietTechiesHIỂU CÔNG NGHỆ. MỞ GÓC NHÌN.
☰ Chuyên mục

Giáo sư toán bắt quả tang Pentium chia sai. Năm ô trống trong bảng tra dẫn tới khoản chi phí 475 triệu USD.

13/10/2026 · VietTechies · Biên tập

Bộ xử lý Intel Pentium đời đầu có nắp màu vàng kim, mang ký hiệu A80501-66 và SX837, đặt trên nền lưới kỹ thuật màu xanh lam, cạnh một bảng ô xếp bậc thang, trong đó năm ô được viền màu cam và để trống.


Tháng 10 năm 1994, Thomas Nicely, giáo sư toán của trường Lynchburg College ở bang Virginia, xác nhận rằng bộ xử lý Pentium của Intel đôi khi chia sai. Lỗi này được gọi là lỗi FDIV, theo tên lệnh chia dấu phẩy động (floating-point divide) của con chip, và trong vòng ba tháng đã khiến Intel phải ghi nhận một khoản chi phí 475 triệu USD.

Tài liệu Nicely viết về lỗi này nêu ra trường hợp sai nặng nhất, do Tim Coe tìm ra đầu tiên: lấy 4.195.835 chia cho 3.145.727. Kết quả đúng bắt đầu bằng 1,333820, còn một chiếc Pentium mắc lỗi thì trả về 1,333739.

Đến giữa năm 1994, Intel đã tự phát hiện ra lỗi này. Còn phần lớn chủ máy Pentium thì biết đến lỗi nhờ một nhà toán học không sao làm cho các con số của mình khớp nhau.

Diễn biến: từ một kết quả đếm số nguyên tố sai đến khoản chi phí 475 triệu USD

Ngày 13 tháng 6 năm 1994. Kết quả Nicely đếm số nguyên tố tới 20 nghìn tỷ không khớp với giá trị đã được công bố. Trong những tháng sau đó, khi lục tìm trong khoảng 3.000 dòng code của mình, ông phát hiện Borland C++, trình biên dịch (compiler) ông đang dùng, sinh ra mã sai khi bật một số chế độ tối ưu hóa. “Có một thời gian, tôi tin rằng đây là nguồn cơn những rắc rối của mình,” về sau ông viết.

Ngày 4 tháng 10. Sau khi sửa code, ông gặp một chỗ lệch mới: khi tính tổng nghịch đảo của các số nguyên tố sinh đôi, chiếc Pentium-60 của ông và một chiếc 486DX-33, bộ xử lý đời cũ hơn của Intel, cho ra kết quả chênh nhau nhiều hơn hẳn mức mà sai số làm tròn có thể giải thích. Dùng tìm kiếm nhị phân, ông khoanh vùng vấn đề về đúng một cặp số nguyên tố sinh đôi: 824.633.702.441 và 824.633.702.443.

Từ ngày 17 đến 22 tháng 10. Ông tái hiện được lỗi trên một chiếc Pentium thứ hai dùng bo mạch chủ khác, cũng như trong một chương trình Power Basic và một bảng tính Quattro Pro. Khi tắt khối tính toán dấu phẩy động (FPU), lỗi biến mất. Ngày 22 tháng 10, chiếc Pentium thứ ba, một máy Packard-Bell đang trưng bày tại một cửa hàng Staples, cũng mắc đúng lỗi này. “Lúc này tôi đã chắc chắn rằng lỗi nằm ở FPU của chip Pentium,” ông viết.

Từ ngày 24 đến 30 tháng 10. Ông báo sự cố cho bộ phận hỗ trợ kỹ thuật của Intel. Đến ngày 30 tháng 10, ông vẫn chỉ có một lời xác nhận không chính thức rằng Intel đã tái hiện được lỗi trên một chiếc Pentium 66 MHz, nên ông gửi email cho những người và tổ chức có thể tiếp cận các hệ thống Pentium khác, nhờ họ kiểm tra.

Ngày 2 tháng 11. Một quản lý chương trình của Intel gọi điện cho Nicely. Người này cho biết phân tích của ông về cơ bản là đúng, Intel đã tự nhận ra vấn đề từ trước qua kiểm thử nội bộ, và đã có chip sửa lỗi ở dạng hàng mẫu.

Ngày 7 tháng 11. Tờ Electronic Engineering Times đưa tin về lỗi này. Khoảng hai tuần sau, CNN mang câu chuyện đến với đông đảo công chúng.

Ngày 30 tháng 11. Intel công bố một sách trắng, trong đó ước tính một người dùng bảng tính điển hình phải 27.000 năm mới gặp lỗi này một lần.

Ngày 12 tháng 12. IBM ngừng giao các máy tính của hãng có dùng chip Pentium và ước tính một người dùng bảng tính có thể gặp lỗi thường xuyên tới mức cứ 24 ngày một lần. Cổ phiếu Intel giảm 4,25 USD, xuống còn 58,50 USD, trước khi bị tạm ngừng giao dịch vào giữa trưa.

Ngày 20 tháng 12. Intel tuyên bố sẽ thay bộ xử lý cho bất kỳ chủ máy nào có yêu cầu. Giám đốc điều hành Andy Grove xin lỗi về chính sách cũ, vốn xem xét từng trường hợp một: “Với một số người, chính sách này có vẻ ngạo mạn và thờ ơ.”

Ngày 17 tháng 1 năm 1995. Intel công bố khoản chi phí một lần, trước thuế, trị giá 475 triệu USD.

Nguyên nhân gốc: năm ô trong bảng tra cho ra số 0

Bộ xử lý 486 đời cũ của Intel tính ra một bit của thương sau mỗi bước. FPU của Pentium dùng một phương pháp nhanh hơn, mỗi bước cho ra hai bit: phép chia SRT, đặt theo tên Sweeney, Robertson và Tocher, ba người đã độc lập nghĩ ra phương pháp này trong hai năm 1957 và 1958. Ở mỗi bước, bộ chia tra trong một bảng để lấy chữ số tiếp theo của thương; chữ số này nhận giá trị từ −2 đến +2.

Theo tạp chí BYTE năm 1995, bảng này có 2.048 ô, trong đó 1.066 ô được dành để chứa giá trị. Năm ô nằm dọc theo một đường biên lẽ ra phải chứa giá trị +2. Trên những con chip lỗi, năm ô này lại để trống, nên khi tra tới đó, bộ chia lấy ra số 0, và thương tính ra bị sai lệch một chút.

Sách trắng của Intel quy lỗi cho một sai sót trong script dùng để nạp bảng vào mảng logic lập trình được (PLA), tức mạch chứa bảng này. BYTE viết thêm rằng “không ai kiểm tra PLA để xác nhận bảng đã được chép đúng”. Năm 2024, nhà nghiên cứu chip Ken Shirriff phân tích ảnh chụp mảnh silicon (die) của Pentium và mô tả một nguyên nhân khác: 16 mục trong bảng bị bỏ sót “do một sai lầm toán học trong định nghĩa bảng tra”, và năm mục trong số đó gây ra bug. Dù theo cách giải thích nào, phần cứng cũng đã làm đúng y những gì bảng tra bảo nó làm.

Vì sao kiểm thử phát hiện lỗi muộn, và vì sao Intel coi đó là lỗi nhỏ

Lỗi này khó gặp, vì chỉ những cặp số nhất định mới làm nó lộ ra. Theo BYTE, chỗ sai thường nằm quanh chữ số thập phân thứ chín hoặc thứ mười, và với toán hạng ngẫu nhiên, xác suất gặp lỗi vào khoảng 1 trên 9 tỷ. Năm 1995, William Kahan, giáo sư Đại học Berkeley, nhận xét rằng năm mục sai ấy đã không bị phát hiện “cho đến khi quá muộn, dù đã kiểm thử hàng tỷ phép chia”. Chương trình SRTEST của ông, được viết ra để phát hiện những lỗi kiểu này sớm hơn nhiều so với kiểm thử ngẫu nhiên, đã tìm ra lỗi FDIV ở phép chia thử thứ 356.

Về sau, The Wall Street Journal đưa tin rằng Intel từng đánh giá rủi ro từ lỗi này quá nhỏ, không đáng để công bố. Trong thông báo ngày 20 tháng 12 của Intel, Grove cho biết chính sách của công ty cho tới lúc đó là “trao đổi với người dùng để xác định xem nhu cầu của họ có đòi hỏi phải thay bộ xử lý hay không”. Ông giải thích: “Chúng tôi làm vậy vì tin rằng với phần lớn mọi người, việc thay thế đơn giản là không cần thiết.” Chính Nicely cũng đánh giá mức ảnh hưởng của lỗi gần với ước tính của Intel hơn là của IBM.

Hai ước tính được công bố vênh nhau vì chúng dựa trên những giả định khác nhau. Con số 27.000 năm của Intel được tính với giả định mỗi ngày có 1.000 phép chia trên các số ngẫu nhiên; IBM thì giả định khoảng 4,2 triệu phép chia mỗi ngày, trong đó có những con số được dùng nhiều hơn những số khác. Về cách tiếp cận dựa trên số ngẫu nhiên, Kahan nhận định: “hầu như chẳng ai tính thương của những số ngẫu nhiên không tương quan với nhau”.

Cái giá phải trả

Intel cho biết khoản chi phí trước thuế 475 triệu USD bao gồm “chi phí thay thế, vật tư thay thế và việc ghi giảm giá trị số bộ xử lý Pentium phiên bản trước mà công ty còn tồn kho”, và khoản này khiến lợi nhuận năm 1994 giảm 0,70 USD trên mỗi cổ phiếu.

Vụ việc thường được kể lại như một đợt thu hồi toàn bộ, nhưng Intel chỉ thay chip cho những chủ máy có yêu cầu. Tháng 4 năm 1995, The Wall Street Journal dẫn các ước tính cho rằng tỷ lệ chip được gửi trả tính chung là dưới 10%, tức khoảng nửa triệu chip, trên tổng số ước tính 5,5 triệu máy tính Pentium bị lỗi.

Những cách lẽ ra đã bắt được lỗi

  • Kiểm tra chính bảng tra, từng ô một. Dù nguyên nhân nằm ở script nạp bảng hay ở định nghĩa bảng tra, nếu đối chiếu mọi ô mà bộ chia có thể tra tới với giá trị đúng theo toán học thì đã tìm ra những chỗ trống.
  • Kiểm thử đúng những chỗ phần cứng có thể sai, thay vì thử ngẫu nhiên. SRTEST của Kahan, được thiết kế sớm hơn Pentium một thập kỷ, đã tìm ra lỗi gần như ngay lập tức.
  • Tính các kết quả quan trọng theo hai cách. Nicely bắt được bug vì ông so sánh kết quả trên hai bộ xử lý khác nhau và sinh nghi trước một chênh lệch mà việc làm tròn số không giải thích được.
  • Ước tính rủi ro theo khối lượng tính toán thực tế, và báo sớm cho người dùng. Chủ máy Pentium biết về lỗi qua một nhà toán học, nhiều tháng sau khi Intel đã biết.

Lỗi đã biết, người dùng nên nghe từ chính bạn trước

Năm ô trong bảng tra là một khiếm khuyết nằm trong silicon. Phần còn lại của câu chuyện xoay quanh niềm tin: ai biết trước, ai báo cho ai, và nên tin ước tính của bên nào. Với mỗi lỗi đã biết trong hệ thống của chính bạn, hãy tự hỏi: người dùng sẽ nghe về lỗi ấy từ bạn trước, hay từ một người như Thomas Nicely?

Bài liên quan

Đọc bằng ngôn ngữ khác: English

Nguồn