当前位置: 首页 > 科技观察

一道数学题让芯片巨头损失了5亿美元!

时间:2023-03-14 20:33:09 科技观察

1993年,CPU巨头英特尔推出奔腾处理器。新品牌成功摆脱了AMD等公司对286、386、486等数字系列的品牌“抄袭”,树立了领导者的新形象。再加上1990年代初斥巨资成功推广的IntelInside计划,英特尔成功从一家主要为电脑制造商供货的公司转型为直接面向消费者的品牌。不知道是哪位天才将Pentium翻译成了霸气十足的“奔腾”,真是让观众惊艳的神来之笔。新产品,新品牌,英特尔意气风发,一统天下。但谁也没想到,这个万众瞩目的CPU竟然藏着一个bug!bug发现的过程也颇为传奇,得从数学中的一个概念说起。早在希腊时代,欧几里得就证明了素数有无穷多个,而且数越大,素数分布越稀疏。神奇的是,虽然分布很稀疏,但只要有一个质数,就可以在附近找到另一个,比如41和43、101和103、10007和10009,它们之间相差2。数学家给这些相差2的连续素数起了一个名字:孪生素数。1919年,挪威数学家维戈布伦证明了一件有趣的事情。即使有无穷多个孪生素数,它们的倒数之和也会收敛到一个常数,称为“布朗常数”。但是让数学家头疼的是:他们不知道这个布朗常数是不是无理数。随着计算机的出现,有人想到了一个绝招:利用计算机强大的计算能力,暴力解决问题。美国林奇堡学院的数学教授托马斯·尼斯利就是其中之一,他的实验室正好配备了一台新的奔腾计算机。为了防止误判,严谨的Nicely采用了两种算法进行双重保险。如果答案不同,那一定是哪里出了问题。Nicely满怀希望地开始了计算,结果却让他大失所望:两种算法的结果真是天壤之别!经过深入研究,Nicely发现:824633702441和824633702443,两个孪生质数,它们的倒数小数点后第10位被计算错了!很好地换了一台旧的486电脑来计算,答案是正确的。他又用奔腾电脑重新计算,错误又出现了。你的程序错了吗?或者是电脑问题?Nicely开始做排除法,排除自己代码的错误,Borland编译器的错误,芯片组的错误。整整耗费了4个月的时间,他终于找到了bug的源头:奔腾CPU。1994年10月24日,Nicely致电Intel技术支持部门,告知问题。Intel说几天之内会有答复,但此后就没有消息了。原因很简单,Intel早在1994年6月就知道这个问题:浮点除法运算(FDIV)错误。FDIVforthePentiumCPU引入了一个新的、快速的实现,使用了一个2048条目的硬件查找表,但不小心,5个值设置不正确,它们应该是2,但设置为0。这个错误只会被触发在高精度计算时,普通用户很难遇到。ByteMagazine估计出错的概率为90亿分之一。由于影响不大,英特尔的选择是:隐瞒,悄悄修复,不公布任何细节。毕竟CPU已经卖了上百万,大规模召回损失太大了。不是不能用!尼斯很不高兴,因为他没有收到回音。10月30日,他开始给一些IT名人和杂志发邮件,包括ByteMagazine、PCWeek、InfoWorld、PCMagazine。这件事在网上迅速发酵,一大批有才之士展开了问题定位的接力赛:第一名选手就是前面提到的Nicely。第二位是来自挪威的TerjeMathis。他很快确认了Nicely的问题,写了一个简单的汇编测试程序,发到comp.sys.intel新闻组(是的,别说那时候的社交网络,连BBS都还没流行)第三个是AndreasKaiser来自德国的他发现了24个数的倒数在PentiumCPU中只能得到单精度的结果。第四棒是FPU(floating-point-unit)的设计专家TimCoe,他是加州Vitesse的半导体设计师。根据24个数的线索,他推测PentiumCPU采用了radix-4SRT算法,每个时钟周期可以产生两位数的商,使得速度比之前快了一倍。事实也确实如此,内部专业人士确实很厉害。第五杠出现了超级大牛,MATLAB之父:CleveMolerMoler总结了之前的资料,发现了bug的规律。可见,犯错之后,想掩盖也掩盖不了。你越想掩盖,这个世界上就会有越多的人想方设法揭穿你。但到目前为止,IntelPentium的硬件BUG还是主要徘徊在技术圈,破圈还需等待关键时刻。1994年11月24日,JPL(喷气推进实验室,钱学森是重要创始人)的两名工程师得知了这个bug,建议实验室停止采购奔腾电脑。CNN记者SteveYoung听说了JPL,凭着敏锐的嗅觉,他立即联系了Moler进行采访。JPL和莫勒接受采访的消息当晚在电视上播出,纽约时报和波士顿环球报也进行了重磅报道。文章铺天盖地。本来很难出现的PentiumCPUbug,一下子成了大街小巷的热门话题。迫于媒体的压力,英特尔终于承认了浮点计算的漏洞,但依旧固执己见。它声称它并不严重,并且只会为那些能够证明自己受到影响的用户更换CPU。这种想蒙混过关的态度引起了公愤,也动摇了消费者对英特尔CPU的信心。其他制造商纷纷效仿,IBM暂停销售配备英特尔CPU的个人电脑,导致英特尔股价大幅下跌。1994年12月,无人支持的英特尔终于宣布:召回所有有缺陷的处理器。这也是历史上第一次全线召回电脑芯片。英特尔为此付出的代价是:4.75亿美元,名誉损失更是无法估量。故事并没有在这里结束。按理说是硬件有问题,无法修改,只能更换。但是别忘了我们刚刚提到的那群天才,MATLAB之父CleveMoler,来自阿贡国家实验室的TimCoe,PeterTang,还有来自Intel的几位工程师,他们一起合作,在12月5日开发了一个非常聪明的软件修复方法。这里就不细说了,大致就是:在特定情况下,将被除数和除数都乘以15/16,进入安全状态。该修复程序已发布到新闻组并免费提供给所有人。精明的CleveMoler让公司发布了一个可以检测和纠正除法错误的MATLAB版本,并立即发出了新闻稿《MathWorks修复了Intel奔腾浮点数Bug》。就在奔腾Bug闹得沸沸扬扬、举国皆知的时候,新闻稿出现在了美国各大媒体的传真机上。CleveMoler成功实施了一次完美的营销。这一年,他的公司MathWorks只是一家员工不到250人的小公司,从此走上了快车道,成为了这个领域的巨头。参考https://dl.acm.org/doi/pdf/10.1145/3386331《A History of MATLAB》https://buzzorange.com/techorange/2019/11/08/intel-pentium-bug/https://faculty。lynchburg.edu/~nicely/pentbug/pentbug.htmlhttps://en.wikipedia.org/wiki/Pentiumhttps://en.wikipedia.org/wiki/Pentium_FDIV_bughttps://en.wikipedia.org/wiki/Intel#Intel_Inside