河野真治 @ 琉球大学情報工学です。

予測と実際の計算の話がごっちゃになるのでわかりずらいですね。

In article <m3oew4562s.fsf@maedapc.cc.tsukuba.ac.jp>, MAEDA Atusi <maeda@cc.tsukuba.ac.jp> writes
> 分岐予測は,外れても遅くなるだけなので,「可能性が否定できない」程度の
> 頻度しか外れないなら,やる利益の方が大きいのです.(メモリの参照を減ら
> すための仕組みではないです.)

分岐予測に関してはそうですね。でも、サブルーチン・コールの爲
に外部メモリに触るってのは限界があるだろうってことです。

PowerPC の link register は、優れていると思う。けど、SPARCの
方式は外れ。いつかは外部メモリに触れるとしても、それをコンパ
イラなりハードウェアなりが「隠れてこそこそ」やりたい。

> データパスを考えると分かりますが,PCは特別扱いした方がほとんどの場合有
> 利だと思います.

予測に関しては、命令部で予測するかオペランドで予測するかの違
いだけだと思うんだけど... 

なんていうのかな、
    a = b?3:4 
        cmp b
        jz _2
        move r10,3
        j _1
    _2: move r10,4
    _1: st   a,r10
より分岐を計算に書き換える 
    a = b*3+(!b)*4 
         ld   r11,b
         move r10,3
         mul  r10,r11
         not  r11
         move r12,4
         mul  r11,r12
         add  r11,r10
         st   r11,a
の方が速いってのは、分岐に演算が関わってないからであって、本
来は前者の方が速いべきなんじゃないかなと思います。述語修飾み
たいな手法は、前者を、
    a = b?3:4 
        ld    r11,b
        move  r10,3 if r11
        move  r10,4 if r11
    _1: st    r10,a
に書き換えるわけだけど、分岐予測があるなら、おんなじことで
あって欲しい。Predication は、実行時にやるべきことをコンパイル時
に押しつけている気がする。

データパス的には「PCにかけ算する」なんてのは確かに出て来ない
ので、無駄なのかも知れない。でも、Shard Library とかの
PIC (Position Independent Code) とか、オブジェクト指向的な
間接コールが多量に出て来る状況では、結構、汎用的に使われてます。

> 兄貴分のPowerは常にIPCではトップクラスの値を誇っており(懐かしい言葉で
> 言えばbrainiac approach),性能的にもトップグループにいます.その後を追
> うPowerPCも,特に今度の970はクロックも上げてきてなかなか頑張っていると
> 思いますが.

PowerPC は良くできてます。ただ、
      cmp flag1
      cmp flag2
      cmp flag3
      jcond flag1,_1
      jcond flag2,_2
      jcond flag3,_3
みたいなのって、いかにもIPCのためであって、実性能とは関係ない
って感じがしませんか?
      cmp 
      jcond _1
      cmp 
      jcond _2
      cmp 
      jcond _3
でできるはずだってわけです。

> # いわゆる「アセンブリ言語プログラマから見たきれいさ」は,あまり性能に
> # 結び付かないように思います.

コンパイラは静的予測を行ない、CPUは動的予測を行なう。その間
の橋渡しがアセンブラ言語の予測に対する機能ですね。

予測と動作記述を分ける方が良いってことなのかな。

---
Shinji KONO @ Information Engineering, University of the Ryukyus, 
河野真治 @ 琉球大学工学部情報工学科,