2008年6月10日 星期二

實現Blocking send/receive handshaking protocol


多核心訊號傳送必須根據Blocking send/receive handshaking protocol 來溝通。下圖為Blocking send/receive handshaking protocol的表示法。

當P1處理器執行到send指令時,會傳送send訊息給P2,等待P2回傳準備接收資料的訊息,P1接收到P2訊息後,會將資料傳送給P2。

下圖為傳送與接收指令的流程圖,當執行到send指令時,會送出Request to send 的訊息,並判斷Ready to receive是否為1,當Ready to receive=0,處理器會執行nop(空轉)的指令,並且持續送出Request to send的訊息;當Ready to receive=1,表示可以開始傳送資料,傳送結束後繼續執行下一個指令。

當執行到receive 指令時,會送出Ready to receive 的訊息,並判斷Request to send 是否為1,當Request to send=0,處理器會執行nop(空轉)的指令,並且持續送出Ready to receive的訊息;當Request to send=1,表示可以開始傳送資料,傳送結束後繼續執行下一個指令。


因為MIPS指令內沒有send 與receive 指令,我們必須自訂指令,下面為自訂指令的相關資訊:
receive $5
receive動作為送出receive=1,當send=1時,會將接收到的訊號放置在regs[rd]內。

send $5
send 動作為送出send=1,當receive=1時,會將regs[rd]放置在senddata內,並傳送出去。
下面為P1 send指令的程式
下面為P2 receive指令

測試單核心與雙核心執行效能
測試的流程圖如下:

首先,撰寫MIPS組合語言程式,配合PCSpim軟體,測試所撰寫的MIPS組合語言程式是否正確,正確無誤後,將PCSpim.log檔內的相關資料(rom與sram),透過使用C語言所撰寫的程式擷取並將機器碼轉換成二進制。接著將機器碼放置在似MIPS架構的記憶體內,使用SynaptiCAD模擬測試訊號是否正確。最後比較單核心與雙核心的效能。

下圖為單核心的方塊圖:
下圖為雙核心的方塊圖:
下圖為所要測試的訊號處理:
所做的訊號處理為e =a + b ;f = c + d ; g = e + f ,對單核心處理器來說只要直接一個一個往下執行即可;若以雙核心來執行,因為e =a + b ;f = c + d ;這兩個訊號處理並沒有相關性,故可以將這兩個訊號處理分別放在兩個核心內同時執行,  g = e + f 則必須透過兩顆核心互相溝通才可以正確執行。

下圖為使用MIPS組合語言所撰寫的程式,使用單核心執行,與C語言程式的訊號處理相同。


指令1到4為執行e = a + b 的訊號處理,指令5到8為執行f = c + d 的訊號處理,指令9跟10為執行g = e + f 的訊號處理,最後再跳回主程式。

下圖為使用PCSpim所執行出來的結果:
下圖為使用SynaptiCAD所執行出來的結果與波型圖:

下圖為使用MIPS組合語言所撰寫的程式,使用雙核心執行。
下圖為使用SynaptiCAD所執行出來的結果與波型圖:


從波形圖可以看出,當send1=1時,就是P1執行到send指令,送出訊息要傳送資料,當receive2=1時,就是P2執行到receive指令,並偵側到send1=1,固傳送receive2=1的訊號,告知P1可以傳送資料,傳送資料與接收資料完成後,會將send1 與 receive2 設為0 。

單核心處理器執行所有指令必須用到11個指令,執行時間為3.05us;雙核心處理器P1執行5個指令,P2執行8個指令,故需要8個指令才可以完成所有訊號處理,執行時間為2.35us,Speedup = 3.050000 / 2.350000 =1.2978。