Re: Static branch prediction and annotation
> In article <3989148news.pl@insigna.ie.u-ryukyu.ac.jp>
> kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> > 河野真治 @ 琉球大学情報工学です。
> > inline で欲しいのは、本来はプログラム変換でのspecialization
> > であって、サブルーチンオーバヘッドではないはず。Specialiation
> > は通常のサブルーチンコールでも出来るので、inlineは、
> > なにか間違った選択だったと思います。
inlineしないspecializationって,specializeした色んなバージョンのサブルー
チンを作るってことでしょうか.だったらinliningしても良いような.
昔,MIPSのコンパイラはオブジェクトを中間コード(uコード)で出力しておい
て,リンク時に手続き間最適化やをしていましたが,あれは廃れたんですか
ね.
> /* Somewhere in the middle of the GCC 2.96 development cycle, we implemented
> a mechanism by which the user can annotate likely branch directions and
> expect the blocks to be reordered appropriately. Define __builtin_expect
> to nothing for earlier compilers. */
分岐予測というより,どちらかのパスを優先して分岐以外の命令をスケジュー
ルするんでしょうかね.trace schedulingみたいに.
> lilely() と unlikely() は、やめてくれって、というよりは、
> 「何間考えているんだ、このボケ」って感じ。こんなの人間がやる
> ことじゃないです。
if_likelyとif_unlikelyだと少しはましですかね(大差ないか).
商用のコンパイラだと,プロファイラのフィードバックが使えたりしますから,
人間が手でannotateするより楽ですね.
> そもそも、コンパイル時の静的な分岐予測って、効くんですかね。
ループに関してはある程度効くんじゃないですか.
> 最近のプロセッサは、動的な分岐予測はしているわけですよね。
今や,動的分岐予測なしでは話にならないです.分岐の結果が分かるまで待っ
ていたらフェッチが全然間に合いません.
最近のプロセッサの命令フェッチステージはたいてい,
while (1) {
fetch_block(pc); // 複数の命令をフェッチ
pc = predict(pc); // 次のフェッチ番地を予測
}
みたいな作りになっていると思います.(分岐命令が含まれていないブロック
なら,予測器は次のブロックの番地を返す.)
前田敦司
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