[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[pbsd-mg2] Re: To-do list
suz@hpc.bs1.fc.nec.co.jp writes:
> VRxx は単なるパイプラインプロセッサなので、割と計算が楽なようです。
> たとえば、次のようなループをコンパイルすると
>
> for (i=0; i< n; i++) {
> }
>
> .L8:
> slt $2,$3,$4
> .set noreorder
> .set nomacro
> bne $2,$0,.L8
> addu $3,$3,1
>
> こんなコードになるんですが、これって 1 loop 3 clock ではないでしょうか。
VR41xxのパイプラインの構造では正しいのですが、R4000のような8段のパイプラ
インだと1 loop 5 clockになります。R10000のような複雑なプロセッサになると
良くわかりません:-)
何が言いたいかと言うと、命令の実行にかかる時間はプロセッサのインプリメン
トにがちがちに依存するので、ループの実行時間を計って命令数から計算するや
り方だと移植性が悪いということです。
Cp0のcountレジスタを使うと移植性が良くなると思って調べてみたのですが、何
と、VR4111/4121では、countレジスタは、CPUのパイプラインの動作クロックと
の関係がわからないMasterOutというクロックでカウントされることがわかりま
した。ちなみに、R4000ではパイプラインクロックの半分の周波数でカウントさ
れますので、カウントレジスタの差分からパイプラインクロックを計算すること
ができます。
というわけで、VR42xxではcountレジスタを使うやり方がうまくいかないように
思います。仕方がないので、
R4000とcountレジスタの動作が同じものはcountレジスタを使う
VR41xxではパイプラインの構造が同じなので命令数から計算する
という方法はどうでしょうか。
# 命令数はコンパイラによっても変わりそうなので、それがいやだというのもあ
# るのですが。
篠原