x86和x86_64中float和double之间的性能差异

时间:2015-02-05 18:04:50

标签: c++ gcc

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

我通过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 ms。 151.994毫秒 152.244毫秒。

32位Float

149.896 ms。 148.489毫秒 161.086毫秒。

64位双

110.125 ms。 111.612毫秒 113.818毫秒。

64 Bit Float

110.393 ms。 106.778毫秒 107.833毫秒。

3 个答案:

答案 0 :(得分:0)

不是真的有效。您基本上是在测试随机数生成器的性能。

此外,您并未尝试强制执行SSE2 SIMD操作,因此您无法真正声明这与SSE相关的任何内容。

答案 1 :(得分:0)

在什么意义上有效?

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

某些人工测试套件可能无法帮助您评估性能特征。

您可以使用typedef,然后只需轻按一下开关即可更改实际的基础类型。

答案 2 :(得分:0)

你真的不是很多;也许只是编译器的程度 优化。为了使测量有效,你真的 必须对结果做一些事情,否则编译器可以优化 所有,或测试的主要部分。我所做的是1)初始化 向量,2)得到开始时间(可能使用clock,因为那 只考虑CPU时间),3)执行第二个循环100(或 更多...足够持续几秒钟,至少几次,4)得到 结束时间,最后,5)输出向量中元素的总和。

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