3

EDKを使用したMicroblazeCプログラミングでループ展開を行うことはできますか?

より多くのパフォーマンスが必要なため、これが必要です。従来、私のCコードはシリアルに実行されるため、コンパイラ指令を使用してループを展開すると、アプリケーションが高速化されます。
(たとえば、openMPを使用する場合と同様)。

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

これはMicroblazeで可能ですか?はいの場合、同じ例はありますか?

4

2 に答える 2

3

いいえ、そのような自動ループ展開はありません。このようなタイトなループの場合、ザイリンクス フォーラムで一般的に推奨されているのは、手動で 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); 
} 

インクリメント ステップの倍数ではない間隔サイズを監視するなど、標準のループ展開に関する注意事項に注意してください。

于 2012-05-02T04:17:11.430 に答える
0

ザイリンクスから次の返信がありました (まだ確認していませんが)。

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

-funroll-loops セクション

さまざまな -O 最適化スイッチ (SDK GUI で直接使用可能) を使用すると、次の状態の -floop-optimize が有効になるため、ループの展開が行われる場合があります。

-floop-optimize ループの最適化を実行します。定数式をループの外に移動し、終了テスト条件を簡素化し、オプションで強度削減とループ展開も行います。

レベル -O、-O2、-O3、-Os で有効です。

于 2012-05-03T12:24:22.193 に答える