2012-05-02 46 views
3

我們可以在使用EDK的Microblaze C編程中展開循環嗎?循環展開-Microblaze C編程

這是必需的,因爲 我需要更多的性能。傳統上,我的C代碼將連續運行,因此使用某些編譯器指令展開循環可以加速我的應用程序。
(例如,我們使用openMP)。

#pragma Unroll 
for (i = 0; i < 100; i++) { 
    a[i] = fetch_data(i); 
} 

這是Microblaze的可能嗎?如果是,是否有同樣的例子?

回答

3

不,沒有任何自動循環展開。對於這樣的緊密循環,Xilinx論壇上的常見建議是手動展開10-20次,查看性能是否可接受或者在彙編中編寫循環代碼。

您通常會在每個循環分支上丟失3或4個時鐘週期,因此取決於執行fetch_data需要多長時間,您可以計算出要執行多少展開操作。

for (i = 0; i < 100; i+=10) { 
    a[i] = fetch_data(i); 
    a[i+1] = fetch_data(i+1); 
    a[i+2] = fetch_data(i+2); 
    a[i+3] = fetch_data(i+3); 
    a[i+4] = fetch_data(i+4); 
    a[i+5] = fetch_data(i+5); 
    a[i+6] = fetch_data(i+6); 
    a[i+7] = fetch_data(i+7); 
    a[i+8] = fetch_data(i+8); 
    a[i+9] = fetch_data(i+9); 
} 

請務必注意標準循環展開注意事項,例如注意不是您的增量步驟倍數的區間大小。

+0

非常感謝您提供詳細信息。所以你的意思是這種方式(手動循環展開)我可以節省循環內的條件語句中發生的計算?沒關係。但問題是MB將訪問多端口內存控制器(在我的應用程序中),所以我需要多個線程,每個訪問一個端口。我該如何着手解決這個問題? – gpuguy

+0

nvuono的回覆(儘管它沒有談論線程)是介紹「Duff's Device」(http://en.wikipedia.org/wiki/Duff's_device)的好機會。即使迭代的總次數沒有完全分割成手動展開循環的次數,這也是一種巧妙的(即使是濫用)方式來獲得正確的迭代次數。 – Graeme

0

我從賽靈思這個答覆(雖然我還沒有證實這一點):

http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Optimize-Options.html

直接-funroll-環路部分

不同-O優化交換機(可在SDK GUI)可以做循環展開,因爲它啓用了-floop優化哪些狀態:

-floop-optimize 執行循環優化:將常量表達式移出循環,簡化退出測試c另外還可以進行強度降低和循環展開。

啓用水平-O,-O2,-O3,-Os。