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 も、時代がたつと間違いに見えるようになるのでしょうね。
変数の register 宣言みたいに。ただ、register も inline もま
だまだ可愛いものです。プログラムの可読性は、そんなに下げない
し、普通は無視しても全然平気だから。#define よりは、inline
の方が見やすいし。
この間、ふと Linux のソースを見ていて辛かったのは、likely()
です。
include/linux/compiler.h:
------------------------------------------------------------
/* 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. */
#if __GNUC__ == 2 && __GNUC_MINOR__ < 96
#define __builtin_expect(x, expected_value) (x)
#endif
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
------------------------------------------------------------
これを、if 文の中にかかれると、可読性の下がること下がること。
こんな感じ。
for( ... )
{
....
if (unlikely(dentry->d_bucket != head))
break;
....
if (likely(move_count == dentry->d_move_count)) {
if (!d_unhashed(dentry)) {
atomic_inc(&dentry->d_count);
found = dentry;
}
}
}
lilely() と unlikely() は、やめてくれって、というよりは、
「何間考えているんだ、このボケ」って感じ。こんなの人間がやる
ことじゃないです。
まあ、likely(), unlikely() も、まあ inline とか register と
同じで、まったく無視してもいいんだけど、無視するのは、辛いわ
けです。英語nativeなら平気なんですかね。
そもそも、コンパイル時の静的な分岐予測って、効くんですかね。
最近のプロセッサは、動的な分岐予測はしているわけですよね。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
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