ソフトウェアパイプライン
From Wikipedia, the free encyclopedia
ソフトウェアパイプライン(英: software pipelining なので正確には「パイプライン化」)は、コンピュータ・プログラムの最適化技法のひとつで、パイプライン化された(命令パイプラインの記事を参照)プロセッサの実行ユニットで効率良く実行できるように命令スケジューリングできるよう、プログラムを変形するという手法である。高度なコンパイラではコンパイラ最適化により行われることもあるが、一般にはしばしば、多数回繰り返されるが1回の処理内容がごくわずかなループ(画像処理や信号処理などには多い)について、手作業で、一種のアウト・オブ・オーダー実行のようなプログラムの書換え(ループの繰返しをまたいで、コードの順序を前後に入れ替えることが多い)を行う。アーキテクチャによっては、その仕様にソフトウェアパイプラインを特に意識した要素があるものもあり、特にインテルのIA-64アーキテクチャが顕著である(#IA-64における例)。
下記のようなループ例を考える。
for i = 1 to bignumber A(i) B(i) C(i) end
この例では、A(i), B(i), C(i), がそれぞれiを操作する命令であり、互いに依存関係がある。
すなわち A(i) は B(i) の開始前に完了している必要がある。例えば、A はメモリからレジスタにデータをロードし、Bがデータに算術演算を行い、Cがデータをメモリに書き戻す。しかし、それぞれが異なるiの値に対して依存がないと仮定すると、A(2) は A(1) が完了する前に開始することができる。ソフトウェアパイプラインを考えない場合には、コードは下記の順序で実行される。
A(1) B(1) C(1) A(2) B(2) C(2) A(3) B(3) C(3) ...
各命令は完了に 3 クロックかかるとする(制御ループのコストを考えない)。また(現代的なシステムでは一般的だが)実行中の命令に対して依存関係がなければ命令を各サイクルで割り当てることができるものとする。パイプライン化しない場合には、各ループが7サイクル(3 + 3 + 1, A(i+1) は C(i) を待つ必要がないため)かかることになる。
ソフトウェアパイプラインによって下記のように命令列を並べ替えると、
A(1) A(2) A(3) B(1) B(2) B(3) C(1) C(2) C(3) ...
毎サイクルで命令を割り当てることができ、全体が9サイクル、ループが平均 3 サイクルで実行できる。