問題タブ [likely-unlikely]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - Linuxカーネルの可能性の高い/可能性の低いマクロはどのように機能し、それらの利点は何ですか?
Linuxカーネルのいくつかの部分を調べてみたところ、次のような呼び出しが見つかりました。
また
私はそれらの定義を見つけました:
それらが最適化のためのものであることは知っていますが、どのように機能しますか?そして、それらを使用することで、どのくらいのパフォーマンス/サイズの低下が期待できますか?そして、少なくともボトルネックコード(もちろんユーザースペース)では、面倒な(そしておそらく移植性を失う)価値があります。
visual-studio - MSVCと同等である可能性が高い/可能性が低い
GCCコンパイラは、可能性の高いマクロと可能性の低いマクロを定義するために使用される__builtin_expectステートメントをサポートします。
例えば。
Microsoft Visual Cコンパイラと同等のステートメント、または同等のものはありますか?
c - ユーザー空間のコードでマクロを使用できる可能性がある/可能性が低いマクロはありますか?
Linux カーネル コードでこれら 2 つのマクロを見つけました。分岐の場合の最適化のためのコンパイラ(gcc)への指示であることは知っています。私の質問は、これらのマクロをユーザー空間コードで使用できるかということです。最適化を提供しますか?どの例も非常に役立ちます。
c - 可能性のある()および可能性の低い()コンパイラヒントの学習サンプル
コンパイラのヒント( )の使いやすlikely
さを学生にどのように示すことができますか?unlikely
__builtin_expect
これらのヒントを使用すると、ヒントなしのコードと比較して数倍高速になるサンプルコードを記述できますか。
optimization - Linuxカーネルでリターンの引数として可能性/可能性が低いを使用する
Linuxカーネルでこの構造を見るだけで、それが何を意味するのかわかりません。
私はlikely
/がここで説明されている機能
unlikely
で作られていることを知っています: http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html__builtin_expect
__builtin_expect を使用して、コンパイラに分岐予測情報を提供できます。
しかし、無条件分岐ではどのような分岐予測ヒントが可能でしょうか??
c - if elseステートメントでのGCCの__builtin_expectの利点は何ですか?
#define
私は彼らが使用しているに出くわしました__builtin_expect
。
ドキュメントには次のように書かれています。
組み込み関数:
long __builtin_expect (long exp, long c)
__builtin_expect
コンパイラに分岐予測情報を提供するために使用できます。-fprofile-arcs
一般に、プログラマーはプログラムが実際にどのように実行されるかを予測するのが苦手なので、これには実際のプロファイルフィードバックを使用することをお勧めします( )。ただし、このデータを収集するのが難しいアプリケーションがあります。戻り値はの値であり
exp
、整数式である必要があります。ビルトインのセマンティクスは、が期待されるということexp == c
です。例えば:
foo
はゼロであると予想されるため、を呼び出すことを期待していないことを示しx
ます。
では、直接使用しないのはなぜですか。
__builtin_expect
?を使用した複雑な構文の代わりに
performance - gccはおそらくマクロの使用法ではない
私は大まかに次のロジックで重要なコードを書いています
式の周りにマクロを使用することを考えているlikely()
ので、それが重要なブランチに到達したときに、最小のレイテンシーが得られます。
私の質問は、プリフェッチする可能性の低いブランチを選択しているため、マクロ名が示唆する使用法とは正反対です。つまり、重要なブランチが発生する可能性は低いですが、発生した場合に最も重要なことです。
パフォーマンスの観点からこれを行うことの明らかな欠点はありますか?
c - 「可能性が低い()」のポイントは何ですか?
重複の可能性:
Linux カーネルの可能性が高い/可能性が低いマクロ
Linux カーネルでは、./linux/include/shed.hで次の行に遭遇しました。
ありそうもない点とは正確には何ですか?.arch/x86/tools/insn_sanity.cでその定義を見つけましたが、それは次のとおりです。
私には、使用する意味がまったくないように思えunlikely()
ます。の意図された目的はunlikely
何ですか?
c - Linux カーネル: 可能性が高い () と可能性が低い ()
これら 2 つの方法は、Linux カーネル コード内で広く使用されているようです。分岐予測の基礎は知っていますが、これら 2 つの関数が if() ステートメントの操作にどのように影響するかを知りたいです。また、それらは CPU 命令パイプラインのレベルで機能しますか? それとも、カーネルコードレベルでの抽象化のレベルがはるかに高いですか?
Linux カーネルの初心者である私は、これら 2 つの方法の内部の仕組みを知りたいと思っています。ありがとう!
c - セグメンテーション フォールトのある Linux カーネルの like()/unlikely() マクロ
私は、likely()/unlikely() マクロがどのように機能するかを理解しており、分岐予測についても理解しています。残念ながら、私は高度なプログラミングのコンテキストで分岐予測を学びませんでした。
私が知りたいのは、可能性が高い/可能性が低いマクロ内の評価がセグメンテーション違反になるかどうか、それが分岐予測履歴または現在の結果/パイプラインにどのように影響するかです。
予測の検証が完了しなかった場合、それが成功したか失敗したかをどうやって知ることができるか理解できません。