2011-09-14 77 views
8

英特爾C++編譯器提供了兩個選項來控制浮點不同:什麼是浮點猜測,它是如何從編譯器的浮點模型

-fp投機(快速/安全/嚴格的開/關) - fp-模型(精確/快速/嚴格和源/雙/擴展)

我想我明白什麼fp模型。但是什麼是fp-speculation,它與fp-model有什麼關係?我還沒有找到任何解釋這一點的英特爾文檔!

回答

13

-fp-model影響浮點計算是如何進行的,並且可以改變數字結果(通過許可不安全優化或通過改變精度在該中間結果被評估)。

-fp-speculation不會更改數值結果,但可以影響操作引發的浮點標誌(或者在啓用浮點陷阱時執行哪些陷阱)。 99.99%的程序員不需要關心這些事情,所以你可以運行默認值而不用擔心。

下面是一個具體的例子;假設你有以下功能:

double foo(double x) { 
    // lots of computation 
    if (x >= 0) return sqrt(x); 
    else return x; 
} 

sqrt相對來說慢,這將是很好葫蘆sqrt(x)這樣計算:

double foo(double x) { 
    const double sqrtx = sqrt(x); 
    // lots of computation 
    if (x >= 0) return sqrtx; 
    else return x; 
} 

通過這樣做,我們允許sqrt計算與其他計算同時進行,減少了我們的函數的等待時間。但是,有一個問題。如果x爲負數,則sqrt(x)將產生無效標誌。在原始程序中,這絕不會發生,因爲sqrt(x)僅在x非負時纔會計算。在修改後的程序中,無條件地計算sqrt(x)。因此,如果x爲負值,則修改的程序會引發無效標誌,而原始程序則不會。

-fp-speculation標誌爲您提供了一種告訴編譯器您是否在意這些情況的方法,因此它知道它是否有權進行這種轉換。

+1

考慮另一種變體,其中'sqrt(x)'是無條件評估的。顯然,同樣的優化是適用的,但現在,而不是一個額外的FPU異常,我們有一個FPU異常發生得太早,可能在其他內存寫入陷阱處理程序可觀察。推測性執行不僅會導致額外的FPU異常,還會改變異常的時間。 –

1

無序執行和推測執行可能導致無關的異常或在錯誤的時間引發異常。

如果這對您很重要,您可以使用fp-speculation選項來控制對浮點指令的猜測。

對於(一點點)的更多信息:http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/copts/common_options/option_fp_speculation.htm

+1

該標誌是由編譯器控制*軟件*推測,而不是硬件推測執行。無序處理器中的推測執行*不能引發無關的異常 - 在指令退役時修補任何虛假異常,因此對任何程序的可觀察效果就像指令按程序順序執行一樣。 –

+2

@Stephen:是的,編譯器可以生成邏輯來補丁,但是會減慢程序的速度。因此交易速度與準確的異常行爲有不同的選擇。 –

+0

編譯器不需要生成任何代碼來「修補」*硬件*推測。這是在硅處理。這裏我們談論的是編譯器在跨分支點提升長延遲操作(* software * speculation)。 –

-1

在Windows操作系統上: 1.英特爾編譯器浮動計算32位應用程序與64位應用程序,相同的代碼可以給你不同的結果!無論你選擇哪個國旗:)!!!!

2.Visual studio編譯器浮點計算32位與64位應用程序,相同的代碼輸出相同的結果。

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有[足夠的聲望](http://stackoverflow.com/help/privileges/comment),你會能夠評論任何帖子。 –

+0

這不是批評或澄清。從我的expiriense簡單的事實,因爲我在英特爾工作,並與英特爾編譯器打交道,我認爲我可以寫評論沒有「足夠的聲譽」 – user3004288

+0

https://software.intel.com/en-us/forums/topic/271440 – user3004288