x86和x86_64中的float和double之间的性能差异
前一段时间我听说有些编译器使用SSE2扩展来实现x86_64架构的浮点运算,所以我使用这个简单的代码来确定它们之间的性能差异。x86和x86_64中的float和double之间的性能差异
我通过BIOS禁用了Intel SpeedStep技术,系统负载大致相当于我的测试。我在OpenSuSE 64位上使用GCC 4.8。
我正在写一个程序有很多FPU操作,我想知道这个测试是否有效?
并了解每个架构下关于float
和double
之间性能差异的任何信息。
代码:
#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。
你真的没有太多的测量;也许只是编译器 的优化程度。为了使测量有效,您确实需要对结果进行一些操作,或者编译器可以优化所有或测试的主要部分,例如 。我想要做的是1)初始化 的向量,2)获得开始时间(可能使用clock
,因为 只考虑CPU时间),3)执行第二个循环a 100(或 更多...足以持续几秒钟,至少)时间,4)获得结束时间,最后,5)输出向量中元素的总和。
关于您可能会发现的差异:独立于浮点处理器的 ,64位机器具有更多通用寄存器 供编译器使用。这可能会产生巨大的影响。 除非您查看生成的汇编程序,否则您无法知道。
不是真的有效。你基本上正在测试随机数发生器的性能。另外,你并没有试图强制执行SSE2 SIMD操作,所以你不能真正声称这与任何与SSE相关的东西相比。
我也经历过两次向量,我认为这是不正确的,我知道这不是一种做任何事情的好方法,但我想知道是什么原因性能差异 – 2015-02-05 18:33:46
然后深入挖掘;封装你想比较的个人事物;使用'perf'等工具;阅读SSE内部函数! – 2015-02-05 18:48:23
有效的是什么意思?
使用您的实际代码来衡量实际使用情况。
一些人工测试套件可能不会帮助您评估性能特征。
您可以使用typedef
,然后通过轻触开关来更改实际的基础类型。
LOL @“flouting point orations”.... – twalberg 2015-02-05 18:32:56