Re: Static branch prediction and annotation
kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 分岐予測に関してはそうですね。でも、サブルーチン・コールの爲
> に外部メモリに触るってのは限界があるだろうってことです。
>
> PowerPC の link register は、優れていると思う。けど、SPARCの
> 方式は外れ。いつかは外部メモリに触れるとしても、それをコンパ
> イラなりハードウェアなりが「隠れてこそこそ」やりたい。
えっと,leaf procedure以外では必ずlink registerをスタックにセーブする
んじゃないでしょうか? それはPowerPCもMIPSもAlphaも同じでは.
CISCだと,leafへのcallでもメモリへの参照が起きる.
SPARCだと,leaf以外でもメモリに書かないこともある.
戻りPCに関するメモリへの参照の回数だけで言ったら,
CISC > PowerPC = MIPS = Alpha = ... >= SPARC
では?
(もっとも,引数や局所変数も考えると 他のRISC >= 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
...
> の方が速いってのは、分岐に演算が関わってないからであって、本
> 来は前者の方が速いべきなんじゃないかなと思います。...
偏りがあるなら分岐予測が効いて,分岐でやった方が速くなるんじゃないです
か.
同じくらいの確率だとすると,分岐だけで頑張るには,分岐の両方向について
投機的に命令の実行を始めないといけないと思うのですが,そのアプローチだ
と無駄な(投機に失敗する)命令が指数関数的に増えてしまって,プロセッサ資
源の無駄使いになります.
> データパス的には「PCにかけ算する」なんてのは確かに出て来ない
> ので、無駄なのかも知れない。でも、Shard Library とかの
> PIC (Position Independent Code) とか、オブジェクト指向的な
> 間接コールが多量に出て来る状況では、結構、汎用的に使われてます。
問題は頻度ですね.そういう使い方が(SPEC INTのベンチマークで高い頻度に
なるくらい)良く出てくるなら,プロセッサもそれに対応すると思います.
> 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
> でできるはずだってわけです。
むしろ,下のコードで3つのcmp ... jcond ペアの間の依存性を無くそうとい
うのが狙いでしょう.flagが1つだと逆依存(や出力依存)が出てきてしまいま
す.renaming すれば良いという話もありますが,ここはscoreboarding風な集
中制御にしてあります.この辺はdesign decisionでしょう.
> > # いわゆる「アセンブリ言語プログラマから見たきれいさ」は,あまり性能に
> > # 結び付かないように思います.
>
> コンパイラは静的予測を行ない、CPUは動的予測を行なう。その間
> の橋渡しがアセンブラ言語の予測に対する機能ですね。
>
> 予測と動作記述を分ける方が良いってことなのかな。
いや,そのー「link registerを汎用レジスタにする」とか「PCを汎用レジス
タにする」とか,「直交したアドレッシングモード」とかは,別に速くならな
いことが多いということです.あとは「OOの効率良い実装のための命令」とか
も.
前田敦司
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