在ARM NEON文档中,它说:
[...]某些指令可能必须等到将值写回寄存器文件。
我没有遇到一个列表,它定义了可以使用转发结果的指令对以及必须等待回写的指令对。
有没有人知道列出这些对的表格或文档?
答案 0 :(得分:1)
是否有人知道列出这些对的表格或文档?
这些对超过9000 并且它们都不能列出
例如:
VADD.F32 q0,q0,q1
VMUL.F32 q3,q0,q2
第一条指令在第4个周期写回结果,而第二条指令要求它(q0)作为第2个周期的源,所以当源没有准备好时,它们之间存在一个停顿(或管道“漏洞”)这两条指示。
要计算此档位,您可以使用以下在线工具:
http://pulsar.webshaker.net/ccc/result.php?lng=us
答案 1 :(得分:1)
从广义上讲,你会合理地期望前进,前进。 vmul.f32转发到vadd.f32等。
我不相信确切的转发路径是以您正在寻找的方式精确记录的。无论如何,我还没有找到它们。如果您确实找到了它们,请务必告诉我们。当然,确定任何给定的指令对是否发生转发并不太难,但这不是一般解决方案。遗憾。
答案 2 :(得分:1)
整数乘法累加。
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
末尾的注释。