4

上記の 2 つのケースに固有の情報を見つけるのに苦労していますが、あなたの専門家の意見を聞いています。

最初のことは、間接jmpが分岐予測を損なうことを知っています。また、間接jmpの結果が一定であっても、絶対jmpと比較して、予測メンテナンスバッファーなどが必要であることを知っています。

私の質問は、誰かが知っているかどうかです:

mov rax, 1234567812345678h;
jmp rax;

プロセッサの分岐予測子によってまだ間接的であると見なされているか、この場合は計算を実行します.x64には直接的な「jmp absolute 64」命令がなく、間接的な命令しかないため、そうしています。:/ ( How to execute a call instruction with a 64-bit absolute address?代わりにジャンプをターゲットに十分近づけて使用できない場合は、これを示唆していますjmp rel32。)


次に、その範囲で、jmp 0x1234 と call 0x1234 の間に実際の違いはありますか (プロセッサの最適化 (命令キャッシュ、プリフェッチャーとそのヒント、分岐予測) に関して) ? (vc2012 の「速度最適化」は呼び出し、「min_size opt」は jmp、「混合最適化」は x64 の場合は jmp、x86 の場合は呼び出し)

4

2 に答える 2

2

Intel のブランチ ターゲット (およびブランチ) 予測は、非常に洗練されたものであり、企業秘密でもあります。必ずしも 1 つのアルゴリズムがあるとは限りません。つまり、予測メカニズムは CPU によって異なることが予想されます。これは、Intelが特定のプロセッサの問題を解決したいトランジスタの数に依存します。もちろん、Intel 以外にも x86 および x64 プロセッサのメーカーは他にもあります。

同じ命令の過去の実行を使用して後続の実行のターゲットを予測する履歴分岐ターゲット予測メカニズムは、1 つしかないため、この分岐の正しいターゲットをほぼ確実に予測します。そのため、このコード シーケンスが再実行され (たとえば、ループ内で)、しばらくの間命令キャッシュに留まると、非常に適切に処理される可能性があります。(ただし、一部のプロセッサでは、別の分岐が発生してハッシュ衝突が発生した場合に、キャッシュ ライン衝突と同様の効果によって分岐先予測メカニズムが中和される可能性があります。)

より大きな問題は、キャッシュに新しくロードされたコードでそのようなシーケンスが自由に発生した場合、それがどれだけうまく処理されるかということです。これは、プロセッサの非履歴ベースのターゲット予測機能につながります。このような (非歴史的な) 分岐ターゲット予測は、このコード シーケンスが与えられた場合に分岐位置を簡単に決定できますが、メーカーが特定のプロセッサのダイ上の不動産に値すると見なすかどうかに完全に依存します。このような決定を下す要因には、消費電力、その他のパフォーマンス向上のトレードオフ (つまり、同じダイ領域をより適切に使用できる可能性)、およびそのようなコード シーケンスやその他のさまざまなコード シーケンスに期待される周波数が含まれます。

于 2012-12-31T18:30:08.637 に答える