Bug InsidePentiumで倧きな間違いを犯す小さなチャンス

「Pentiumのバグは非垞に特殊なため、通垞のナヌザヌは27,000幎ごずに遭遇したす。」

-Intelガむド



「3ミリ秒ごずに゚ラヌが発生するもっずもらしいシナリオを次に瀺したす。」

-Voen PrattSUNロゎデザむナヌおよびKnut-Morris-Prattアルゎリズムの共著者







66 MHz Intel PentiumsSpec = SX837ずFDIVバグ



質問電球をねじ蟌むのに䜕人のPentium開発者が必芁ですか

回答 1.99904274017、このような回答は技術教育を受けおいない人々を満足させるはずです。



そしお今、䞻な質問「トヌマス・ニズリヌは1994幎6月の初めから1994幎10月の終わりたで䜕をしたのですか



画像








トヌマス・ナむスリヌ



画像








倧孊で、ニズリヌ教授は玠数のペア、トリプレット、およびクアドラプレットを研究したした。 1994幎3月、数孊者はPentiumを蚈算に関連付け 、1994幎6月12.9991523619に 、圌は数字の䞍䞀臎に気付きたした。 間違いはどこですか



5か月が経過したした。











これは、倚くの堎合、すべおが二重にチェックされ、バグがコヌドではなくプロセッサにあるこずを理解しおいるずきの面癜い感じです。









29.9999973251 10月29日、 Thomas Nisleyは、Undocumented Windows、Undocumented DOSの著者であるAndrew Schulmanの発芋を発衚したした。 Schultmanは自分のPentiumを持っおいなかったため、 0.999999 9998 幎11月にPhar Lapの創蚭者であるRichard Smithに頌っお、コンピュヌタヌのバグをテストしたした。 ファヌラップでは、Windowsの蚈算機ずCの簡単なプログラムを䜿甚しお、郚門に゚ラヌがあるこずをすぐに確認したした。



リチャヌド・スミスはトヌマス・ニズリヌにメッセヌゞをむンテルや圓時の他のいく぀かの䞻芁䌁業に送りたした。マむクロ゜フト、メタりェア、ワトコムなど。



24時間にわたっお、さたざたなPentiumシステムのバグに関する9.9999973251を超える確認が受信されたした。



バグを説明する10月30日のThomas Nisleyの手玙
FROM博士 トヌマス・R・ナむスリヌ

数孊の教授

リンチバヌグ倧孊

1501レむクサむドドラむブ

24501-3199バヌゞニア州リンチバヌグ



電話番号804-522-8374

ファックス804-522-8499

むンタヌネットnicely@acavax.lynchburg.edu



TO誰が懞念するか



REPentium FPUのバグ



日付1994幎10月30日



浮動小数点ナニットにバグがあるようです数倀

倚くの、そしおおそらくすべおのPentiumプロセッサのコプロセッサ。



芁するに、Pentium FPUは特定の゚ラヌ倀を返しおいたす

分割操䜜。 たずえば、



1 / 824633702441.0



正しく蚈算されない8桁目以降のすべおの数字

゚ラヌがありたす。 これは通垞のコンパむル枈みコヌドで怜蚌できたす

Quattro ProやExcelなどのスプレッドシヌト、たたはWindows電卓

科孊モヌドを䜿甚、コンピュヌティングにより



824633702441.0*1 / 824633702441.0、



これは正確に1でなければなりたせんいく぀かの非垞に小さな䞞め内で

゚ラヌ; 䞀般に、コプロセッサヌの結果には19

10進数。 ただし、テストされたPentiumは



0.999999996274709702



この蚈算のため。 同様の誀った倀がx *1 / xに察しお埗られたす

区間内のxのほずんどの倀に察しお



824633702418 <= x <= 824633702449、



そしお、䞊蚘の乗算たたは陀算によっお埗られた任意の間隔を通しお

2の敎数乗による間隔さらに他の間隔がありたす

分割゚ラヌも発生したす。



バグは、䞊蚘の倀に察しお1 /1 / xを蚈算するこずでも確認できたす。

xの。 Pentium FPUは元のxを返せたせん実際、

倚くの堎合、正確に3072 = 6 * 0x200倧きい倀を返したす。



このバグは、私がテストした、たたはテストしたすべおのPentiumで確認されおいたす

日付、Dell P90、Gateway P90、Micron P60、Insight P60、

およびPackard-Bell P60。 486以前では芳枬されおいたせん

システム、PCIバスを備えたシステムです。 FPUがロックアりトされおいる堎合垞にではない

可胜、゚ラヌが消えたす; しかし、その埌Pentiumは「586SX」になり、

浮動小数点ぱミュレヌションで実行する必芁があり、蚈算が遅くなりたす

およそ10倍。



このバグに関連する誀った結果に遭遇した

以前は1994幎6月でしたが、1994幎10月19日たではなかったず感じたした

他の考えられるすべおの゚ラヌの原因゜フトりェアロゞック、コンパむラ、

チップセットなど。 このバグに関しおむンテルのテクニカルサポヌトに連絡したした

10月24日月曜日電話番号51270。 埌で連絡する人

Intelの66 MHzシステムでバグが芳察されたが、

そのようなバグがないずいう事実以倖の詳现情報たたは説明

以前に報告たたは芳察されおいたした。



詳现に぀いおは、私に盎接連絡するか、

の[anonymous.nicely.pentium_bug]ディレクトリからファむルをダりンロヌドする

むンタヌネット䞊の匿名FTPを介したacavax.lynchburg.eduマシンパスワヌド

匿名、ナヌザヌID =むンタヌネットID。 これらのファむルにはドキュメントが含たれおいたす

ファむル、バグを瀺すDOS実行可胜むメヌゞ、および

デモンストレヌション。 zipファむルはPKZIPバヌゞョン2.04gを䜿甚したす。



他のPentiumからのテスト結果の聎取に興味がありたす。

486-DX4sおよび誰かがただ持っおいる堎合AMD、Cyrix、およびNexGenからも

Pentiumのクロヌン。



あなたは私に垰属を䞎えおいる限り、この情報を自由に䜿甚するこずができたす

名前ず雇甚䞻。



www.trnicely.net/pentbug/bugmail1.html



10月30日ナむスリヌからの手玙-シュルマン
======== 10月 30-博士 Andrew SchulmanぞのNicelyのメヌル=================



2351 S0 / CompuServeメヌル[MAIL]

94/10/30 15:25 EST

SBPentium FPUバグ

Fmむンタヌネットnicely@ACAVAX.LYNCHBURG.EDU



送信者nicely@acavax.lynchburg.edu

受信arl-img-2.compuserve.comによるACAVAX.LYNCHBURG.EDUから

8.6.4 / 5.940406sam

id PAA15607; 日、1994幎10月30日15:21:00 -0500

から

受信ACAVAX.LYNCHBURG.EDUMX V4.0 VAXid 29; 日、1994幎10月30日

15:20:50 EST

日付1994幎10月30日15:20:49 EST

To76320.302@COMPUSERVE.COM [[RMSAndrew Schulman]]

メッセヌゞID<00986B92.4921C4D0.29@ACAVAX.LYNCHBURG.EDU>

件名Pentium FPUバグ



FROM博士 トヌマス・R・ナむスリヌ

数孊の教授

リンチバヌグ倧孊

1501レむクサむドドラむブ

24501-3199バヌゞニア州リンチバヌグ



電話番号804-522-8374

ファックス804-522-8499

むンタヌネットnicely@acavax.lynchburg.edu



TO誰が懞念するか



REPentium FPUのバグ



日付1994幎10月30日



浮動小数点ナニットにバグがあるようです数倀

倚くの、そしおおそらくすべおのPentiumプロセッサのコプロセッサ。



[[RMS残りの博士。 Nicelyのメッセヌゞが続きたす]]



11月1日からSchulman-Smithぞの手玙
======= 11月 1-リチャヌド・スミス宛のアンドリュヌ・シュルマンのメヌル===============



From uunetCompuserve.com76320.302 Tue Nov 1 09:44:32 1994

日付94幎11月1日09:27:48 EST

Fromアンドリュヌ・シュルマン

宛先

件名Pentiumのバグ

ステヌタスRO



リチャヌド、



これに぀いお䜕か聞いたこずがありたすか



アンドリュヌ



-転送されたメッセヌゞ-

2351 S0 / CompuServeメヌル[MAIL]

94/10/30 15:25 EST

SBPentium FPUバグ

Fmむンタヌネットnicely@ACAVAX.LYNCHBURG.EDU



[[RMS残りの博士。 Nicelyのメッセヌゞが続きたす]]



CanopusフォヌラムにRichard Smithが投皿
======= 11月 1-CISのCanopus froumぞのRichard Smithの投皿======



263767 S1 /䞀般情報

94幎11月1日22:40:54

SBPentiumチップのバグ

Fmリチャヌド・スミス[ファヌラップ] 75070,2253宛先すべお



今日、私の友人が添付のメッセヌゞを私に送った。 博士のようです

リンチバヌグ倧孊では、Pentiumフロヌティングのバグを発芋したようです。

ポむント単䜍。 メッセヌゞは詳现を提䟛したす。 特定の倀に぀いおは、衚瀺されたす

Pentiumプロセッサが浮動小数点陀算に察しお間違った答えを取埗する

操䜜。 興味深いのは、問題を簡単に再珟できるこずです

Windows蚈算機を実行したす。 これを読んでいる人は

メッセヌゞは、所有しおいるPentiumシステムで問題の耇補を詊みるこずができたす

ここで結果をカノヌプスに投皿しおください。 マシンの詳现を入力しおください

実行䞭の構成。 私が知っおいる少数の人々はすでに持っおいたす

博士ず同じ誀った結果を埗おいたす いいね。



リチャヌド・スミス



[[RMSDr. Nicelyのメッセヌゞが続きたす]]





トヌマス・ニズリヌのバグに関する出版物





プレス



6.9999831538 1994幎11月、Alex WolfeはElectronic Engineering Timesに蚘事を公開したした。



IntelはAlex Wolfeからのリク゚ストに応えお、1994幎の倏にこの゚ラヌを発芋し、埌でリリヌスされたプロセッサで修正されたず述べたした。 しかし、Intelはリリヌスされた欠陥のあるプロセッサの数を特定できず、この゚ラヌの重芁性を平準化しようずしたした。



Intelの広報担圓者は、この欠陥は䞀般ナヌザヌには圱響しないず匷調したした。 ナむセルずいえば、スミスは次のように述べおいたす。「これは䟋倖的なナヌザヌです。 圌は24時間逆数倀を蚈算したす。 圌が数か月の蚈算の埌に発芋したのは、8぀の10進数が正しく、9番目だけが正しく衚瀺されないずいう事実の䟋です。 ぀たり、ポむントの右偎にある9番目の文字にのみ間違いがありたす。 あなたが゚ンゞニアであっおも、これに気付くこずはないず思いたす。」 [ ゜ヌス ]



1999幎11月21日、1035幎、 CNN は 1994幎11月17日にこの発衚を配垃し、ニュヌペヌクタむムズやAP通信などの䞻芁メディアで間もなく公開されたした。 他のむンタビュヌでは、むンテルは、゚ラヌが平均的なナヌザヌにずっお重芁ではないずいう以前の声明を繰り返したした。



むンテルは、プロセッサヌをリコヌルする必芁はないず考えおおり、 平均的なナヌザヌはこの゚ラヌのために90億回のうち1回しか間違った結果を埗る こずができないため、自宅やオフィスのコンピュヌタヌに顕著な圱響はないず䞻匵しおいたす。



ティム・コヌ



1999幎11月27日に、 Vitess SemiconductorのTim Coeはcomp.sys.intelニュヌスグルヌプに関する蚘事を公開し、アルゎリズムの実装を「逆転」し、Pentiumプロセッサの動䜜のモデルを提案したした。 数日埌、゚ラヌに察するハヌドりェアおよび゜フトりェアのパッチが登堎したした。



Tim Coeによる元の手玙11月28日
ニュヌスグルヌプcomp.sys.intel

Fromcoe@vitsemi.comティムコヌ

件名RePentiumでのFDIVの明癜なバグ

送信者coe@vitsemi.comティムコヌ

組織Vitesse Semiconductor

日付月、94幎11月28日06:33:42 GMT

行548



PentiumハヌドりェアディバむダヌのCモデルがありたす

正確に予枬したこのメッセヌゞの最埌に

蚘茉されおいる倱敗した陀算の倚くは、正確に

私が知っおいるすべおの倱敗した分割を確認したす。



私は1989幎から1991幎たでIEEEハヌドりェアFPUに取り組んでいたした。

FPUデザむナヌずしお私は自然に興味がありたす

ハヌドりェア算術のアルゎリズム。 私は珟圚

完党に異なるものに取り組んでいたすが、私は

関連する開発を時折サポヌトする

タスク。



Pentium FDIVに関連する最初の投皿を芋たした

comp.sys.intelのバグ。 からの投皿を芋たずき

アンドレアス・グルヌス同梱、パタヌンを芋たした

Intelを完党にリバヌス゚ンゞニアリングする機䌚

仕切り 私はこのタスクに粟力的に取り組みたした。

に可芖性を埗るこずは非垞にたれです

他の誰かの最先端デザむンの詳现。



結果が衚瀺されたずきに投皿するこずにしたした

むンテルは、

バグの特性。 最高の特城

バグの唯䞀の特城

むンテルは、発生する確率が90億分の1です

ランダムなオペランド。 最悪の特性

バグのほずんどは、特定のオペランドが

リスクは敎数±非垞に小さなデルタです。 の

æ•Žæ•°3、9、15、21、27から非垞に小さい敎数

デルタは危険な陀数です。 特に

衚珟可胜な最倧の単粟床、倍粟床、

そしお、3、9 ... 27未満の拡匵粟床数は

すべおが真剣に危険因子です。他の悪い

私が聞いおいなかったこのバグの特城

Intelからの最悪の堎合の゚ラヌは、

バグによる4぀の郚分よりも倧幅に倧きかった

Nicely教授が芳枬した10億゚ラヌあたり。



Intelがしようずしおいるように芋えた

9分の1に焊点を合わせお露出を最小限に抑える

公衚された゚ラヌの10億の確率

教授によっお芳察された10億分の4の゚ラヌ

いいね。 私は結論を出したので、Intelは

ナヌザヌコミュニティは、決定するずきにIntelの仲間になる可胜性がありたす

このバグが原因で危険にさらされる可胜性のあるアプリケヌション。



むンテルは優れた技術的仕事をしおいるず思いたす。 埌

すべお、私がcomp.sys.intelを読んでいた唯䞀の理由は

P90システムの賌入を怜蚎しおいたこず。

この埌、私はただP90システムを賌入したすが、

私がするずき、私は固定チップず保蚌を求めたす

システムを受け取った埌、それが

売り手が蚀う固定チップが含たれおいたせん

固定されおいないチップのポストヘむストを亀換したす。 私は考えたす

バグが完党に蚱されるずしお発生したずいう事実、

私は倚くのチップを蚭蚈しおいるため、蚭蚈されおいたす

倚くのバグ。



ここに含たれおいない远加のプログラムを投皿したした

単粟床オペランドの゚ラヌをスキャンした

単䞀の粟床よりも倧きい誘導

最䞋䜍ビット。 のリストを受け取った

1738問題の単粟床陀算64のうち

兆。 ハヌブサベヌゞがリストを提䟛したした。



次の陀数ずそのバむナリスケヌリング

これにより、2進指数のみが異なるこずを意味したす

分割゚ラヌの95以䞊を占めるようです



3.0>陀数> = 3.0-36 *2 ^ -22

9.0>陀数> = 9.0-36 *2 ^ -20

15.0>陀数> = 15.0-36 *2 ^ -20

21.0>陀数> = 21.0-36 *2 ^ -19

27.0>陀数> = 27.0-36 *2 ^ -19



䞊蚘の範囲のいずれかの陀数を持぀陀算

箄20䞇分の1の確率で損倱を被る

倍粟床拡匵挔算における粟床の向䞊。

分割゚ラヌの残りの5未満を考慮するこずができたす

䞊蚘の36を2048に倉曎するこずにより。



すべおの配圓は䞊蚘に察しお幟分危険にさらされおいたす

陀数 次の匏は配圓を識別したす

特に゚ラヌのリスクが高い

䞀般的な゚ラヌず比范的倧きな゚ラヌの堎合



配圓= intdividend + deltadividend

たたは

配圓= intdividend-deltadividend

陀数= intdivisor-デルタ陀数

intdivisor = 3、9、15、21、27



次のいずれかが圓おはたる必芁がありたす。

IEEE衚珟の指数

問題の配圓



intdividend = intdivisor / 3 mod intdivisor

intdividend = 2 * intdivisor / 3 mod intdivisor



䞊蚘のdeltadividendおよびdeltadivisorの制限

やや耇雑で、その詳现は

読者のための挔習。 ;-)私は解決しおいたせん

制限の詳现。



comp.sys.intelぞの以前の投皿は次のずおりです。 読んで

お楜しみください。



-ティム・コヌcoe@vitsemi.com



-最初ず2番目の投皿テキスト-Packard Bell P90 PCで、以䞋を実行したした

Microsoft Windows Desk Calculatorを䜿甚した蚈算



4195835/3145727* 3145727 [以前の投皿から修正されたタむプミス]



結果は4195579でした。

これは、256の゚ラヌたたは16000〜16000の䞀郚を衚したす。



ak@ananke.s.bawue.deAndreas Kaiserの曞き蟌み

>通垞、分割は正しいです䜕を期埅しおいたしたか。 ほんの少し

>オペランドが間違っお分割されおいたす。 〜25.000.000.000の結果P90

>ランダムな匕数1..2 ^ 46以内、偶数の結果を2で割ったもの

>奇数になるたで、䞀意の仮数パタヌン2進指数

>もちろん、気にしたせん。

>

> 3221224323

> 12884897291

> 206158356633

> 824633702441

> 1443107810341

> 6597069619549

> 9895574626641

> 13194134824767

> 13194134826115

> 13194134827143

> 13194134827457

> 13194138356107

> 13194139238995

> 26388269649885

> 26388269650425

> 26388269651561

> 26388276711601

> 26388276712811

> 52776539295213

> 52776539301125

> 52776539301653

> 52776539307823

> 52776553426399

>

>アンドリュヌス・グルヌス

>

> --------------------

>-アンドレアスカむザヌ-むンタヌネットak@ananke.s.bawue.de

> -------------------- fidonet2246 / 8506.9



これらの数倀を分析するず、そのうちの2぀を陀くすべおのものが

フォヌム



3 *2 ^K + 30-1149 *2 ^K-2 * J-デルタ*2 ^K-2 * J



ここで、JずKは0以䞊の敎数です。

デルタは実数であり、範囲はさたざたです

Jにありたすが、通垞は0〜1の間ず芋なすこずができたす。



䞊蚘の方皋匏の2 * J項は結論に぀ながりたす

Pentium陀算噚は、蚈算する反埩陀算噚であるこず

サむクルごずに2ビットの商。 これは同意したす

からの長い長い陀算ごずに匕甚された39サむクル

Pentiumデヌタブック。 このタむプの技術名

分呚噚は基数4



゚ラヌの非垞に䜎い確率10 ^ 10分の1は、

残りはキャリヌセヌブ圢匏で保持されおいるこず。 キャリヌ

保存圢匏は、数倀が次の合蚈ずしお衚される堎所です。

2぀の数字。 この圢匏により、次の剰䜙蚈算が可胜になりたす

キャリヌを䌝播せずに発生したす。 運ぶ理由

保存フォヌマットは、゚ラヌの確率によっお暗瀺されたす

非垞に難しいが、長く積み䞊げるこずは䞍可胜ではない

合蚈ワヌドず

単語を運ぶ。



数字セットは-2、-1、0、1、2であるず仮定したした

基数4のディバむダヌの5桁の数字により、必芁な

次の桁遞択での゚ラヌのマヌゞン。 長くするずき

基数10および10の可胜な数字を䜿甚しお、手で割るこずができたす。

゚ラヌのマヌゞンなし。



䞊蚘を考慮しお、暫定版を曞きたした

以䞋に含たれるPentium分割ハヌドりェアのモデルは、

残りの郚分でどのビットパタヌンが発生したかを芋るこずができたす。

倱敗するこずがわかっおいる数字ず数字を実行した埌

倱敗しないように芋えたそれらの近くに私は決定したした

プログラムにリストされおいる障害の条件。



で返される正確で誀った結果の分析

悪い陀算は、ビットが枛算されおいるこずを瀺したす

最䞊䜍ビットたたはその近くの残りから。

このプロセスのモデリングはプログラムに含たれおいたす。



プログラムは、公開されたすべおの

゚ラヌず、

蚘事の始たり。



数字のシヌケンスからの商の決定

読者のための挔習ずしお残されおいたす;-)。



博士に感謝したい このりィンドりを提䟛しおくれおうれしい

Pentiumアヌキテクチャに。



-3番目の投皿-それ以来、Microsoftで次の蚈算を実行したした

次のPentiumマシン䞊のWindows Desk Calculator

結果



41.999999 / 35.9999999* 35.9999999-41.999999 ==>-0.75*2 ^ -13

48.999999 / 41.9999999* 41.9999999-48.999999 ==>-1.0*2 ^ -13

55.999999 / 47.9999999* 47.9999999-55.999999 ==>-1.0*2 ^ -13

62.999999 / 53.9999999* 53.9999999-62.999999 ==>-1.0*2 ^ -13

54.999999 / 59.9999999* 59.9999999-54.999999 ==>-1.0*2 ^ -13

5244795/3932159* 3932159-5244795 ==>-1.0*2 ^ 8



私はそれらがさらに露出するこずを芋越しおこれらの蚈算を遞択したした

Pentium FDIV障害モヌド。 圌らがやった。 誀った結果のサむズ

tentive Pentiumの最終バヌゞョンず完党に䞀臎しおいたす

以䞋に含たれるディバむダヌモデルは、決しお起因するものではありたせん

Desk Calculatorのバグ。 これらの結果ピンの存圚

モデルに含たれるほずんどの桁遞択しきい倀。



たた、゚ラヌを生成しない次の蚈算を実行したした

結果



38.499999 / 32.9999999* 32.9999999-38.499999 ==> 0

45.499999 / 38.9999999* 38.9999999-45.499999 ==> 0



私はこのスレッドを非垞に興味を持っおフォロヌしおいたす。 䞀぀の誀解

クリアする必芁があるのは、これが拡匵粟床の問題であるこずです。 これ

50〜2000の単粟床配圓陀数ペアのバグヒットout

合蚈64兆回別の誀解は倧きさに関連しおいたす

盞察誀差の。 次の確率衚を提案したす

ランダムなダブルを実行するずきに次の盞察゚ラヌが発生する

拡匵粟床陀算



relerror =correct_result-Pentium_result/ correct_result



゚ラヌ範囲| 確率

-1e-4 <relerror | 0

1e-5 <relerror <1e-4 | 0.3e-11

1e-6 <relerror <1e-5 | 0.6e-11

1e-7 <relerror <1e-6 | 0.6e-11

1e-8 <relerror <1e-7 | 0.6e-11

。

。

1e-18 <relerror <1e-17 | 0.6e-11

1e-19 <relerror <1e-18 | 0.6e-11



䞊蚘の分割倱敗の調査により、䞡方の配圓が

陀数は敎数から小さなデルタを匕いたものです。 たた泚目されるのは

゚ラヌはおおよそデルタ^2/3です。 陀数の敎数は実際には

リストされおいるものずそれらのバむナリスケヌリングに制限されおいたす。 の敎数

配圓ははるかに自由に遞択できたす。 このタむプの配圓

陀算ペアは、実際にフォワヌド統合時に頻繁に発生したす

準安定点からの軌道。 これは、準安定点

システムでは、しばしば特定の正確な積分特性を持ち、

経路は準安定点から発散し、これらの特性は埐々に発散したす

積分倀から。 前方統合アルゎリズムの堎合

たたたたこれらの特性を分割したす

䟋7ず3では、釘付けになりたす。



分呚噚モデルには、最倧60ビットの陀数ず

最倧64ビットの配圓。 配圓の最埌の4ビットは现かく凊理されたす

で



倱敗した配圓陀数の仮数のリストを16進数で瀺したす。 ダッシュ

2぀の数字の間は、包括的障害範囲を瀺したす。 コンパむルする

プログラムを実行し、これらの数倀を実行しお、ビットが螊るのを芋おください。



800bf6 bffffc

a00ef6 effffc



a808d2 8fffe

e00bd2 bfffe



a7ffd2 8fffe

c3ffd2 a7ffe

dfffd2 bfffe

fbffd2 d7ffe



f9ffdc7 efffe



b9feab7-b9feabf 8fff

b9ffab0e-b9ffab7f 8fffc



-次の二重拡匵ペアは3回倱敗したす!!!

c3ffd2eb0d2eb0d2 a7ffe

e00bd229315 bfffe



9fffef5-9fffeff effff4

9ffff21-9ffff3f effff8

9ffff4d-9ffff7f effffc



f008e35-f008e3f 8ffff4

f008e6d-f008e7f 8ffff6

f008ea1-f008ebf 8ffff8

f008ed9-f008eff 8ffffa

f008f0d-f008f3f 8ffffc

f008f45-f008f7f 8ffffe

f008f7e 8ffffff1

f0023e 8fffff8



effff0d 8ffffc



a808d1b-a808d3f 8fffe

a808d67-a808d7f 8fffe4

a808db3-a808dbf 8fffe8

a808dff 8fffec



プログラムの実行䟋最初に報告されたものを䜿甚

゚ラヌ



---配圓仮数を16進数で入力8

---陀数仮数を16進数で入力bfffffb829

---次の数字1

--- 111100000000000000000000000100011111010110111111111111111111111111100

--- 00000000000000000000000000000000000000000000000000000000000000000000000100

--- 111100000000000000000000000000010001反埩番号1

---。

---。

---。

---次の桁-1

--- 001111111110010010101111010011000001011101000000000000000000000000000000

--- 11011111111111111111101101100100100100000000000000000000000000000000000000

--- 00011111111001001010101010110000反埩回数14

---次の数字2

---バグ状態が怜出されたした。

---正しい結果の堎合は0、誀った結果の堎合は1を入力しおください1

--- 000000000110110101010000100000011111011001111111111111111111111100

--- 1111111100100101010110100110010010010010000000000000000000000000000100100

--- 1111111110010010101010101011100101反埩番号15

---次の数字0

--- 11111101001000000010101110010101100100010111111111111111111111100000000

--- 00000001001010101000000000000100100100000000000000000000000000100000

--- 1111111001001010101010101110011001001反埩回数16

---。

---。

---。



-ティム・コヌcoe@vitsemi.com



Cのプログラム
#include main() { unsigned r0, r1, r2, r3, r4, r5, r6, s0, s1; unsigned t0, t1, t2, t3, cycle, f, incorrect, spup; unsigned thr_m2_m1, thr_m1_0, thr_0_1, thr_1_2, positive, errornum; char line[30], *linepoint; r0 = 0x0bffffc0; r1 = 0; r2 = 0x0800bf60; r3 = 0; printf("First digit of mantissas must be between 8 and f\n"); printf("Enter dividend mantissa in hex: "); *(line+15) = '0'; scanf("%s", line); linepoint = line; while (*linepoint != '\0') linepoint++; while (linepoint < line + 15) *linepoint++ = '0'; *(line+16) = '\0'; sscanf(line+15, "%x", &spup); spup = (spup >> 2) | (12 & (spup << 2)); *(line+15) = '\0'; sscanf(line+7, "%x", &r3); *(line+7) = '\0'; sscanf(line, "%x", &r2); printf("Enter divisor mantissa in hex: "); scanf("%s", line); linepoint = line; while (*linepoint != '\0') linepoint++; while (linepoint < line + 15) *linepoint++ = '0'; *(line+15) = '\0'; sscanf(line+7, "%x", &r1); *(line+7) = '\0'; sscanf(line, "%x", &r0); r4 = 0; r5 = 0; t0 = r2; while (!(t0 & 1)) t0 = t0 >> 1; printf("%d\n", t0); t0 = r0; while (!(t0 & 1)) t0 = t0 >> 1; printf("%d\n", t0); /* These thresholds are VERY tentative. */ /* There may be bugs in them. */ t0 = r0 >> 22; /* Next threshold is strongly indicated */ /* by the failure of 1/9895574626641 */ if (t0 < 36) thr_0_1 = 3; /* Next threshold is strongly indicated */ /* by the failure of 1/824633702441 */ else if (t0 < 48) thr_0_1 = 4; /* Next threshold is strongly indicated */ /* by the failure of 5244795/3932159 */ else if (t0 < 60) thr_0_1 = 5; else thr_0_1 = 6; thr_m1_0 = 254 - thr_0_1; if (t0 < 33) thr_1_2 = 11; else if (t0 < 34) { printf("This model does not correctly handle\n"); printf("this divisor. The Pentium divider\n"); printf("undoubtly handles this divisor correctly\n"); printf("by some means that I have no evidence\n"); printf("upon which speculate.\n"); exit(); } /* Next threshold is strongly indicated */ /* by the failure of 41.999999/35.9999999 */ else if (t0 < 36) thr_1_2 = 12; else if (t0 < 39) thr_1_2 = 13; /* Next threshold is strongly indicated */ /* by the failure of 1/1443107810341 and */ /* by the failure of 48.999999/41.9999999 */ else if (t0 < 42) thr_1_2 = 14; else if (t0 < 44) thr_1_2 = 15; /* Next threshold is strongly indicated */ /* by the failure of 55.999999/47.9999999 */ else if (t0 < 48) thr_1_2 = 16; /* Next threshold is strongly indicated */ /* by the failure of 62.999999/53.9999999 */ else if (t0 < 54) thr_1_2 = 18; /* Next threshold is strongly indicated */ /* by the failure of 54.999999/59.9999999 */ else if (t0 < 60) thr_1_2 = 20; else thr_1_2 = 23; thr_m2_m1 = 254 - thr_1_2; if (t0 == 35) errornum = 22; else if (t0 == 41) errornum = 26; else if (t0 == 47) errornum = 30; else if (t0 == 53) errornum = 34; else if (t0 == 59) errornum = 38; else errornum = 128; incorrect = 0; cycle = 1; /* The cycle limit would be ~34 instead of */ /* 18 for double extended precision. */ while (cycle < 18) { t0 = 255 & ((r2 >> 24) + (r4 >> 24)); if ((t0 > thr_m1_0) || (t0 < thr_0_1)) { s0 = 0; s1 = 0; positive = 0; printf("next digit 0\n"); } else if (t0 > thr_m2_m1) { s0 = r0; s1 = r1; positive = 0; printf("next digit -1\n"); } else if (t0 < thr_1_2) { s0 = ~r0; s1 = ~r1; positive = 4; printf("next digit 1\n"); } else if (t0 & 128) { s0 = (r0 << 1) | (r1 >> 31); s1 = r1 << 1; positive = 0; printf("next digit -2\n"); } else { s0 = ~((r0 << 1) | (r1 >> 31)); s1 = ~(r1 << 1); positive = 4; printf("next digit 2\n"); if ((t0 == errornum) && (((r2 >> 21) & 7) == 7) && (((r4 >> 21) & 7) == 7)) { printf("A bug condition has been detected.\n"); printf("Enter 0 for correct result or 1 for incorrect result: "); scanf("%d", &incorrect); if (incorrect) { /* These amounts that are subtracted from the */ /* remainder have NOT been extensively verified. */ if (errornum == 22) s0 = s0 - (3 << 25); else s0 = s0 - (4 << 25); } } } t0 = s0 ^ r2 ^ r4; t1 = s1 ^ r3 ^ r5; t2 = (s0 & r2) | (s0 & r4) | (r2 & r4); t3 = (s1 & r3) | (s1 & r5) | (r3 & r5); r2 = (t0 << 2) | (t1 >> 30); r3 = t1 << 2; r4 = (t2 << 3) | (t3 >> 29); r5 = (t3 << 3) | positive | (spup & 3); spup = spup >> 2; t0 = r2; f = 32; while (f--) { if (t0 & (1 << 31)) putchar('1'); else putchar('0'); t0 = t0 << 1; } t0 = r3; f = 32; while (f--) { if (t0 & (1 << 31)) putchar('1'); else putchar('0'); t0 = t0 << 1; } putchar('\n'); t0 = r4; f = 32; while (f--) { if (t0 & (1 << 31)) putchar('1'); else putchar('0'); t0 = t0 << 1; } t0 = r5; f = 32; while (f--) { if (t0 & (1 << 31)) putchar('1'); else putchar('0'); t0 = t0 << 1; } putchar('\n'); t0 = r2 + r4; f = 32; while (f--) { if (t0 & (1 << 31)) putchar('1'); else putchar('0'); t0 = t0 << 1; } printf(" iteration number %d\n", cycle++); } }
      
      











ノォヌン・R・プラット



画像






2.99915236 1994幎12月19日、スタンフォヌド倧孊のノォヌンR.プラットはcomp.archおよびcomp.sys.intelニュヌスグルヌプぞの手玙を発行したした。これは、゚ラヌに遭遇する確率は「27回に1回」であるずいうむンテルの芋解に異議を唱えたした000幎。」 かなり劥圓なシナリオで、3ミリ秒ごずに1回゚ラヌをアクティブにする可胜性を実蚌できたした。 たた、圌は、4.999999 / 14.999999のかなり無害な芋た目の分割が、欠陥のあるプロセッサを䜿甚した堎合に0.00000407だけ正しい結果から逞脱するこずを瀺したした。



「この間違いは最も朜行性が高く、デヌタの列を芋たずきにたったく譊告を発しなかったかのように、ほずんど朜行性です。 したがっお、10䞇分の1の小さな゚ラヌは、䞖界䞭で実行されおいる䜕兆もの蚈算に長時間浞透する可胜性があり、信頌できるプロセッサには絶察に必芁ではないFPUで倧芏暡な゚ラヌチェックを実行するこずを陀いお、実際にそれらを決定する方法はありたせん。 」


Voen Prattによる元の手玙
Frompratt@Sunburn.Stanford.EDUノォヌン・R・プラット

ニュヌスグルヌプcomp.arch、comp.sys.intel

件名FDIVバグの可胜性が高い自然なシナリオだったIntelの防衛で...

日付1994幎12月3日15:20:17 GMT

組織スタンフォヌド倧孊コンピュヌタサむ゚ンス郚。

行194

メッセヌゞID<3bq2bh$ohc@Radon.Stanford.EDU>

参照<3bdieq$lqf@engnews2.Eng.Sun.COM> <3bf666$6k4@hpsystem1.informatik.tu-muenchen.de> <3bnrgo$4gf@hermes.synopsys.com>

NNTP-Posting-Hostsunburn.stanford.edu

倖郚参照Radon.Stanford.EDU comp.arch15209 comp.sys.intel:20065

このメッセヌゞでは、27,000幎ごずに発生するIntelのデフォルトシナリオずは察照的に、3ミリ秒ごずに1回FDIVバグが発生するシナリオを瀺したす。 さらに、遭遇したバグには䞍明瞭な数字は含たれおいたせん。それらはすべお、5/15のような小さな「あざ」理論の圢を取りたす。 さらに、この䟋のように、発生する゚ラヌのかなりの数が非垞に倧きくなりたす。 シナリオの劥圓性は読者が刀断できるようにしたす。 私の意図は、それが起こる可胜性のあるものずしお遭遇するこずです。



動機付け蚘事<3bnrgo$4gf@hermes.synopsys.com>で、Joe Buckは次のように曞いおいたす。



>私はこの倧隒ぎに本圓に驚いおいたす。 件のうち件

> 10億、本質的には単粟床陀算ではなく

>倍粟床陀算。 Pentiumナヌザヌの倧倚数は決しおしたせん

>完党な単粟床さえ必芁ずするものスプレッドシヌトを実行し、

>ドキュメントを䜜成し、ゲヌムをプレむしたす。 むンテルが玄10億を支払うべき理由

>これは9個のれロですこれらのすべおのルアヌに新しいチップを搭茉するためのドルですか

90億分の1、ない。 ナヌザヌのプログラムで発生する実数が均䞀に分垃するこずはよくある誀りです。 それらの実際の分垃は、以䞋で説明するシナリオのように、プログラムがそのデヌタを取埗する堎所ずそれが䜕を行うかに倧きく䟝存したす。



NOT単粟床内に修正したす。 もちろん、16ビットの語長を念頭に眮いおいない限り、 〜16ビット゚ラヌの他の䟋は既に提䟛されおいたすが、䞊蚘の4.999999 / 14.999999のようなここでの゚ラヌの圢匏は、特に劇的です。



このメッセヌゞでは、数論、暗号、埮分方皋匏、たたは行列の反転を䌎わず、プロセスによっおわずかに「ゆるめ」られた実数ずしお衚される1〜3桁の敎数による単玔な陀算を含む、単玔でもっずもらしいシナリオを瀺したす。私たち党員が䜕床も芋おいたす。 このシナリオでは、FDIVバグは、27,000幎ごずに1回ではなく、3ミリ秒ごずに1回、Pentiumがそれらに遭遇した割合を明らかにしたす。



ここでの重芁な仮定は、このシナリオで遭遇する敎数は、他の凊理のために非垞にわずかに「ゆるめ」られ、その埌、䜕らかの理由でたずえば、数倀は10進蚈算機から自動的に取埗される可胜性がある、いく぀かの事前に決められた数に切り捚おられるこずです10進数、*粟床*。 すべおの敎数は、固定された粟床のために、この凊理に察しお䞀様に条件付けられたす。 したがっお、粟床が6で、7を18で割るず、7は実際には6.999999で、18は17.999999です。぀たり、同じ量ここでは10 ^ -6が䞡方のオペランドから枛算されたす。



1 <= i、j <= 1000の敎数i、jのペアが100䞇個ありたす。次の衚は、10進粟床の䜎䞋ず*蚱容床*陀算からの距離間違った答えずしおカりントしたす、100䞇の郚門i / jのうちどれだけが間違っおいるかを調べたす。 これらの商に぀いおは、IEEE正解は10 ^ -17を超える盞察誀差を持぀ず予想されたす。 次の衚では、「間違った」ず定矩しお、盞察誀差が最初の列で少なくずも10 ^ -15、2番目の列で少なくずも10 ^ -13などであるず定矩しおいたす。 ぀たり、テヌブルを暪切っおいくずうるさくなり、商が間違っおいるず認識する回数が少なくなりたす。







粟床が6桁の堎合、切り捚お誀差は100䞇分の1で、簡単に芚えられる量です。 この堎合、カクテルパヌティヌでの制䜜の堎合のみ、読者は最悪の犯眪者のうちの2人たたは3人を蚘憶したいず思うかもしれたせん。



私のお気に入りは5/15、぀たり4.999999 / 14.999999で、他の鑑定士がより公正な答えずしお0.33333329を芁求するずきに0.33332922でPentiumによっお評䟡されたす。



もう1぀の悪いケヌスは7/486.999999 / 47.999999です。これは、より刺激的な掚枬が0.14583332である堎合に、Pentiumが0.14583204を掚枬したす。



もう1぀の候補9/548.999999 / 53.999999、ペンティアムは0.16666439でギャンブルし、0.16666665にペナルティを倱いたす。



これらの䟋の3぀の本質的な特城を匷調したす。 第1に、基本的な算術挔算は非垞に小さな敎数わずかに「打たれた」であるため、これらの正確な゚ラヌに気付くかどうかにかかわらず、発生する可胜性が倧幅に高たりたす。 第二に、あざは100䞇分の1や1000䞇分の1などの単玔な量である可胜性があり、0.000000142883のようなあいたいな量である必芁はなく、状況で発生するあざがあなたにずっお悪い可胜性が倧幅に増加したす。 第䞉に、゚ラヌはFDIVの䞡方のオペランドに均䞀に適甚できるため、オペランドの゚ラヌを個別に調敎する必芁がないため、これらの゚ラヌのいずれかが発生する可胜性がさらに高くなりたす。



これらの3぀の䟋の奇劙な特城は、時間が経おば私が远求しおおらず、統䞀された説明を持っおいるかもしれないし、持っおいないかもしれないこずです䞊蚘の^^で。 これにより、次の3぀の䟋でPentiumを゚ミュレヌトするための単玔なヒュヌリスティックが埗られたす。ポケットカルキュレヌタヌで4.999999 / 14.999999などを蚈算し、2桁の繰り返し数字を削陀したす。 結果は、繰り返し文字列を超えお1桁5/15の堎合は実際には2桁になりたす。



これら3぀の䟋の盞察誀差は、粟床よりも倧幅に倧きいこずに泚意しおください。



蚱容差10 ^ -5で生き残るのは26ペアのみです。 蚘録の粟床6の14の間違ったもの5 / 15、5 / 30、5 / 60、5 / 120、9 / 54、9 / 108、9 / 216、9 / 432、9 / 864、 10 / 60、10 / 120、10 / 240、10 / 480、および10/960。 7/48は0.9 * 10 ^ -5だけオフになっおいたす。蚱容誀差10 ^ -5をほずんど逃しおいたせん。粟床5の堎合、10人の悪者は18 / 27、20 / 30、33 / 144、36 / 108です。 、40 / 120、44 / 192、72 / 432、72 / 864、80 / 480、および80/960。 粟床4の堎合、2぀の区分は82/96ず120/288です。 具䜓的には、81.9999 / 95.9999は0.8541665を期埅したずきに0.854156を返し、119.9999 / 287.9999は0.416656を返し、0.4166665が必芁でした。 うヌん、delete-two-repeatsルヌルはここでも機胜したす;非垞に興味深い...



粟床の抂念ずしお基数10を想定しおいたしたが、特別なものではなく、他の基数も同様の結果をもたらすはずです。 特に、10本ではなく13本の指を進化させた堎合、蚱容範囲10 ^ -9で11桁から3桁に察応するテヌブルは、0、31、211、547、802、784、417、109、0になりたす。



このシナリオでは、少なくずも私にはかなり悪い光のように芋えるものにFDIVのバグが入りたすが、最悪のシナリオのようなものではないず䞻匵したす。 シナリオの2぀の重芁な芁玠は、そのシナリオがFDIVバグをトリガヌするレヌトず、そのシナリオの本質が実際にどのくらいの頻床で発生するかです。 シナリオの「損傷指数」は、これら2぀の芁因の積です。 実際のPentium時間の数千時間を占めるが、10分ごずにバグをトリガヌするだけのシナリオは、䞊蚘のシナリオよりも高いダメヌゞむンデックスを持っおいる可胜性があり、その匷さは数ミリ秒ごずにバグをトリガヌするが、その匱点はそれが実際に実際にどれほどありそうかに぀いおの䞍確実性。 ただし、これは完党に信じがたいシナリオではないこずを認めなければなりたせん。



-ooooooooooooooooooooooo-ooooooooooo



ここに、䞊蚘の衚を印刷するコヌドを远加したす。 Cで調和しないず思う人にずっおは、これが「粟床」ず「蚱容」の正確な意味を探す堎所です。



 #include #include main(argc, argv) char *argv[]; { int i, j, cnt, digits; double prec, tol, ibruis, jbruis, pent, true; for (digits = 15, prec = 1e-15; digits > 2; digits--, prec *= 10) { printf("%4.d\t\t", digits); for (tol = 1e-15; tol < 1e-4; tol *= 100) { cnt = 0; for (i = 1; i <= 1000; i++) for (j = 1; j <= 1000; j++) { ibruis = i - prec, jbruis = j - prec; pent = ibruis/jbruis; true = (1.11*ibruis)/(1.11*jbruis); cnt += (fabs(pent - true) > tol*true); } printf("%4d ", cnt); } printf("\n"); } }
      
      







真の商、぀たりtrue =1.11 * ibruis/1.11 * jbruisを取埗するためのヒュヌリスティックは、FDIVバグをヒットする確率を少なくずもある皋床むンテルに近づけるのに十分なだけオペランドをランダム化する迅速で汚れたものです27,000幎に1回の掚定。 1.11を1.01に眮き換えたずき、結果は同じであり、Intelの芋積もりず合わせお、飛行機の建蚭を目的ずしないプログラムには十分であるず思われたした。



ノォヌン・プラット



[ ゜ヌス ]



11.99991035 1994幎12月17日 、IBMはPentium Study、IBM Memoをリリヌスし、Intelの声明に疑問を投げかけたした。



1999幎12月19日、973251に、 Intelは、Pentiumプロセッサを必芁に応じお亀換し始めたこずを発衚したした。 アンディ・グロヌブは公に謝眪した。 歎史は、1994幎の最埌の四半期である475,000,000ドルの利益の半分以䞊をIntelにもたらしたした。



マスコミは沈静化しなかったが、人々は死を望んだ。



画像








アラン・゚ヌデルマン



画像








9999163362幎9月18日に 、アラン・゚ヌデルマンはこの゚ラヌの詳现な分析を行ったレポヌトを公​​開したした。



画像








画像








続きを読む







PS



「ファンから」トップ10のむンテルのスロヌガン






All Articles