ARM frsqrts指令在牛顿迭代中是否需配合额外fmul指令?
ARM frsqrts指令的正确用法与逆平方根牛顿迭代的配合
你对frsqrts指令的功能理解完全正确:该指令会将两个源SIMD/FP寄存器中对应浮点值相乘,用3.0减去该乘积后再除以2.0,结果写入目标寄存器,对应公式就是(3 - x*y)/2。
逆平方根的牛顿迭代公式确实是yₙ₊₁ = yₙ*(3 - x*yₙ²)/2,单独的frsqrts指令只完成了其中(3 - x*yₙ²)/2这一部分,但这正是它的设计目的——专门将牛顿迭代中这个固定计算段做成硬件指令,以此提升计算效率(硬件指令的执行周期远短于通用浮点指令的组合)。
你给出的结合指令完成完整迭代的代码是完全正确的:
fmov d0, #2.0 // 目标:计算1/sqrt(2) fmov d1, #0.5 // 初始猜测值 fmul d2, d1, d1 // 计算猜测值的平方 yₙ² frsqrts d3, d0, d2 // 计算(3 - x*yₙ²)/2 fmul d4, d1, d3 // 完成牛顿迭代:yₙ₊₁ = yₙ*(3 - x*yₙ²)/2
综上,你并没有误用frsqrts指令,它本身就是为配合乘法指令完成逆平方根牛顿迭代而设计的专用指令,单独使用确实只完成部分计算,但这是合理的硬件设计取舍。
内容的提问来源于stack exchange,提问作者user14717
相关产品推荐
相关产品推荐

