3

バックグラウンド

ランダム分岐にはかなりのオーバーヘッドがかかることが知られています。 そして、そのような質問に答えるSOの投稿がありました。

多くのCPUアーキテクチャのジャンプ命令でも、同様のパフォーマンスへの影響が見られます。そして、そのようなテーマについてもSOに投稿がありました

したがって、関数ポインタや通常の継承可能なC ++クラスベースの関数呼び出しなどのプログラミングパターンを使用した場合、ブランチミスのコストを支払う必要があります。

最先端のハードウェア分岐予測アルゴリズムでも、グローバルに共有されるアドレス履歴ベースの分岐予測しか実行できず、おそらく分岐ターゲットアドレスコードなどを投機的にフェッチする可能性があります。

しかし、定義上、最初の実行では機能しません。

多くの組み込みアプライアンス、スマートフォンなどは、最大のパフォーマンスを要求する必要があります

  • 起動時間
  • ブラウザのようなアプリケーションの最初の実行

これは何百万もの関数呼び出しを呼び出し、すべての間接ジャンプを直接ジャンプに変換するようなソフトウェアアーキテクチャを大幅に変更したくない場合があります...

条件が以下の場合、

条件:

  • 最高速度で実行する必要があります
    • 最初の実行時
      または
    • ジャンプはCPUに対して完全にランダムに見えます

結果を達成するために次のことが最善ですか?

そして、間接ジャンプから直接ジャンプへの動的/静的コードの書き換えを行う例を知りたいです。

最大のパフォーマンスを得る方法:

  • 常に可能性が高いまたは可能性が低いブランチを使用する
  • プレリンクを使用
  • mlockまたはreadaheadを使用し、関数呼び出しをcacheflush(ICACHE)します
  • 間接ジャンプを動的または静的に直接ジャンプに書き直します
    1996年にBradley M Kuhnによって書かれた論文で、場合によっては静的書き直しがあります)

私が見つけた論文は、仮想関数呼び出しをソースコードレベルで静的関数呼び出しに変換することでしたが、ソフトウェア開発者の観点からは、バイナリリンク時間の最適化の方が優れているように見えました。

4

3 に答える 3

2

ブランチがどこに行くかをほぼ確実に予測できるが、CPUは予測できないと言っていますか?分岐予測が失敗すると、多額のコストが発生します。分岐予測テーブルが熱く、毎回同じパスに到達している場合、分岐予測は成功する可能性が高いと思います。(そして、それが一貫していない場合、明らかに予測は100%成功することはできません。)

于 2012-06-28T18:42:18.510 に答える
1

関数ポインタと仮想関数の場合、コンパイル時に次に実行する必要のあるコードがわからないため、ブランチのターゲットを予測する必要があります。

http://en.wikipedia.org/wiki/Branch_target_predictor

于 2012-06-28T20:23:48.680 に答える
1

CPUはすでにこれを行っています。分岐予測を参照してください。

于 2012-06-28T18:44:13.690 に答える