【问题标题】:Does the following ARM instruction set generate stalls?以下 ARM 指令集是否会产生停顿?
【发布时间】:2010-12-06 08:54:23
【问题描述】:

对 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 帐户的情况下在家发帖...

【问题讨论】:

  • 您是否担心 s1s5 的乘法直到上一次添加到 s0 完成后才能开始?
  • 正确,或 s2,s6 与 s0 累加或...

标签: performance assembly arm


【解决方案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 指令来进一步改进。

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

【讨论】:

  • 因为我使用的 ARM 编译器很臭,而且这个功能在我运行的应用程序中性能排名前三,正如分析报告所报告的那样。为了确定,我也会进一步研究这一点,但看起来这正是 mla/fmac 旨在做的事情,并且拖延它是非常蹩脚的。然后我会考虑将加法步骤从乘法中分离出来,并使用单独的寄存器进行累加。稍加注意,我可能会进一步减少它。仍然需要研究向量化这一点 - 因为 ARM 编译器甚至不会尝试这样做。
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多