2017-01-23 34 views
0

由于学术原因,我正在AArch64上使用sqrt函数的性能。 代码为单精度浮点数sqrtf功能:AArch64上sqrt函数的性能

fsqrt s0, s0 
ret 

代码双精度浮点数开方功能:

fsqrt d0, d0 
ret 

我指的是理论上的潜伏期为FSQRT从这里: http://infocenter.arm.com/help/topic/com.arm.doc.uan0015b/Cortex_A57_Software_Optimization_Guide_external.pdf

latencies of FSQRT

Single sqrt比double好看2倍。

但是,尽管分析我得到这些数字:

326 ms sqrt 
82 ms sqrtf 

我服用时间相同数目的周期。 从这些数字来看,sqrtf好像是4倍。

为什么我找不到合适的理由? 无法找到关于互联网上的这条指令的实际解释。

这方面的一些信息或方向将是非常有用的。

+0

记得要改变指令的对齐方式并再次测量,根据需要重复。如果您试图衡量指令的单个实例,那么您将不太可能成功。 –

+0

@old_timer我在循环中测量一百万次函数调用的性能。这不应该是问题。 –

回答

1

如果您查看Cortex-A57优化指南中FSQRT指令表格条目的附注,它表示“FP分频和平方根操作使用迭代算法执行”。

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

所以如果一个特定的单精度计算需要7个周期,但是双精度计算需要28个周期,那么你有4倍的差异。