2014-09-19 38 views
1

我試圖編寫一個排序算法來重新排序雙重問題處理器(單元SPU)的指令。獲得處理指令的雙重問題的一種方法不應該依賴於它之前的指令(另一個涉及單獨的管道,但我關注的是同一管道中的指令)。我知道這對於編譯器來說太多了,我在搜索時沒有找到我需要的東西。這可以在大多數情況下通過手工完成,但是排序算法應該確保最低的「序列計數」(相互關聯的數量或相關指令)。對雙重問題處理的相關指令進行排序/重新排序

我的問題是有這樣或類似的事情嗎?有沒有優化的方法?

簡單實例僞碼減半指令時間(輸入:i1, i2, i3):

v1 = i1^i2; - #single-issued 
v2 = v1 | i2; \ #v2,v3 dual-issued 
v3 = i1 & i3;/#v2,v3 dual-issued 
v4 = v3 & i2; - #single-issued 

可以寫爲:

v1 = i1^i2; \ #v1,v3 dual-issued 
v3 = i1 & i3;/#v1,v3 dual-issued 
v2 = v1 | i2; \ #v2,v4 dual-issued 
v4 = v3 & i2;/#v2,v4 dual-issued 

這裏是我創建的遞歸重新排列到指令的Python實現達到最低的「序列計數」。

reorder.py
http://pastebin.com/dt8eWy3H

樣品t8-1.h
http://pastebin.com/w0DYg8ff

回答

1

雖然我不能爲細胞具體講,代碼調度是絕對的東西,編譯器應該爲你做。

編譯器將重新排列指令,根據需要填充到NOPS中,並盡其所能爲您提供良好的代碼調度。通常,我會告訴您查看編譯器的「mtune」參數(它們允許您告訴編譯器到底是什麼處理器的樣子),但是由於您正在編寫Cell,因此它應該已經知道該怎麼做(但確實要檢查編譯器手冊)。

在GCC編譯器的SPU here一個簡短的一瞥顯示選項,如:

-mdual-nops=n 
    By default, GCC inserts nops to increase dual issue when 
    it expects it to increase performance. n can be a value from 
    0 to 10. A smaller n inserts fewer nops. 10 is the default, 0 
    is the same as -mno-dual-nops. Disabled with -Os. ` 

作爲一個程序員,這是你的工作,你的代碼提供足夠的「ILP」得到很好的安排。儘量避免分支,避免將關鍵路徑上的長時間延遲操作等,並且你應該沒問題。分析您的關鍵循環的objdump,以驗證代碼是否按照您的期望進行安排。編譯器非常聰明,但它可能需要一點點哄騙。

+0

空指令沒有問題,SPU編譯器(CC = SPU-GCC/AS = SPU-AS)還不夠聰明,重新排序的說明。 – frankiek3 2015-07-26 02:12:28

1

我最終使用'Assembly Visualizer'asmVis.jar java程序來查看可以優化的程序集部分,並且我手動對這些指令進行了重新排序。在幾乎每個指令週期(雙重指令)期間,我都使用奇數和偶數兩種方法大大提高了彙編函數的速度。

TODO:添加github上鍊接到源