2012-12-30 113 views
4

可能重複:
Floating point division vs floating point multiplication浮點運算性能C++

最近,我寫了計算需要多長時間我的電腦 計算真正的乘法,除法和加法的程序。

爲此,我使用了函數QueryPerformanceFrequency和QueryPerformanceCounter 以獲取時間間隔。

我已經測試使用600萬次迭代我的程序:6000000次乘法,除法和金額(使用float變量),並得到這個結果:

O.S = Windows Vista (TM) Home Premium, 32-bit (Service Pack 2) 
Processor = Intel Core (TM)2 Quad CPU Q8200 
Processor Freq = 2.33 GHz 

Compiler = Visual C++ Express Edition 


    nº iterations        time in micro seconds 
    6000000 x real mult + assignment ->  15685.024214 us 
    6000000 x real  div + assignment ->  51737.441490 us 
    6000000 x real  sum + assignment ->  15448.471803 us 
    6000000 x real   assignment ->  12987.614348 us 

    nº iterations        time in micro seconds 
    6000000 x real    mults ->  2697.409866 us 
    6000000 x real     divs ->  38749.827143 us 
    6000000 x real     sums ->  2460.857455 us 

    1 Iteration       time in nano seconds 
    real     mult ->   0.449568 ns 
    real     div ->   6.458305 ns 
    real     sum ->   0.410143 ns 

是否有可能分裂比乘法慢六倍,和加法幾乎等於乘法(〜0.42 ns)?

+0

**問:是否有可能除法比乘法慢六倍,並且加法實際上等於乘法? **答:**是的。 –

回答

0

是的。如果您曾經手動完成分工,那麼您知道它涉及大量的子操作。對於加法和乘法大約相同的速度:這些與設置操作數和存儲結果有關,而不是實際計算。通過編譯使用SSE指令進行加法和乘法(在x86上),您可能能夠在它們之間獲得更多差異。

0

使用現代CPU時,乘法與加法的速度大致相同。

在英特爾的Sandy Bridge上,乘法使用SSE需要四分之三的加法時間。但是考慮到ILP,在同一時間可以處理多個指令的情況下,他們實際上會花費相同的時間。在同一個CPU上,使用ILP,單精度分區需要7-14倍的時間!

來源:Agner Fog's instruction tables。在他的網站有很多非常好的閱讀。