sqrt 函数在 AArch64 上的性能

Performance of sqrt function on AArch64

出于学术原因,我在 AArch64 上测试 sqrt 函数的性能。 单浮点数 sqrtf 函数的代码:

fsqrt s0, s0 
ret

双浮点数 sqrt 函数的代码:

fsqrt d0, d0 
ret

我指的是此处 FSQRT 的理论延迟: http://infocenter.arm.com/help/topic/com.arm.doc.uan0015b/Cortex_A57_Software_Optimization_Guide_external.pdf

单 sqrt 似乎比双 sqrt 好 2 倍。

但是,在分析时我得到了这些数字:

326 ms  sqrt
 82 ms  sqrtf

我正在花费相同数量的周期。 从这些数字来看,sqrtf 似乎好 4 倍。

我找不到合适的理由? 无法在互联网上找到关于此说明的正确解释。

有关此的一些信息或指导将非常有用。

如果您查看 Cortex-A57 优化指南中 FSQRT 指令的 table 条目所附的注释,它表示 "FP divide and square root operations are performed using an iterative algorithm".

这意味着根据指令的输入,延迟会有所不同。这就是 table 中“7-17”和“7-32”延迟数字的含义。根据输入的不同,单精度 FSQRT 可能需要 7 到 17 个周期才能完成,而双精度变体可能需要 7 到 32 个周期。

因此,如果一个特定的单精度计算恰好需要 7 个周期,而双精度计算需要 28 个周期,那么你就有 4 倍的差异。