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

Posted

技术标签:

【中文标题】ARM NEON:哪对指令必须等待回写?【英文标题】:ARM NEON: Which pairs of instructions have to wait for write back? 【发布时间】:2011-12-03 02:02:24 【问题描述】:

在 ARM NEON 文档中,它说:

[...] 某些指令对可能必须等到值被写回寄存器文件。

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

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

【问题讨论】:

【参考方案1】:

从广义上讲,您合理期望转发的内容,转发。 vmul.f32 转发到 vadd.f32 等。

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

【讨论】:

【参考方案2】:

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

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

VADD.F32 q0,q0,q1
VMUL.F32 q3,q0,q2

第一条指令在第 4 个周期写回结果,而第二条指令需要它 (q0) 作为第 2 个周期的源,因此源尚未准备好,但之间存在停顿(或管道“漏洞”)这两条指令。

要计算这个摊位,您可以使用以下在线工具:http://pulsar.webshaker.net/ccc/result.php?lng=us

【讨论】:

是的,我意识到all 对会有很大的空间,但我希望有一张普通对的桌子。例如,算术指令必须等到写回加载指令。 我不是在询问循环时间,因为它们在文档中列出。在 Cortex-A9 文档中,一些指令不必等到回写——它们可以更快地使用转发的结果。所以我在问哪些对可以使用回写后的结果,哪些可以使用转发的结果——这两个时间都在 A9 文档中给出,但不清楚哪个时间与给定的对一起使用。 我认为 OP 是在谈论 A9,而不是 A8。 A9 文档同时声明了“结果”和“写回”,并没有准确声明差异。【参考方案3】:

整数乘法累加。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/ch16s06s03.html 末尾的部分很有帮助:

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

不要假设浮点乘法以相同的方式累加工作。我没有使用浮点 NEON 指令来处理任何性能关键问题,因此我无法在此提供任何经验,但请确保您阅读并理解 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/BCGDCECC.html 末尾的注释

【讨论】:

以上是关于ARM NEON:哪对指令必须等待回写?的主要内容,如果未能解决你的问题,请参考以下文章

ARM NEON指令集总结

从 SSE 到 ARM Neon 的指令转换

ARM NEON 汇编器错误:“指令不能有条件”

利用ARM NEON intrinsic优化常用数学运算

如何使用 arm neon 指令右移值

如何在 Xcode 中启用 Neon 指令