gpt4 book ai didi

c++ - 使用和不使用 opt.flag -O3 (C++/C) 的浮点除法速度不同的原因

转载 作者:太空狗 更新时间:2023-10-29 23:31:11 26 4
gpt4 key购买 nike

我试图测量 C++ 中单精度除法与 double 除法的速度差异

这是我编写的简单代码。

#include <iostream>
#include <time.h>

int main(int argc, char *argv[])
{

float f_x = 45672.0;
float f_y = 67783.0;
double d_x = 45672.0;
double d_y = 67783.0;

float f_answer;
double d_answer;

clock_t start,stop;
int N = 200000000 //2*10^8


start = clock();
for (int i = 0; i < N; ++i)
{
f_answer = f_x/f_y;
}
stop = clock();
std::cout<<"Single Precision:"<< (stop-start)/(double)CLOCKS_PER_SEC<<" "<<f_answer <<std::endl;


start = clock();
for (int i = 0; i < N; ++i)
{
d_answer = d_x/d_y;
}
stop = clock();
std::cout<<"Double precision:" <<(stop-start)/(double)CLOCKS_PER_SEC<<" "<< d_answer<<std::endl;

return 0;
}

当我将未经优化的代码编译为 g++ test.cpp 时,我得到了以下输出

Desktop: ./a.out
Single precision:8.06 0.673797
Double precision:12.68 0.673797

但是如果我用 g++ -O3 test.cpp 编译它然后我得到

Desktop: ./a.out
Single precision:0 0.673797
Double precision:0 0.673797

我是如何获得如此显着的性能提升的?由于 clock() 函数的低分辨率,第二种情况中显示的时间为 0。编译器是否以某种方式检测到每个 for 循环迭代都独立于之前的迭代?

最佳答案

可能是因为编译器将循环优化为单次迭代。它甚至可能在编译时完成除法。

检查可执行文件的汇编程序以确保(使用例如 objdump)。

关于c++ - 使用和不使用 opt.flag -O3 (C++/C) 的浮点除法速度不同的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com