迴圈的軟流水原理和例項展示

2021-07-09 11:57:55 字數 1418 閱讀 8115

軟流水的原理: 

1.分解同一迴圈內的指令相關,把指令軟體方式重排, 實現指令的流水。

2. 重排後的指令,以抽取的不同次的迴圈**為主體進行新的迴圈。

3. 由於打亂了原來的指令的順序,比如store操作出現在了load操作之前(當然,這個load其實是下一次迴圈的load),需要在新的迴圈進入之前有裝入**來餵飽第一次迴圈的store,而在新迴圈結束時,最後一次迴圈的load指令獲得的資料還沒有store,所以還需要額外的排空**。

軟體流水目前沒有很常見的標準的做法,現提供乙個比較簡單和容易理解的方式來手工實現軟流水。

例子是龍芯設計師胡偉武老師的《計算機體系結構》一書的習題,**如下;

我的思路和方法,不想碼字了,,,寫在了紙上,有點亂,字也差,希望不影響閱讀。

1.畫結構圖:根據指令的依賴關係和**順序,畫程式(指令)結構圖,同一層的指令可以合併來處理,他們內部的順序無所謂。這樣可以簡化接下來的過程。

2.迴圈展開:將舊迴圈展開幾次,橫著寫,具體需要展開的次數,和裝入**的load指令數有關,要確保裝入**的load的運算元可以在新的迴圈(豎著看,畫圈的地方)結束前被store完。 根據我們的這個題目,首先新迴圈(畫圈的地方)需要展開3次,為了能把新迴圈展開3次,我們的舊迴圈(橫著看)需要展開6次。

3.確定新迴圈主體:豎著的畫圈的指令,從上往下的順序就是新迴圈的迴圈主體,新迴圈裡的指令的位址下標,是接下來要確定的,也是最關鍵的一步。指令的下標多少,需要選乙個參考點,這裡選取排空**第一行(也就是舊迴圈的第四次迴圈)為基點0,然後根據這個往上倒推,可以確定新迴圈的第乙個store指令的位址下標為-24.然後再根據這個基點,確定新迴圈的其他指令的位址下標,最後加上原來的迴圈開銷指令,就完成了新迴圈的主體。

4.裝入**:圓圈的左上角的指令都是裝入**,按照從上往下的順序寫下來,位址下標,根據舊迴圈次數一次變化,在最後一步,更新位址值時,要確保新的位址值在進入新迴圈時和store指向的位址對應(比如新迴圈的第乙個store存的是第乙個0(r1)的load值,而當前store -24(r1),所以r1的值在裝入**最後一步,需要加24。或者換種理解:因為前面裝入**的過程是舊迴圈的3次展開,所以最後r1的下標遞增時應該是8*3=24了)。

5.排空**:圓圈的右下角就是排空**。從上往下順序寫下來。因為新迴圈展開了3次,所以最後的排空**開始時的store的位址下標是-24,這樣剛好把在新迴圈裡面load的值的位址對應起來了,存的資料也就不會錯了。(可以看出乙個規律,新迴圈主體的第乙個store的下標和排空指令的第乙個指令下標其實是一樣的。)

經過以上步驟,就可以實現乙個正確的軟流水了。是不是感覺軟流水也沒那麼複雜了呢?

vue利用for迴圈切換表單編輯和展示的功能

結果圖 迴圈出來的表單可以在edit和view間切換,如果需要單個表單儲存就在每個sure按鈕加事件 html id name body edit idname body sure js test111 false,json111 需要注意正常從後台拉取的json資料不應該包含foo欄位,這裡需要在...

資料庫原理 關係代數的例項和練習

公式編輯器裡沒有連線符號,所以暫時使用無窮大符號代替連線符 第4題題目修改為及格的 第四五題我都覺得選第二種效率更高,因為我覺得直接把表與表連線有點太龐大了,先在各個表中篩選出需要的屬性再連線效率會高一點,減少工作量。1 查詢男同學,列出學號,姓名,系 2 查詢男同學的選課情況,列出學號,課程號,成...

分治法和遞迴的原理及其應用例項 歸併排序

1 遞迴的描述 為了解決乙個給定的問題,演算法一次或多次遞迴的呼叫其自身以解決緊密相關的若干子問題。2 分治法思想 將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來建立原問題的解。分治模式在每層遞迴時都有三個步驟 3 歸併排序例項 3.1 演算法思路...