1. ホーム
  2. memory

[解決済み] キャッシュラインはどのように機能するのですか?

2022-03-09 04:48:26

質問

プロセッサはキャッシュラインを通じてデータをキャッシュに取り込みますが、例えば私のAtomプロセッサでは、実際に読み込まれるデータのサイズにかかわらず、一度に約64バイトを取り込むと理解しています。

私の疑問は

メモリから1バイト読み出す必要があると仮定して、どの64バイトをキャッシュに持ち込むか?

64バイトは、対象のバイトの下にある最も近い64バイトの境界から始まるか、64バイトが何らかの決められた方法でバイトの周りに広がっている(例えば、半分の下、半分の上、またはすべて上)かの2つの可能性が考えられます。

どっちなんだ?

解決方法は?

読み込むバイトまたはワードを含むキャッシュラインがまだキャッシュ内に存在しない場合、CPUはキャッシュライン境界から始まる64バイトを要求します(必要なバイトの下のアドレスで64の倍数である最大のもの)。

最近のPCのメモリモジュールは、一度に64ビット(8バイト)転送します。 8回転送のバーストで そのため、1つのコマンドでキャッシュライン全体の読み書きを行うことができます。 (DDR1/2/3/4 SDRAMのバースト転送サイズは最大64Bまで設定可能で、CPUはキャッシュラインサイズに合わせてバースト転送サイズを選択しますが、64Bが一般的です)

経験則では、プロセッサがメモリアクセスを予測できない(そしてプリフェッチする)場合、検索プロセスには~90ナノ秒、または~250クロックサイクル(CPUがアドレスを知ってからデータを受け取るまで)かかることがあります。

一方、最近のx86CPUでは、L1キャッシュのヒットのロードユーズレイテンシは3、4サイクル、ストアリロードのストアフォワーディングレイテンシは4、5サイクルである。 他のアーキテクチャでも似たようなものです。

さらに読む。Ulrich Drepperの プログラマーが知っておくべきメモリについての知識 . ソフトウェアプリフェッチのアドバイスは少し時代遅れです: 最近のハードウェアプリフェッチはより賢く、ハイパースレッディングは P4 時代よりはるかに優れています (従って、プリフェッチスレッドは通常無駄です)。 また x86 タグの wiki には、このアーキテクチャのパフォーマンスに関するリンクがたくさんあります。