1. ホーム
  2. c++

[解決済み] GCCに、分岐予測を常にある方向に強制するコンパイラのヒントはありますか?

2022-09-15 09:23:14

質問

Intel アーキテクチャでは、私のコードで常に特定の方法で分岐予測を強制するコードを生成するよう GCC コンパイラーに指示する方法はありますか? Intel のハードウェアはこれをサポートしていますか? 他のコンパイラーやハードウェアについてはどうでしょうか?

私は、高速に実行したい場合を知っていて、最近そのブランチを取ったときでさえ他のブランチを取る必要があるときのスローダウンを気にしない C++ コードでこれを使用するでしょう。

for (;;) {
  if (normal) { // How to tell compiler to always branch predict true value?
    doSomethingNormal();
  } else {
    exceptionalCase();
  }
}


Evdzhan Mustafa へのフォローアップの質問として、ヒントは、プロセッサが初めてその命令に遭遇したときのヒントを指定するだけで、その後のすべての分岐予測は正常に機能するのでしょうか。

どのように解決するのですか。

C++20では の可能性が高い属性と低い属性 は標準化されるべきで、すでにサポートされている はg++9で . ですから、議論されているように ここで と書くことができます。

if (a > b) {
  /* code you expect to run often */
  [[likely]] /* last statement here */
}

例えば、次のコードでは、else ブロックは [[unlikely]] の中にある if ブロック

int oftendone( int a, int b );
int rarelydone( int a, int b );
int finaltrafo( int );

int divides( int number, int prime ) {
  int almostreturnvalue;
  if ( ( number % prime ) == 0 ) {
    auto k                         = rarelydone( number, prime );
    auto l                         = rarelydone( number, k );
    [[unlikely]] almostreturnvalue = rarelydone( k, l );
  } else {
    auto a            = oftendone( number, prime );
    almostreturnvalue = oftendone( a, a );
  }
  return finaltrafo( almostreturnvalue );
}

属性の有無を比較するゴッドボルト・リンク