6

何度も実行されているループがあります。そのループ内のロジックは、プログラムのモードに依存します。パフォーマンスを向上させるために、関数ポインタの配列 functionPtr[] を初期化できると考えていたので、正しいロジックを実行する functionPtrmode を呼び出すだけです。ループは何サイクルも同じモードに留まります (数は前もって不明ですが、数千に上ります)。このプログラムは intel x64 マシンでのみ実行され、移植性は必要ありません。

CPU が分岐予測を利用することを望んでいましたが、私の分岐は (アセンブリ レベルで) 条件付きではありませんが、分岐の場所は変数 (functionPtr+mode) に依存するためです。CPU は functionPtr+mode を計算し、パイプライン中にそれらの命令を取り込み始めますか?

4

3 に答える 3

4

Intel、AMD、および VIA CPU のマイクロアーキテクチャから アセンブリ プログラマおよびコンパイラ メーカー向けの最適化ガイド

http://www.agner.org/optimize/microarchitecture.pdf

セクション 3.7 (Sandy Bridge の場合、他のプロセッサは別のセクションにあります) 間接ジャンプと呼び出しのパターン認識 間接ジャンプと間接呼び出し (リターンは除く) は、分岐命令と同じ 2 レベル予測子を使用して予測されます。

関数へのポインタは間接呼び出しです。

于 2014-10-07T16:07:45.203 に答える
4

はい、かなり最近のプロセッサは、間接ジャンプの分岐予測を (少なくとも似たような) ことができます。

Pentium (Intel で最初に分岐予測を行った) から最初の Pentium IV まで、間接分岐に使用されたのは Branch Target Buffer (BTB) だけでした。これは、ターゲットが以前のターゲットとまったく同じである場合 (およびその場合のみ) に、そのような分岐を正しく「予測」したことを意味します。

Pentium M/Prescott (最後の Pentium IV) 以降、Intel は間接ジャンプの分岐予測を改善し、2 レベルの適応予測子を使用しました。私があなたの質問を正しく理解していれば (つまり、あなたのループは多くの連続した反復で同じターゲットで実行され、それらがあなたが気にかけていることです)、BTB だけでも目的に十分です。2 レベルの予測子は、(たとえば) 連続した数値の最下位ビットで分岐している場合に、より便利になります。したがって、1 つの反復で 1 つのターゲットにジャンプし、次の反復で別のターゲットにジャンプするという予測可能なパターンがありました。このようなパターンでは、BTB だけでは分岐を常に正しく予測しませんが、現在のプロセッサの 2 レベル予測子は正しく予測します (最初の数回の反復の後、パターンを検出できます)。

于 2014-10-07T15:54:25.773 に答える
1

分岐予測は、次に実行される命令を示す分岐の評価までわからない実際の分岐用です。ただし、コードでは次の命令は現在のモードに応じて既知であるため、予測の必要はなく、パイプラインで待機することもありません。

モード変更と命令オプションの間に十分な時間があれば、パイプラインは余分な労力をかけずに毎回適切な命令を正常にフェッチします。

于 2014-10-07T15:37:21.030 に答える