2010-12-05 23 views
0

编程ARM11MP VFPU,我看过了的文档,并很担心,做了4组分点产品时(如4x4矩阵乘法的一部分)以下ARM指令集是否会生成暂停?


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

是否accumuate下面将严重停滞在这里产生摊位?如果是这样,我将不得不真的改变一些东西,因为我只有32个单独的寄存器可以工作,然后就是9个。另外,我可以在1条指令中设置向量寄存器来完成此操作,但是我想知道3个指令周期是否值得,因为除非我溢出到ARM寄存器,否则我几乎不得不立即将其存储回存储器。在这里没有我真正的SO帐户在这里发布...

+1

你担心s1`和`s5`的乘法不能开始,直到先前加到`s0`完成为止? – Gabe 2010-12-05 20:10:41

+0

更正,或s2,s6与s0 accumulate或... – 2010-12-05 23:05:26

回答

1

我对ARM没有任何熟悉,所以你应该带上一粒盐。这个答案只是基于我的手机上搜索文件大约20分钟。可能有些事情我错过了,所以这可能不正确。

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

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

检查出更多的信息如下:

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 

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

的“FLD”指令应在4个周期内可用,这意味着如果你可以做类似的结果

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

假设您正在循环执行此操作,如果在当前迭代正在执行时尝试开始“下一个”循环迭代的工作,则可能进一步减少停滞。循环展开)。另外,根据数据的存储方式,一旦你进行循环展开,你可以通过使用fldm而不是fld指令来改进更多的东西。

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