gpt4 book ai didi

performance - 为什么C++中 float 除法比整数除法快?

转载 作者:行者123 更新时间:2023-12-02 21:51:48 31 4
gpt4 key购买 nike

考虑以下 C++ 代码片段:(Visual Studio 2015)

第一 block

const int size = 500000000;
int sum =0;
int *num1 = new int[size];//initialized between 1-250
int *num2 = new int[size];//initialized between 1-250
for (int i = 0; i < size; i++)
{
sum +=(num1[i] / num2[i]);
}

第二 block

const int size = 500000000;
int sum =0;
float *num1 = new float [size]; //initialized between 1-250
float *num2 = new float [size]; //initialized between 1-250
for (int i = 0; i < size; i++)
{
sum +=(num1[i] / num2[i]);
}

我预计第一个 block 运行得更快,因为它是整数运算。但第二个 block 要快得多,尽管它是浮点运算。这是我的基准测试结果:分配:

Type    Time
uint8 879.5ms
uint16 885.284ms
int 982.195ms
float 654.654ms

浮点乘法比整数乘法更快。这是我的基准测试结果:

乘法:

Type    Time
uint8 166.339ms
uint16 524.045ms
int 432.041ms
float 402.109ms

我的系统规范:CPU core i7-7700,Ram 64GB,Visual studio 2015

最佳答案

由于floating point number representation中的指数部分, float 除法比整数除法更快。 。要将一个指数除以另一个指数,需要使用简单的减法。

int32_t 除法需要对 31 位数字进行快速除法,而 float 除法需要对 24 位尾数进行快速除法(尾数中的前导是隐含的,不存储) float )和更快的 8 位指数减法。

查看excellent detailed explanation how division is performed in CPU .

值得一提的是,SSE和AVX指令仅提供浮点除法,但不提供整数除法。 SSE 指令/内在函数可用于轻松地将 float 计算速度提高四倍。

如果你查看Agner Fog's instruction tables例如,对于 Skylake,32 位整数除法的延迟为 26 个 CPU 周期,而 SSE 标量浮点除法的延迟为 11 个 CPU 周期(令人惊讶的是,除以 4 个打包浮点需要相同的时间) .

另请注意,在 C 和 C++ 中,对于短于 int 的数字没有除法,因此 uint8_tuint16_t 首先提升为int 然后发生 int 的除法。 uint8_t 除法看起来比 int 更快,因为它在转换为 int 时设置的位数更少,这使得除法更快地完成。

关于performance - 为什么C++中 float 除法比整数除法快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55832817/

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