4

実装が次のような C++ クラスがあるとします。

// ...

MyClass::iterativeFunction() {
     for (int i = 0; i < 1000000; i++) {
          performAction(i);
     }
}

MyClass::performAction(int index) {
     // Block of code (non-inline-able)
}

// ...

C++ レベルでは、これらのメソッドの空間的な局所性を制御できますか? それとも、コンパイラが関連するメソッドを認識し、それに応じてそのアセンブリを最適化することを期待する必要がありますか? 理想的には、命令キャッシュに一緒にロードされるように、それらを互いに隣り合わせにしたいのですが、コンパイラーにこれを本当に望んでいることを知らせる方法がわかりません。

4

4 に答える 4

5

いずれの場合も、コードはキャッシュに入るまで実行できません。いずれの場合も、フローは無条件であるため、コード フローがどこに向かうかは CPU にも同様に明らかです。だから、それは何の違いもありません。最新のコード キャッシュは、アドレス空間で先にフェッチするのではなく、命令フローで先にフェッチし、無条件分岐をたどり、必要に応じて条件付き分岐を予測します。

したがって、これを気にする理由はありません。違いはありません。

于 2012-11-01T04:03:41.283 に答える
2

技術的に言えば、いいえ。ただし、最近のようなプロセッサでは、非常に大きな実行可能ファイルまたは非常に恐ろしい分岐がいたるところにない限り、通常、データキャッシュと同じくらい命令キャッシュについて心配する必要はありません。

その理由は、キャッシュ ラインの長さが約 64 バイトしかないためです。つまり、メソッドが 64 バイトを超える場合 (実際はそうです)、それらが互いに直接隣り合っている場合でも、複数のキャッシュ エントリにロードする必要があります。物理メモリ内。

于 2012-11-01T03:56:16.703 に答える
1

そのレベルの制御と最適化が必要な場合、C++ は適切な言語ではありません。

しかし、あなたの質問に対する実際の答えは「いいえ」です。

于 2012-11-01T03:54:04.707 に答える
0

いいえ、私の知る限り、メソッドの場所を指定する方法はありません。C++ でネストされたプロシージャが許可されている場合、呼び出されたプロシージャがローカルであることを確認する 1 つの方法になります。

于 2012-11-01T03:53:59.947 に答える