Daily Grind

システム開発関連の忘備録です

GCCのマクロ

色々なところに、文献あると思いますが、とりあえず以下。
https://www.ibm.com/developerworks/jp/linux/library/l-gcc-hacks/


GCC の中に、ビルトインでマクロが用意されています。
基本的に、カーネルで使用する記述になっていますが、GCCのマクロですので
ユーザ空間でも使用可能なものもあります。

その中で、性能改善に有効なもの(ドライバで良く使用)を紹介します。

・分岐予測のヒント

#define likely(x)	__builtin_expect(!!(x), 1)
#define unlikely(x)	__builtin_expect(!!(x), 0)

※ ユーザモードのコンパイルでは、上記マクロは未定義なので
自分で定義する必要があります。

// 使い方 1
// 以下の例の場合、コンパイラは、likely判定を先に行うアセンブラ命令
// 出力します。 優先する予測情報をコンパイラに与えます。
// 処理として、良く走るところを 優先として登録します
if ( likely( a == 1 ) ) {
printt(" ok ");
} else {
print(" ng ");
}
// 使い方 2
// よくある エラー判定には、unlikely を 設定すると 正常に処理された
// ret == 0 が先に 判定されて、性能改善になります
ret = ioctl();
if ( unlikely( ret != 0 )) {
printf(" NG");
return(ret);
}