1993年,CPU 巨頭Intel推出了Pentium處理器。
新的品牌順利地擺脫了AMD等公司對286,386,486等數(shù)字系列的品牌“抄襲”,樹立了全新的領(lǐng)先者的形象。
再加上90年代初斥巨資成功推進的Intel Inside計劃, Intel 成功地從一家主要向電腦制造商供貨的公司,轉(zhuǎn)變成一家直接面向消費者的品牌。
不知道哪位天才把Pentium翻譯成霸氣的“奔騰”,真是驚艷全場的神來之筆。
新產(chǎn)品,新品牌,Intel 可謂意氣風(fēng)發(fā),準(zhǔn)備一統(tǒng)天下。
但誰也沒想到的是,這個被寄予厚望的CPU內(nèi)部居然隱藏著一個Bug!
1
Bug被發(fā)現(xiàn)的過程也頗為傳奇,我們得從數(shù)學(xué)上的一個概念說起。
早在希臘時代,歐幾里得就已經(jīng)證明質(zhì)數(shù)有無窮多個,并且數(shù)字越大,質(zhì)數(shù)分布得越稀疏。
神奇的是,盡管分布得很稀疏,但只要出現(xiàn)一個質(zhì)數(shù),就可以在附近找到另外一個, 例如41 和 43、101 和 103、10007 和 10009,他們之間相差都是2。
數(shù)學(xué)家給這些相差為2的連續(xù)質(zhì)數(shù)起了一個名稱:孿生質(zhì)數(shù)。
1919年,挪威數(shù)學(xué)家 Viggo Brun證明了一件有趣的事情,就算有無窮多的孿生質(zhì)數(shù),它們倒數(shù)的和會收斂于一個常數(shù),這個常數(shù)被稱為“布朗常數(shù)”。
但是讓數(shù)學(xué)家頭疼的是:他們不知道這個布朗常數(shù)是不是無理數(shù)。
隨著計算機的出現(xiàn),有些人就想到一個招數(shù):用計算機強大的算力,暴力求解。
美國 Lynchburg College 的數(shù)學(xué)教授Thomas Nicely就是其中的一員,他的實驗室恰巧裝備了新的奔騰計算機。
嚴謹?shù)腘icely為了防止算錯,用了兩種算法做雙保險,如果答案不同,肯定是某個地方出了問題。
Nicely滿懷希望地開始了計算,可是結(jié)果讓他失望:兩種算法的結(jié)果真的不一樣!
深入研究以后,Nicely發(fā)現(xiàn):824 633 702 441和824 633 702 443這兩個孿生質(zhì)數(shù),它們的倒數(shù)的小數(shù)點后的第10位被算錯了!
Nicely換了一臺老舊的486電腦來計算,答案算對了。
他再用奔騰電腦來重新計算,錯誤重現(xiàn)。
到底是自己的程序?qū)戝e了?還是電腦的問題?
Nicely開始做排除法,排除自己代碼的錯誤,Borland編譯器的錯誤,芯片組的錯誤,花了整整4個月的時間,終于找到了Bug的起源地:奔騰CPU。
2
1994年10月24號,Nicely打電話給Intel的技術(shù)支持部門,告知他們這個問題,Intel說幾天內(nèi)就會有回復(fù),但是從此杳無音信。
原因很簡單,Intel早在1994年6月就知道了這個問題:浮點除法運算(FDIV)出錯。
奔騰CPU的FDIV引入了一種全新的、快速的實現(xiàn)方法,使用了一個2048項的硬件查找表,但是由于意外,有5個值沒有被正確地設(shè)置,他們本應(yīng)該是2,但是卻設(shè)置成了0。
這個Bug只有在高精度計算的時候才會被觸發(fā),普通用戶很難碰到,Byte雜志估計,出錯的概率是90億分之一。
既然影響不大,Intel的選擇是:隱瞞,悄悄修復(fù),不公布任何細節(jié)。
畢竟已經(jīng)售出幾百萬片CPU了,大規(guī)模召回損失太大。
又不是不能用!
3
收不到回音的Nicely很不爽,10月30號,他開始給一些IT著名人士和雜志發(fā)郵件,包括Byte雜志,PC Week,InfoWorld,PC Magazine。
這件事情很快在網(wǎng)絡(luò)上發(fā)酵,一大批牛人開始了問題定位的接力賽:
第一棒選手是上面提到的Nicely。
第二棒則是挪威的Terje Mathis,他很快確認了Nicely的問題,并且寫了一個簡單的匯編測試程序,發(fā)到了comp.sys.intel新聞組中(沒錯,那時候別說社交網(wǎng)絡(luò)了,就連BBS還不流行)
第三棒是德國的Andreas Kaiser ,他找到了24個數(shù)字,它們的倒數(shù)在奔騰CPU只能得到單精度的結(jié)果。
第四棒是一位設(shè)計FPU(floating-point-unit)的專業(yè)人士,加州Vitesse半導(dǎo)體設(shè)計師Tim Coe。
他根據(jù)24個數(shù)字的線索,推測出奔騰CPU采用了基數(shù)為 4 的 SRT 算法,每個時鐘周期可以生成兩位的商,使得速度比原來快兩倍。
事實也確實如此,內(nèi)部專業(yè)人士的確厲害。
到了第五棒,一個超級大牛出現(xiàn)了,MATLAB之父:Cleve Moler
Moler總結(jié)了之前的數(shù)據(jù),找到了Bug的規(guī)律。
可見犯了錯誤以后,想捂是捂不住的,你越想捂,這世界上越有人要把你扒個底朝天。
但是到目前為止,Intel奔騰這個硬件Bug還主要在科技圈中轉(zhuǎn)悠,破圈還需要等待一個重要時刻。
4
1994年11月24號,JPL(噴氣推進實驗室,錢學(xué)森是重要創(chuàng)始人)有兩名工程師得知了這個Bug,建議實驗室停購奔騰電腦。
CNN的記者史蒂夫·楊聽說了JPL的事情,嗅覺靈敏的他立刻聯(lián)系Moler,進行采訪,當(dāng)天晚上JPL的新聞和Moler的采訪就在電視臺播放,紐約時報、波士頓環(huán)球報等大肆報道,文章鋪天蓋地而來。
奔騰CPU這個本來很難出現(xiàn)的Bug一下子成為街頭巷尾的熱議話題。
在媒體的重壓之下,Intel終于承認了浮點計算的漏洞,但依然嘴硬,它聲稱并不嚴重,并且只給那些能證明自己受到影響的用戶更換CPU。
這種想蒙混過關(guān)的處理態(tài)度引發(fā)眾怒,動搖了消費者對Intel CPU的信心。
其他廠商也順時而動,IBM暫停銷售裝有Intel CPU的個人電腦,導(dǎo)致Intel股票大幅下跌。
1994年12月,撐不住的Intel終于宣布:召回所有有缺陷的處理器。
這也是歷史上第一次全面召回計算機芯片。
Intel為此付出的代價是:4.75億美元,名譽的損失更是難以估量。
5
故事到此并沒有結(jié)束。
照理說硬件出了問題,無法修改,只能替換。
但是不要忘了我們剛提到的那一群天才,MATLAB之父Cleve Moler ,Tim Coe,阿貢國家實驗室的 Peter Tang 以及來英特爾的幾位工程師,他們通力合作,在12月5號居然開發(fā)出了一個非常巧妙的軟件修復(fù)辦法。
細節(jié)這里就不贅述了,大概是:在特定情況下,將被除數(shù)和除數(shù)都乘以15/16,就可以進入安全狀態(tài)。
這個修復(fù)辦法被發(fā)到新聞組中,讓所有人免費使用。
精明的Cleve Moler讓公司發(fā)布了一個可以檢測和糾正除法錯誤的MATLAB版本,并且立刻發(fā)了一個新聞稿《MathWorks修復(fù)了Intel奔騰浮點數(shù)Bug》。
就在奔騰的Bug鬧得沸沸揚揚,全國知的時候,新聞稿出現(xiàn)在了美國各大媒體的傳真機上。
Cleve Moler成功地實施了一次完美營銷,這一年,他的公司MathWorks只是一家不到250人的小公司,隨后便走上了快車道,成為這一領(lǐng)域的巨頭。