2012-05-02 10 views
3

EDLを使用してMicroblaze Cプログラミングでループをアンロールすることはできますか?ループアンロール - Microblaze Cプログラミング

パフォーマンスがさらに必要なので、これが必要です。伝統的に私のCコードは連続して実行されるので、いくつかのコンパイラ指令を使用してループをアンロールすると、アプリケーションが高速化されます。
(例:openMPを使用しています)。

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

これはMicroblazeでも可能ですか?はいの場合は、同じにすべての例ですか?

答えて

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); 
} 

増分ステップの倍数ではない間隔のサイズを監視するような標準のループアンローリング警告に注意してください。

+0

ありがとうございました。だから、この方法(手動ループのアンローリング)は、forループ内の条件文で発生する計算を節約できますか?それはいいです。しかし、問題はMBは私のアプリケーションではマルチポートメモリコントローラにアクセスするので、それぞれが1つのポートにアクセスする複数のスレッドが必要です。これを解決するにはどうしたらいいですか? – 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

セクション

SDKで直接利用可能な異なる-O最適化switchsを(-funrollは、ループGUI)が-floop-optimizeを有効にするため、ループアンロールを実行する可能性があります。

-floop-optimize ループ最適化の実行:ループから定数式を移動し、終了テストを簡略化します。c必要に応じて強度低下やループアンローリングも行います。

レベル-0、-O2、-O3、-Osで有効になります。