鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

关键路径尽量用整数运算代替浮点运算

【说明】 在目前的主流CPU和DSP下,浮点运算相对于整数运算而言,开销增加数倍;关键路径上,通过优化计算过程,采用整数计算替代浮点数计算能够优化性能表现。

另外,由于整数的乘法和除法是单机器指令,而浮点运算不论哪种方式都包含多个指令(如下),因此,避免采用浮点数乘除法计算对性能提升的效果也非常显著:

  • 软浮点:编译器把浮点运算转换成函数调用。
  • 硬浮点:编译器把代码编译成硬件浮点协处理器能识别的指令,在执行时,Arm核直接将它转给协处理器执行。效率相对高;

【注意事项】 采用整数计算代替浮点数计算,需要以满足精度条件作为前提;

案例】

优化前
uint32_t Func(float input)
{
    float tbl[6] = { 5, 10, 15, 20, 25, 12.5 };

    for (uint32_t i = 0; i < sizeof(tbl) / sizeof(tbl[0]); i++) {
        if (((tbl[i] - 0.001) < input) && (input < (tbl[i] + 0.001))) {
            return i;
        }
    }
    return UINT32_MAX;
}
优化后
uint32_t Func(uint32_t input)
{
    uint32_t tbl[6] = { 50, 100, 150, 200, 250, 125 };

    for (uint32_t i = 0; i < sizeof(tbl) / sizeof(tbl[0]); i++) {
        if (tbl[i] == input) {
            return i;
        }
    }
    return UINT32_MAX;
}

说明:结合上下文语境,将该函数的入参数据类型从float类型修改为int类型(数据放大10倍),进行数据比较,可以避免浮点数运算与比较,提高性能。