x86和x86_64中浮点和双精度之间的性能差异
Performance difference between float and double in x86 and x86_64
不久前,我听说一些编译器使用SSE2扩展来进行x86_64体系结构的浮点运算,所以我使用这段简单的代码来确定它们之间的性能差异。
我通过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毫秒。152.244毫秒
32位浮点
149.896毫秒。148.489毫秒。161.086毫秒
64位双
110.125毫秒。111.612毫秒。113.818毫秒
64位浮点
110.393毫秒。106.78ms。107.833毫秒
你真的没有测量多少;也许只是编译器的程度优化。为了使测量有效必须对结果做些什么,否则编译器可以优化全部或主要部分的测试。我要做的是初始化向量,2)得到开始时间(可能使用clock
,因为只考虑CPU时间),3)执行第二个循环a 100(或更多至少持续几秒钟)次,4)获得结束时间,最后,5)输出矢量中元素的总和。
关于差异,您可能会发现:独立于浮点处理器,64位机器有更多的通用寄存器供编译器使用。这可能会产生巨大的影响。除非您查看生成的汇编程序,否则您无法知道。
不是真正有效的。您基本上是在测试随机数生成器的性能。
此外,您并没有试图强制执行SSE2 SIMD操作,所以您不能真正声称这与SSE相关。
在什么意义上有效?
使用实际代码测量实际使用情况。
一些人工测试套件可能无法帮助您评估性能特征。
您可以使用typedef
,然后通过轻按开关来更改实际的底层类型。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 为x86而非x64编译时出错
- 在类中使用随机生成器时出现性能问题
- C++如何仅使用MOV在x86上实现发布和获取
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- x86 中不同数学函数的性能
- x86和x86_64中浮点和双精度之间的性能差异
- x86 放松订购性能
- x64 性能与 x86 的比较