1

大きな配列があり、複数のスレッドが配列から読み取っているとします。各スレッドは、一定量ジャンプすることによって配列を反復しますが、異なるオフセットから開始します。そのため、スレッド 1 は要素 0 から開始し、要素 32、64、96 などを読み取ります。しかし、スレッド 2 は要素 1 から開始し、要素 33、65、97 などを読み取ります (「要素」が通常、最高のキャッシュ パフォーマンスを得るには空間的な局所性が望ましいことは知っていますが、最近の CPU にはアクセスのパターンを探すハードウェア プリフェッチャーがあることも読んだことがあります。明らかなパターン。

  • このキャッシュは最新のボックスで使いやすいですか?
  • ストライドをキャッシュ ラインよりも大きくするとどうなりますか?
  • 答えは複数のスレッドの使用によって影響を受けますか (同じメモリにアクセスしているにもかかわらず、異なるキャッシュを持つ異なるコアで実行されている可能性があります)?
4

1 に答える 1

5

キャッシュのパフォーマンスは非常に複雑であり、本当に信頼できる答えは、特にディスパッチのスケジューリングに取り組むハードウェア設計者またはオペレーティングシステム開発者から得られます。私は以前、大規模なIBMシステムのパフォーマンス分析ツールで作業していたので、部分的に少し古くなった答えを出すことができます。

まず、キャッシュメモリはアドレスによって関連付けられます。メモリの一部がアドレス指定されると、そのアドレスの「キャッシュライン」がキャッシュにロードされます。プロセッサの設計に応じて、これは4、8、16、または32バイトの長さになります。(多分もっと。)これはおそらくハードウェアアドレスの「配置」に基づいているでしょう。つまり、32バイトのラインは、32で割り切れるアドレスと整列する境界上にあります。メモリ参照は、そのキャッシュラインの最初、中間、または最後にある可能性があります。

キャッシュに入ると、アドレスはキャッシュされたデータを見つけるための「ルックアップ」として使用されます。

参照の局所性は、キャッシュラインが十分に大きいため、キャッシュラインの一部としてキャッシュされた「隣接する」アイテムが参照される場合に役立ちます。配列をジャンプすると、これが無効になります。

キャッシュの設計は、ベンダー、製品ライン、プロセッサの価格などによって大きく異なります。完全なキャッシュの最適化は、(1)実行するマシンについて十分に理解していて、(2)他のマシンで実行することに本当に興味がない場合を除いて、非常にわかりにくいでしょう。

考慮すべきもう1つの要素は、32ビットアドレスが64ビットアドレスの半分のサイズであり、これがキャッシュできるデータの量に大きな影響を与えることです。アドレスにより多くのビットを与えることは、多かれ少なかれデータのためのより少ないビットを意味します。

プリフェッチは科学よりも魔術です。データからキャッシュへのメモリのフェッチは、プロセッサの実行から非同期である場合でもコストがかかります(ただし、実行から離れすぎていることはありません)。参照の局所性は良いルールですが、マイクロスケールでのコード実行と必ずしも一致しない方法でハードウェアアーキテクチャに基づくことになります。LRU(最も最近使用されていない)は、キャッシュから何を起動するかを決定する一般的な方法ですが、キャッシュから何かを削除して、使用されなくなったもののためのスペースを確保することは、それほど良い最適化ではありません。したがって、控えめに言っても、プリフェッチは賢明です。

編集:仮想メモリの問題、タスク切り替えなど。

特に複数のアドレス空間をサポートするオペレーティングシステムでは、仮想メモリによって物事がはるかに興味深いものになります。キャッシュは仮想アドレスではなく実際のアドレスに基づいている可能性が高いため、ページスワップなどは、キャッシュに興味深い副作用をもたらす可能性があります。通常、スワップアウトまたはリリースされる予定のページは最初に無効化され、「フラッシュリスト」(スワップファイルに書き込むことができる)または「フリーリスト」に移動されます。実装によっては、これらのページはアプリケーションによって再利用できますが、アドレス指定できなくなります。つまり、再利用の過程でページフォールトが発生します。そのため、ページがアプリのワーキングセットから移動されると、それに関連付けられているキャッシュラインが無効になる可能性が非常に高くなります。ページが頻繁に使用されていない場合は、

また、一部のキャッシュデザインには「共有」キャッシュがあり、ほとんどまたはすべてにプロセッサ固有およびコア固有のキャッシュがあります。キャッシュが特定のプロセッサまたはコアに指定されており、そのコアがタスクを変更する場合、新しいプロセスによる破損を回避するために、キャッシュ全体がフラッシュされる可能性があります。スレッドは同じプロセスと同じアドレス空間で実行されるため、これにはスレッドの切り替えは含まれません。ここでの本当の問題は、システム上の他のアプリケーションでの高いアクティビティがキャッシュのパフォーマンスに影響を与える可能性があることです。共有キャッシュはこの問題をある程度軽減しますが、破損を避けるために、より注意深く管理する必要があります。

于 2009-10-28T20:04:09.557 に答える