2016-07-13 6 views
0

私はlikely()/ unlikely()マクロがどのように機能するかを理解しており、分岐予測も理解しています。残念ながら、私は高水準プログラミングの文脈で分岐予測を学んでいませんでした。セグメンテーションフォールトを伴うLinuxカーネルの()/ unlikely()マクロ

私が知りたいのは、可能性の高い/おそらくないマクロ内の評価がセグメンテーションフォールトとなる場合、分岐予測履歴や現在の結果/パイプラインにどのように影響するかです。

予測の検証が完了しなかった場合、成功か失敗かはどうやって分かりますか?

+0

である私は、この開始を考えます投機的に実行されたブランチがフラッシュされた場合の分岐予測の仕組みを知りたいので、実際に尋ねていることから疑問が湧きます。 – harold

+0

実際にはありません。それをフラッシュするかどうかの決定は評価に依存するが、それは正しいのではないか?私の質問は、評価が完了できなかった場合です。その場合のシステムの状態は何ですか? – user3224083

+0

はい、それは私が意味するものです。ブランチ全体がフラッシュされていれば、それだけではなくコードがフラッシュされます。可能性が高い/そうでない可能性がありますが、実際には例外でもありません(予測変数を破損する可能性があります。例外は非常に高価であり、精度は重要ではありません)。過去のいくつかの枝を推測して、最初のものを誤予測してしまいます。これにはいくつかの解決策があります。 – harold

答えて

3

__builtin_expectthe definition of the likely/unlikely macrosで使用)は、いずれの引数も評価するための実際のコードを生成しません。コンパイラには、が評価された場合には、どのような結果が予想されるのかをに伝えるだけです。

*(int*)NULLが通常13であると言うと、オプティマイザが混乱するかもしれませんが、コンパイラのバグはありません。実行時にsegfaultsするコードを生成しません。

Another answer on the old questionは、マクロの有無にかかわらず、gccがコードをどのようにレイアウトしているかを示しています(例:それ自体はほとんどありません。命令キャッシュミスが起こりにくい条件付き分岐)。


これはlikely()/unlikely() macros in the Linux kernel - how do they work? What's their benefit?のかなりの重複はありませんが、これらのマクロがどのように機能するかについて多くの情報を見つけるでしょうし、何その効果はそのQ & A.

関連する問題