2 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
8087浮點(diǎn)單元芯片設(shè)計(jì)是英特爾十億美元的錯(cuò)誤。這個(gè)想法在紙上看起來不錯(cuò),給它一個(gè)8寄存器堆棧,以80位擴(kuò)展精度存儲(chǔ)值。這樣您就可以編寫中間值不太可能丟失有效數(shù)字的計(jì)算。
然而,野獸無法優(yōu)化。將FPU堆棧中的值存儲(chǔ)回內(nèi)存非常昂貴。因此,將它們保留在FPU中是一個(gè)強(qiáng)大的優(yōu)化目標(biāo)。不可避免的是,如果計(jì)算足夠深,只有8個(gè)寄存器就需要回寫。它也被實(shí)現(xiàn)為堆棧,而不是可自由尋址的寄存器,因此需要體操也可能產(chǎn)生回寫。回寫不可避免地會(huì)將值從80位截?cái)?/em>回64位,從而失去精度。
因此,非優(yōu)化代碼不會(huì)產(chǎn)生與優(yōu)化代碼相同的結(jié)果。當(dāng)中間值最終需要寫回時(shí),計(jì)算的微小變化會(huì)對(duì)結(jié)果產(chǎn)生很大影響。/ fp:strict選項(xiàng)是一個(gè)黑客攻擊,它強(qiáng)制代碼生成器發(fā)出回寫以保持值一致,但是不可避免且相當(dāng)大的性能損失。
這是一個(gè)完整的巖石和一個(gè)艱難的地方。對(duì)于x86抖動(dòng),他們只是沒有嘗試解決問題。
英特爾在設(shè)計(jì)SSE指令集時(shí)沒有犯同樣的錯(cuò)誤。XMM寄存器可自由尋址,不存儲(chǔ)額外的位。如果您想要一致的結(jié)果,那么使用AnyCPU目標(biāo)和64位操作系統(tǒng)進(jìn)行編譯是快速解決方案。x64抖動(dòng)使用SSE而不是FPU指令進(jìn)行浮點(diǎn)數(shù)學(xué)運(yùn)算。雖然這增加了計(jì)算可以產(chǎn)生不同結(jié)果的第三種方式。如果計(jì)算錯(cuò)誤,因?yàn)樗鼇G失了太多有效數(shù)字,那么它將一直是錯(cuò)誤的。實(shí)際上,這有點(diǎn)像溴化物,但通常只有程序員看起來。
- 2 回答
- 0 關(guān)注
- 551 瀏覽
添加回答
舉報(bào)