在 ARM NEON 文档中,它说:
[...] 一些指令对可能必须等到值被写回寄存器文件。
我没有遇到定义可以使用转发结果的指令对和必须等待回写的指令对的列表。
有谁知道列出这些对的表格或文档?
有谁知道列出这些对的表格或文档?
这些对超过 9000对,它们都无法列出。
例如:
VADD.F32 q0,q0,q1
VMUL.F32 q3,q0,q2
第一条指令在第 4 个周期写回结果,而第二条指令需要它(q0)作为第 2 个周期的源,因此源尚未准备好,这两条指令之间存在停顿(或流水线“漏洞”) .
要计算这个档位,您可以使用以下在线工具:
http ://pulsar.webshaker.net/ccc/result.php?lng=us
从广义上讲,您合理期望转发的内容,转发。vmul.f32 转发到 vadd.f32 等。
我不相信确切的转发路径以您正在寻找的方式精确记录在任何地方。反正我还没有找到。如果您确实找到了它们,请务必告诉我们在哪里。当然,对于任何给定的指令对确定是否发生转发并不难,但这不是一个通用的解决方案。对不起。
整数乘法累加。
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 的组合
Don't assume that floating point multiply accumulates work in the same way. I haven't used floating point NEON instructions for anything performance critical so I can't offer any experience here, but make sure you read and understand the note at the end of http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k/BCGDCECC.html