2015-02-05 116 views
1

前一段时间我听说有些编译器使用SSE2扩展来实现x86_64架构的浮点运算,所以我使用这个简单的代码来确定它们之间的性能差异。x86和x86_64中的float和double之间的性能差异

我通过BIOS禁用了Intel SpeedStep技术,系统负载大致相当于我的测试。我在OpenSuSE 64位上使用GCC 4.8。

我正在写一个程序有很多FPU操作,我想知道这个测试是否有效?

并了解每个架构下关于floatdouble之间性能差异的任何信息。

代码:

#include <iostream> 
#include <sys/time.h>     
#include <vector> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    timeval t1, t2; 
    double elapsedTime; 

    double TotalTime = 0; 


    for(int j=0 ; j < 100 ; j++) 
    { 
     // start timer 
     gettimeofday(&t1, NULL); 

     vector<float> RealVec; 
     float temp; 

     for (int i = 0; i < 1000000; i++) 
     { 
      temp = static_cast <float> (rand())/(static_cast <float> (RAND_MAX)); 
      RealVec.push_back(temp); 
     } 

     for (int i = 0; i < 1000000; i++) 
      { 
       RealVec[i] = (RealVec[i]*2-435.345345)/15.75; 
      } 

     // stop timer 
     gettimeofday(&t2, NULL); 
     elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;  // sec to ms 
     elapsedTime += (t2.tv_usec - t1.tv_usec)/1000.0; // us to ms 

     TotalTime = TotalTime + elapsedTime; 
    } 


    cout << TotalTime/100 << " ms.\n"; 

    return 0; 
} 

和结果:

32位双

157.781毫秒。 151.994 ms。 152.244 ms。

32 Bit Float

149.896 ms。 148.489 ms。 161.086 ms。

64位双倍

110.125毫秒。 111.612 ms。 113.818毫秒。

64位浮点数

110.393 ms。 106.778 ms。 107.833 ms。

+0

LOL @“flouting point orations”.... – twalberg 2015-02-05 18:32:56

回答

0

你真的没有太多的测量;也许只是编译器 的优化程度。为了使测量有效,您确实需要对结果进行一些操作,或者编译器可以优化所有或测试的主要部分,例如 。我想要做的是1)初始化 的向量,2)获得开始时间(可能使用clock,因为 只考虑CPU时间),3)执行第二个循环a 100(或 更多...足以持续几秒钟,至少)时间,4)获得结束时间,最后,5)输出向量中元素的总和。

关于您可能会发现的差异:独立于浮点处理器的 ,64位机器具有更多通用寄存器 供编译器使用。这可能会产生巨大的影响。 除非您查看生成的汇编程序,否则您无法知道。

0

不是真的有效。你基本上正在测试随机数发生器的性能。另外,你并没有试图强制执行SSE2 SIMD操作,所以你不能真正声称这与任何与SSE相关的东西相比。

+0

我也经历过两次向量,我认为这是不正确的,我知道这不是一种做任何事情的好方法,但我想知道是什么原因性能差异 – 2015-02-05 18:33:46

+1

然后深入挖掘;封装你想比较的个人事物;使用'perf'等工具;阅读SSE内部函数! – 2015-02-05 18:48:23

0

有效的是什么意思?

使用您的实际代码来衡量实际使用情况。

一些人工测试套件可能不会帮助您评估性能特征。

您可以使用typedef,然后通过轻触开关来更改实际的基础类型。

相关问题