2012-08-14 43 views
4

浮點算術運算可能在不同的CPU上產生不同的結果嗎? 由CPU我的意思是所有的x86和x64。我的意思是即使只有一個最不重要的位是不同的..我需要知道我是否可以在項目中使用浮點運算,這對於在不同機器上具有與相同輸入相同的結果至關重要。浮點運算結果的重複性

編輯:添加C++標記。
另外爲了澄清:我需要可重複的結果運行時。我不希望不同的彙編產生相同的結果。

+0

他們應該產生完全相同的結果。除非你正在使用一個真正的舊奔騰... – Wug 2012-08-14 12:45:33

+0

對於實際上具有數學意義的重複性結果,請使用小數點,而不是浮點數。查看[this](http://stackoverflow.com/questions/3039650/ruby-bigdecimal-sanity-check-floating-point-newb)瞭解更多關於兩者之間的區別。 – aguazales 2012-08-14 12:49:43

+0

@aguazales我不使用Ruby,只要它們在所有FPU上的工作方式完全相同,也可以使用浮動,所以如果他們真的如此,那麼問題依然存在? :] – user1316208 2012-08-14 12:55:08

回答

9

在遊戲行業這個被稱爲確定性步調一致,並在客戶端和服務器需要在對物理對象的狀態協議是實時的網絡遊戲非常重要的(球員,彈,變形地形等)。

根據Glenn Fiedler在Floating Point Determinism上的文章,答案是「可能是」;如果在相同的體系結構上運行相同的二進制文件,則會限制使用不如基本浮點指定的功能,那麼您可以獲得相同的結果。否則,如果您使用不同的編譯器,或者允許您的代碼使用SSE或80位浮點,則結果將因不同的可執行文件和不同的機器而異。

約瑟夫Kreinin recommends

  • 掃描彙編輸出爲代數的優化並將它們應用到源代碼中;
  • 抑制融合的乘加和其他高級指令(例如,sin三角函數);
  • 並使用SSE或SSE2,或以其他方式將FPU CSR設置爲64位。 (是的,這與衝突格倫費德勒的建議。)

當然,測試您在多個不同的機器代碼;採取中間輸出的散列,因此您可以分辨出您的模擬發生的位置和時間。

+0

謝謝,我仍然不確定是否嘗試FP一致性,精度:( – user1316208 2012-08-14 13:53:09

4

如果您調用動態鏈接的庫,則可能會在不同的處理器上獲得不同的代碼。 (例如,Mac OS X上的Accelerate庫在不同的處理器上使用不同的實現。)

但是,如果使用基於處理器模型不派遣的完全相同的可執行映像(包括所有庫)輸入(包括對浮點模式或可影響浮點的其他全局狀態所做的任何更改),則處理器對所有基本浮點算術(加,減,乘,除,比較,轉換)產生相同的結果。

某些操作可能未完全指定爲在不同的處理器上返回相同的結果,例如inverse-square-root-estimate指令。

在ecatmur關於編譯器優化,融合乘法和SSE/SSE2/FPU使用的回答中提到的問題不適用於相同的二進制文件。這些問題僅適用於不同的編譯(不同的開關,不同的目標平臺,不同的編譯器版本)可能產生不同的代碼。既然你排除了不同的彙編,這些問題是不相關的。

如果爲32位目標(i386)和64位目標(x86_64)構建兩個可執行映像(在一個「胖」文件中),並且適用於不同編譯器產品的問題。