__builtin_expect説明



__builtin_expect Description



このディレクティブはgccによって導入され、その役割は プログラマーが、実行する可能性が最も高いブランチをコンパイラーに通知できるようにします 。この命令は次のように記述されます:__builtin_expect(EXP, N)
EXP == Nの確率が非常に大きいことを意味します。

一般的な使用方法は__builtin_expect命令パッケージはlikely with unlikely Macroです。これら2つのマクロは次のように記述されています。



#define likely(x) __builtin_expect(!!(x), 1) //x is probably true #define unlikely(x) __builtin_expect(!!(x), 0) //x is probably false

カーネル内のLike()およびlikely()

最初に明確にすること:

If(likely(value)) // is equivalent to if(value) If(unlikely(value)) // is also equivalent to if(value)

__builtin_expect() GCC(バージョン> = 2.96)は、コンパイラーに「ブランチ転送」情報を提供するためにプログラマーに提供されます。これにより、コンパイラーはコードを最適化して、命令ジャンプによるパフォーマンスの低下を減らすことができます。
__builtin_expect((x),1) xの値が真である可能性が高い
__builtin_expect((x),0) xの値が偽である可能性が高くなります。
つまり、use likely()、ifの後にステートメントを実行する可能性が大きいほど、use unlikely() elseの後にステートメントを実行する可能性が高くなります。このようにして、コンパイラはコンパイルプロセスでより可能性の高いコードに従うため、命令ジャンプによって引き起こされるパフォーマンスの低下が軽減されます。



int x, y if(unlikely(x > 0)) y = 1 else y = -1

上記のコードでは、gccでコンパイルされた命令はy = -1命令を先読みします。これは、xの値が0より大きい確率が小さい場合に適しています。ほとんどの場合、xの値が0より大きい場合は、possible(x> 0)を使用して、コンパイルされた命令が事前に命令y = 1を読み取るようにする必要があります。このようにして、システムは実行中の再フェッチを減らします。



著者:よく理解している
リンク:https://www.jianshu.com/p/2684613a300f
出典:ショートブック
本の著作権は著者が所有しています。いかなる形式の転載も、承認と出典について著者が連絡する必要があります。