Next: , Previous: , Up: Assembly Coding   [Index]


15.8.5 関数ユニット

アセンブラルーチンでループをする方法を選択するにあたっては,どんな演算を同時に実行するのか,スループットはどの程度になるのか,ということを考えることになります。

ループの制御は普通,カウンタとポインタの更新が必要となり,5命令程度でコストを考え,分岐による遅れが加わってきます。CPUのアドレスモードによってはポインタの更新回数を減らす効果が見込めます。一例としては,1つだけポインタの更新を行うと,他のポインタはそれを基準とするオフセットとして表現できる場合が挙げられます。また,CISC CPUでは,全てのアドレス計算は,スケールインデックスを用いてループカウンタと連動できたりします。

最終的なループ制御のコストは,ループ1回のなかで複数リムを処理することで償却できます(see Assembly Loop Unrolling)。ループ制御がそれほどコスト高でない場合は,これを保証できます。

メモリのスループットは常に障壁になります。1サイクルで1回のみロード,もしくはストアすることができる場合は,3サイクル/リムが,2進演算,例えばmpn_add_n関数のようなものの最高速になり,これが全てのコードにおける最高値になります。

整数リソースは,ループカウンタを浮動小数点レジスタに持つようにするか,必ず2番目のリムは浮動小数点数として持つようにして,浮動小数点演算ユニットを乗算用に使用するようにすれば,開放することができるようになります(see Assembly Floating Point)。

浮動小数点リソースは,整数演算として桁上がり・桁借り上げ処理を行うようするか,整数としてビット操作して整数を浮動小数点数に変換すれば開放することができるようになります。