2010-12-05 38 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指令來改進更多的東西。

在任何情況下,手工優化管道行爲都很困難。是否有理由讓編譯器不能爲你做指令調度?