3

重複の可能性:
分岐予測子に分岐に従う可能性を伝えることは可能ですか?

したがって、分岐予測が非常に大きな役割を果たしているのであれば (「分岐予測子は、x86 などの多くの最新のパイプライン化されたマイクロプロセッサ アーキテクチャで高い効果的なパフォーマンスを実現する上で重要な役割を果たしています」wiki )、最適化して支援する方法が必要であることは理にかなっています。ですよね?

率直な方法で質問します
。分岐予測子に、どのルートをたどる可能性が最も高いかを教えてもらえますか?

例を挙げます:

私のプログラムは、ユーザーが初めて実行するかどうかをロードするたびにチェックします。ほとんどの場合、キャッシュする必要があるのは、「初めてではない」というラベルが付いたブランチです。

この例では大したことではなく、おそらくアルゴリズムはどのルートを取るべきかを判断できますが、多くの分岐がある複雑なアプリケーションでは、アルゴリズムが 10 点満点中 10 点を獲得するかどうかはわかりません。

これを何らかの方法で最適化できますか? 多分キャッシュのためにブランチをマークしますか?
ところで、私が求めているのは教育目的であり、いつかはタイム クリティカルなプログラムの場合もあるかもしれません。

4

4 に答える 4

2

C用です。ASMをお願いしています

つまり、__builtin_expect のセマンティクスを自分で実装する必要があります。むずかしいだけで、難しいことではありません。分岐予測子に分岐の履歴がない場合、分岐が後方にある場合は分岐が行われ、前方にある場合は分岐が行われないと想定されます。

そのため、分岐命令で反対の条件を使用してコードを再構築し、それに対応するようにコードを移動する必要がある場合があります。たとえば、C コンパイラが for() ループを実装する方法のように、条件付き後方分岐を伴う無条件前方ジャンプは一般的です。

于 2012-12-23T18:47:47.757 に答える
2

「分岐ヒントが必要な場合は、分岐命令の前に次の命令プレフィックスを追加して、静的予測子の動作を変更できます: 0x3E – 分岐が発生すると静的に予測する 0x2E – 分岐が発生しないと静的に予測する」

http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts

于 2012-12-23T19:44:00.787 に答える
1

いくつかの重要なアセンブリ ブランチ予測の最適化、出典: wiki

分岐が発生すると予測されると、命令フェッチで 1 サイクルのストールが発生します。したがって、構造コードを参照できるため、最も可能性の高いコード パスは分岐しないパスになります。

無条件分岐の予測が間違っている可能性があり、分岐に続くロード命令がデコードされ、キャッシュ アクセスが発生する可能性があります。CPU が参照するアドレスをプリフェッチしない限り、分岐後にロード命令を配置しないでください。

命令はペアでデコードされますが、分岐予測器はサイクルごとに 1 つの分岐ターゲットしか予測できません。条件付き分岐の直後に別の分岐が続き、最初の分岐が行われる可能性が高い場合は、分岐の間にノーオペレーション命令を配置して、2 番目の分岐のデコードと予測を防止します。最初の分岐が頻繁に行われない場合、NOP の挿入は有害です。

于 2012-12-23T19:11:45.687 に答える
1

最も単純なヒューリスティックは、最も一般的なパスに一致する分岐命令を使用することです。たとえば、ループをコーディングしている場合、通常は分岐命令を終了条件ではなくループ パスにたどらせるのが最善です。目標は、最も頻繁に true と評価される分岐命令を使用することです。

まったく間違った命令を選択した場合、たとえば、ほとんどの場合すぐに終了するループをコーディングしたとします。プロセッサは、この分岐の意味が逆であることをキャッシュし、その予測を調整する場合があります。ただし、これは頻繁に使用されるコードでのみ発生する可能性があります。

于 2012-12-23T18:46:32.490 に答える