最近、ループを使用して長い配列をスキャンすると、キャッシュのパフォーマンスが低下することに気付きました。なぜこれが起こるのか、この問題の回避策を教えてください。C/C++ を使用して Linux プラットフォームで作業しています
1 に答える
5
これは古典的なキャッシングの問題です。十分に大きな配列をループする場合、すべてのメモリ参照は既にフラッシュされたアイテムを参照するため、アイテムを RAM からキャッシュにフェッチする必要があります。最も単純なシナリオでは、キャッシュよりも 1 バイト大きい配列にアクセスするだけで、これが発生することがわかります。
洗練された予測フェッチ スキームでさえ、この問題の影響を受けます。キャッシング スキームに関係なく、すべてのメモリ参照でキャッシュ検証エラーが発生するフェッチ パターンを設計することは常に可能です。
幸いなことに、最新のキャッシング システムは、この影響を軽減するために懸命に働いています。たとえば、使用しているシステムはおそらく大規模な配列でフォワード フェッチを行うため、すべてのメモリ アクセスで障害が発生するわけではありません。最後に、キャッシング システムを理解するために時間を割いてください。おそらく、大学生時代に学習したアーキテクチャ クラスのノートを復習することもできます :-) キャッシング システムを操作するのに役立ちます。
于 2011-11-04T03:52:45.730 に答える