ソフトウェアパイプラインの手書きをDRYで行う

ソフトウェアパイプライン (SWPL) を、Don’t Repeat Yourself で書くというお話です。

サンプルとして次のプログラムを考えます。




入力を2倍して出力するだけのプログラムです。
Target Loop の部分を変更して、SWPLを実装します。
実行順がわかりやすいように、TRACE でログを出力しています。
次のように、行で実行順、桁でループのiの値、文字で Load, Calc, Store のどれを行ったかを表すチャートが出力されます。




SWPL化の準備として、i==0 の時の実行だけ、ループの外に出しましょう。
同じ処理を2回書くのはいやなので、マクロにしてしまいます。
ついでに、Load, Calc, Store のどのパートを実行するか、マクロの引数で切り替えられるようにしましました(今回は1行を1つのパートにに分けましたが、実戦的には、複数行を1つのパートにしたり、パート数も3とは限らず必要に応じて設定したりします)。



i==0 の処理をループの外に出しただけなので、実行しても TRACE の出力結果は変わっていません。

それでは、
各iのStore処理を、i+1のLoad処理の後ろに移動してSWPLしましょう。マクロの定義は変わりません。



S=1 の行を移動させました。移動後の文脈ではiの値が増えているので、-1しています。なお、i==0の時のL=1, C=1は、2行に分ける必要がないのでまとめまています。
TRACEの結果は…




きれいにSWPL化されました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です