Performance 以下ARM指令集是否生成暂停?

Performance 以下ARM指令集是否生成暂停?,performance,assembly,arm,Performance,Assembly,Arm,对ARM11MP Vfpu进行编程时,我查阅了文档,担心在进行4分量点积(作为4x4矩阵乘法的一部分)时,以下内容会严重停滞 accumuate步骤是否会在此处产生停顿?如果是这样的话,我将不得不真正改变周围的东西,因为我只有32个单一的寄存器工作,然后采取9,因为它是。另外,我可以在1条指令中设置向量寄存器来实现这一点,但我想知道这3条指令周期是否值得,因为除非我溢出到ARM寄存器,否则我几乎必须立即取消设置以存储回内存。在没有我真实的SO账户的情况下在家发帖…我对ARM一点也不熟悉,所以你应

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


accumuate步骤是否会在此处产生停顿?如果是这样的话,我将不得不真正改变周围的东西,因为我只有32个单一的寄存器工作,然后采取9,因为它是。另外,我可以在1条指令中设置向量寄存器来实现这一点,但我想知道这3条指令周期是否值得,因为除非我溢出到ARM寄存器,否则我几乎必须立即取消设置以存储回内存。在没有我真实的SO账户的情况下在家发帖…

我对ARM一点也不熟悉,所以你应该对此持保留态度。这个答案是基于大约20分钟在我的手机上搜索文档得出的。我可能遗漏了一些东西,所以这可能不正确

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

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

有关更多信息,请查看以下内容:

“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指令来进一步改进


在任何情况下,手动优化管道行为都是困难的。有什么原因不能让编译器为您执行指令调度吗?

您是否担心在上一次添加到
s0
完成之前,
s1
s5
的乘法无法开始?正确,或者s2,s6和s0累加,或者…因为我的ARM编译器很糟糕,这个函数在我运行的应用程序中是前三名,正如评测报告的那样。我也将进一步研究这一点,只是为了确定,但似乎这正是mla/fmac设计要做的事情,而在这件事上拖延是相当蹩脚的。我会考虑从乘法中打破加法步骤,并使用单独登记来累加。如果小心一点,我可能会进一步减少。仍然需要对此进行研究,因为ARM编译器甚至不会尝试这样做。
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