2

Linux カーネルのドキュメントを読みました。このファイルには静的キーが記述されています: http://lxr.linux.no/linux+v3.11.1/Documentation/static-keys.txt

では、static-key と __builtin_expect の違いは何ですか? それらはすべて、それらを使用してlikyly()およびsimilar () を実装できることを暗示しています。

4

1 に答える 1

7
  • __builtin_expectCPU によって評価される必要がある真のテストおよび分岐命令がコードに導入されますが、たどる可能性が高いパスからの命令は引き続き 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 バイト) で構成されます。分岐が「フリップ」されると、直線コード パスの「ノーオペレーション」に「ジャンプ」命令を使用して、アウト オブ ラインの真の分岐にパッチを適用します。したがって、分岐の方向を変更するにはコストがかかりますが、分岐の選択は基本的に「無料」です。これが、この最適化の基本的なトレードオフです。

この低レベルのパッチ適用メカニズムは、静的キーの基礎である「ジャンプ ラベル パッチ適用」と呼ばれます。

于 2013-09-18T07:40:13.593 に答える