以下ARM指令集是否会生成停顿?

时间:2010-12-05 20:02:41

标签: performance assembly arm

对ARM11MP Vfpu进行编程,我查看了文档,并担心在进行4分量点积时(作为4x4矩阵乘法的一部分),以下内容会严重停滞


  fmuls   s0, s0, s4
  fmacs   s0, s1, s5
  fmacs   s0, s2, s6
  fmacs   s0, s3, s7

累积步骤是否会在此处产生停顿?如果是这样,我将不得不真正改变一些东西,因为我只能使用32个单个寄存器,然后按原样使用9个。此外,我可以设置向量寄存器在1条指令中执行此操作,但我想知道3个指令周期是否值得,因为除非我溢出到ARM寄存器,否则我必须立即取消它以便存储回存储器。在这里没有真正的SO帐户从家里发帖......

1 个答案:

答案 0 :(得分:1)

我对ARM并不熟悉,所以你应该把它当作一粒盐。这个答案只是基于我手机上搜索文档的大约20分钟。可能会有一些我遗漏的东西,所以这可能不正确。

无论如何,我相信是的,这会导致管道停滞。 VFP协处理器具有8级流水线,但由于“转发”(每条指令取决于前一条指令的结果),每条指令的停顿周期数应减少到7。尽管如此,根据您的4条指令,您将被停顿约28个周期,这不是很好。这也没有考虑加载寄存器所需的时间,这可能会加剧问题。

您可以通过将“fld指令”与fmacs指令交错来提高性能。

有关详细信息,请查看以下内容:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACBBDCE.html

“fld”指令的结果应在4个周期内可用,这意味着如果您可以执行以下操作:

fld s0
fld s4
fld s1
fld s5
fmuls s0, s0, s4
fld s2
fld s6
fld s3
fld s7
fmacs s0, s1, s5
famcs s0, s2, s6
fmacs s0, s3, s7

然后你可以将停滞周期的总数减少到17个。

假设您在循环中执行此操作,您可以通过尝试在当前迭代执行时(即循环展开)尝试“下一个”循环迭代来进一步减少停顿。此外,根据数据的存储方式,一旦进行循环展开,您可以使用fldm而不是fld指令进一步改进。

在任何情况下,手动优化管道行为都很困难。你不能让编译器为你做指令调度吗?