浮点运算性能C ++

时间:2012-12-30 19:50:10

标签: c++ performance performancecounter

  

可能重复:
  Floating point division vs floating point multiplication

最近,我写了一个程序来计算我的电脑需要多长时间 计算实数乘法,除法和加法。

为此,我使用了QueryPerformanceFrequency和QueryPerformanceCounter函数 为了获得时间间隔。

我已经使用6,000,000次迭代测试了我的程序:6000000次乘法,除法和求和(使用浮点变量),得到了这个结果:

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

分割是否可能比乘法慢6倍 加法实际上等于乘法(~0.42 ns)?

2 个答案:

答案 0 :(得分:0)

是的。如果您曾经手动完成除法,那么您就知道它涉及许多子操作。

对于加法与乘法大约相同的速度:这些与设置操作数和存储结果有关,而不是实际计算。通过使用SSE指令进行加法和乘法(在x86上),您可以在它们之间获得更多的差异。

答案 1 :(得分:0)

使用现代CPU,倍数与添加的速度大致相同。

在英特尔的Sandy Bridge上,使用SSE的乘法需要加上4/3的时间。但考虑到ILP,可以同时处理多个指令,它们实际上需要相同的时间。在同一个CPU上,使用ILP,单精度分区需要7-14倍的时间!

来源:Agner Fog's instruction tables。在他的网站上有很多非常好的读物。