SEGGER的运行时库和浮点库中提供了各种除法实现,然而,哪种算法是最好的(在代码大小、执行速度或能效方面),很大程度上取决于目标指令集架构(ISA)和ISA在芯片中实现的方式。
基准框架
SEGGER有内部基准来确定emRun的性能,这些基准测试在Embedded Studio的模拟器上运行,并测量32位和64位除法算法的性能,使用分散输入来确保性能平摊。接下来将重点介绍在没有FPU的32位处理器上执行的64位浮点除法。
emRun为除法提供了多种配置,从clockwork的逐位算法到高速的乘倒数算法。
clockwork除法
如果没有硬件乘法器和硬件除法器,只能选择逐位除法,使用SEGGER Embedded Studio模拟器和emRun基准测试,性能如下:
使用M指令扩展
RISC-V M扩展提供32位乘法和除法指令,使用这些指令可以有效地实现64位除法。emRun根据内核配置方式提供了多种实现。
强制使用DIVU(无符号除法)和REMU(无符号余数)指令。53位除法(用于除双精度有效数)的一种实现是使用简单算法,每一步提供10或11位商,以及最后的舍入位。以这种方式使用DIVU和REMU会产生以下性能,具体取决于硬件除法器的实现:
通常,DIVU和REMU是顺序执行的。在没有融合的情况下,计算一个商和一个余数要花费两倍的时间,因为要进行两次除法,浪费了时间和精力。
与使用REMU指令计算余数相比,使用乘法器并手动计算余数要快得多。使用这种技术可以提高性能,但代价是每个除法步骤增加一条指令,所以总共有五条指令:
如果性能很重要,显然可以使用快速乘法器来计算除法后的余数。
使用Zmmul扩展
RISC-V Zmmul扩展只引入乘法指令。在Zmmul被批准之前,有一些设备以仅乘法器的配置交付。emRun为只有乘法器的内核提供快速除法,并且它的性能非常好:
整数除法
emRun也为整数运算提供了优化,但它还可以利用P扩展实现更快的乘法和除法以及更紧凑的代码。B扩展的多个变体以相同的方式部署,同样交付更快、更紧凑的代码。
emRun算法实现有通用C语言版本,并提供针对Arm和RISC-V架构优化的汇编语言版本。
对于RISC-V内核,除法不像乘法那样经常使用。由于除法可以使用乘倒数有效地完成,除非除法的速度很重要并且除法非常快(或者额外的硬件成本无关紧要),否则无需使用硬件除法器。
emRun是一个完整的C运行时库,可用于任何工具链。它将基于GCC/ LLVM的工具链转换为专业的开发选择。emRun已集成到Embedded Studio环境中,帮助用户生成高效、可靠的代码。
END
来源:麦克泰技术
版权归原作者所有,如有侵权,请联系删除。
▍推荐阅读