CPU のキャッシュを利用するより良いコードを書く方法を学びたいです。連続したメモリで作業することは、理想的な状況のようです。そうは言っても、連続していないメモリで行うことができる同様の改善があるかどうか、私は興味がありますが、次のようなポインターの配列を使用します。
struct Position {
int32_t x,y,z;
}
...
std::vector<Position*> posPointers;
...
updatePosition () {
for (uint32_t i = 0; i < posPointers.size(); i++) {
Position& nextPos = *posPointers[i];
nextPos.x++;
nextPos.y++;
nextPos.z++;
}
}
これは大まかなモックアップ コードにすぎません。これを適切に学習するために、すべての Position 構造体がヒープ全体でランダムに作成されたとだけ言っておきましょう。
Intel の i7 などの最新のスマートなプロセッサは、先を見越して、X_ptr
すぐに のデータが必要になることを認識できますか? 次のコード行は役に立ちますか?
... // for loop
Position& nextPos1 = *posPointers[i];
Position& nextPos2 = *posPointers[i+1];
Position& nextPos3 = *posPointers[i+2];
Position& nextPos4 = *posPointers[i+3];
... // Work on data here
このようなコードがプロセッサに一部のデータをプリフェッチさせることを示しているように見えるプレゼンテーション スライドをいくつか読みました。本当?のようなプリフェッチを呼び出す非標準のプラットフォーム固有の方法があることは承知していますが__builtin_prefetch
、それをいたるところに投げることは、醜い時期尚早の最適化のように思えます。無意識のうちにキャッシュ効率の良いコードを書く方法を探しています。