Assembly ARM NEON:哪些指令对必须等待回写?

Assembly ARM NEON:哪些指令对必须等待回写?,assembly,arm,neon,Assembly,Arm,Neon,在ARM NEON文档中,它说: […]某些指令对可能需要等待,直到值被写回寄存器文件 我还没有看到一个列表定义可以使用转发结果的指令对和必须等待写回的指令对 有人知道列出这些对的表格或文档吗 有人知道列出这些对的表格或文档吗 这些对超过9000对,它们都无法列出。 例如: VADD.F32 q0,q0,q1 VMUL.F32 q3,q0,q2 第一条指令在第四个周期中写回结果,而第二条指令要求它(q0)在第二个周期中作为源,因此源尚未就绪,这两条指令之间存在暂停(或管道“漏洞”) 要计算此暂

在ARM NEON文档中,它说:

[…]某些指令对可能需要等待,直到值被写回寄存器文件

我还没有看到一个列表定义可以使用转发结果的指令对和必须等待写回的指令对

有人知道列出这些对的表格或文档吗

有人知道列出这些对的表格或文档吗

这些对超过9000对,它们都无法列出。
例如:

VADD.F32 q0,q0,q1
VMUL.F32 q3,q0,q2
第一条指令在第四个周期中写回结果,而第二条指令要求它(q0)在第二个周期中作为源,因此源尚未就绪,这两条指令之间存在暂停(或管道“漏洞”)

要计算此暂停,您可以使用以下在线工具:

从广义上讲,你合理预期的未来,未来。vmul.f32转发给vadd.f32等


我不相信确切的转发路径会以您所寻找的方式精确记录在任何地方。反正我还没找到。如果你找到了,一定要告诉我们在哪里。当然,对于任何给定的指令对,确定是否发生转发并不难,但这不是一个通用的解决方案。对不起。

整数乘法累加

本章末尾的部分很有帮助:

如果一个乘法累加跟在一个乘法或另一个乘法之后 乘法累加,取决于第一次运算的结果 指令,则如果两条指令之间的依赖关系为 同样的类型和大小,处理器使用一个特殊的乘法器 累加器转发。这种特殊的转发意味着倍增 指令可以背靠背发出,因为第一次 N5中的指令被转发到第二个指令的累加器 N4中的说明。如果说明的大小和类型不符合要求 匹配,则N3中需要Dd或Qd。这适用于组合 乘法累加指令VMLA、VMLS、VQDMLA和 VQDMLS以及乘法指令VMUL和VQDMUL


不要假设浮点乘法以同样的方式累加功。我没有将浮点霓虹灯指令用于任何性能关键的操作,因此我无法在此提供任何经验,但请确保您阅读并理解结尾处的注释

是的,我意识到所有对都有很大的空间,但我希望有一个包含普通对的表。例如,算术指令必须等待加载指令写回。我没有询问循环计时,因为它们在文档中列出。在Cortex-A9文档中,一些指令不必等到写回——它们可以更快地使用转发的结果。所以我在问哪些对可以使用回写后的结果,哪些对可以使用转发的结果——A9文档中给出了这两个计时,但不清楚给定对使用了哪一个计时。我认为OP是在谈论A9,而不是A8。A9文档既说明了“结果”和“写回”,并且差异并没有被准确地声明。