Re: Static branch prediction and annotation
河野真治 @ 琉球大学情報工学です。
予測と実際の計算の話がごっちゃになるのでわかりずらいですね。
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,
河野真治 @ 琉球大学工学部情報工学科,
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735