Linux カーネルのドキュメントを読みました。このファイルには静的キーが記述されています: http://lxr.linux.no/linux+v3.11.1/Documentation/static-keys.txt
では、static-key と __builtin_expect の違いは何ですか? それらはすべて、それらを使用してlikyly()およびsimilar () を実装できることを暗示しています。
Linux カーネルのドキュメントを読みました。このファイルには静的キーが記述されています: http://lxr.linux.no/linux+v3.11.1/Documentation/static-keys.txt
では、static-key と __builtin_expect の違いは何ですか? それらはすべて、それらを使用してlikyly()およびsimilar () を実装できることを暗示しています。
__builtin_expect
CPU によって評価される必要がある真のテストおよび分岐命令がコードに導入されますが、たどる可能性が高いパスからの命令は引き続き CPU パイプラインにプリフェッチされます。
static_key_*
後でNOP
実行時にパッチを適用してjmp <label>
. これは、コードがデバッグされていないときなど、通常の作業ケースに影響を与えずにデバッグ出力に対応するために使用できます。
のLinux カーネル ドキュメントからstatic-keys
、
gcc (v4.5) は、ラベルへの分岐を可能にする新しい「asm goto」ステートメントを追加します:
gcc.gnu.org/ml/gcc-patches/2009-07/msg01556.html「asm goto」を使用すると、メモリをチェックする必要なく、デフォルトで実行されるか、実行されないブランチを作成できます。次に、実行時にブランチ サイトにパッチを適用して、ブランチの方向を変更します。
たとえば、デフォルトで無効になっている単純なブランチがある場合:
if (static_key_false(&key)) printk("I am the true branch\n");
したがって、デフォルトでは「printk」は出力されません。また、生成されたコードは、直線コード パス内の単一のアトミック 'no-op' 命令 (x86 では 5 バイト) で構成されます。分岐が「フリップ」されると、直線コード パスの「ノーオペレーション」に「ジャンプ」命令を使用して、アウト オブ ラインの真の分岐にパッチを適用します。したがって、分岐の方向を変更するにはコストがかかりますが、分岐の選択は基本的に「無料」です。これが、この最適化の基本的なトレードオフです。
この低レベルのパッチ適用メカニズムは、静的キーの基礎である「ジャンプ ラベル パッチ適用」と呼ばれます。