データと命令に別々のL1キャッシュがあるのはなぜですか?


23

いくつかのスライドを調べてみると、L1キャッシュ(少なくともIntel CPUでは)がデータキャッシュと命令キャッシュを区別していることに気付きました。これがなぜなのか知りたいのですが。


回答:


28

実際にはいくつかの理由があります。

おそらく何よりもまず、命令キャッシュに格納されるデータは、一般的にデータキャッシュに格納されるデータとは多少異なります-命令自体とともに、デコーダーを支援するために、次の命令が始まる場所などの注釈があります。一部のプロセッサ(たとえば、Netburst、一部のSPARC)は、元の命令をエンコードされた形式で保存するのではなく、命令のデコード結果を保存する「トレースキャッシュ」を使用します。

次に、回路を少し簡素化します。データキャッシュは読み取りと書き込みを処理する必要がありますが、命令キャッシュは読み取りのみを処理します。(これは、自己変更コードが非常に高価な理由の一部です-命令キャッシュ内のデータを直接上書きする代わりに、書き込みはデータキャッシュを介してL2キャッシュに進み、その後命令キャッシュ内のラインが無効化されて再-L2からロード)。

第三に、帯域幅が増加します。最新のプロセッサのほとんどは、命令キャッシュとデータキャッシュから同時にデータを読み取ることができます。また、ほとんどはキャッシュへの「入り口」にキューを持っているため、任意のサイクルで実際に2回の読み取りと1回の書き込みを行うことができます。

第4に、電力を節約できます。内容を維持するためにメモリセル自体への電力を維持する必要がありますが、一部のプロセッサは、使用されていないときに関連する回路(デコーダーなど)の一部をパワーダウンできます。個別のキャッシュを使用すると、命令とデータのためにこれらの回路を個別に起動できるため、特定のサイクル中に回路に電源が供給されないままになる可能性が高くなります(x86プロセッサがこれを行うかどうかはわかりません-AFAIK、より多くのARM事)。


3
また、コードとデータが異なるアクセスパターンを示す可能性があることに言及することも重要です。たとえば、配列内のすべての要素を合計する命令は一時的な局所性を示し(同じ命令がよく使用されます(ループで行う場合))、配列内のデータは空間的な局所性を示します(次のデータが次に使用されます)。
ギャブリン

1
@gablin:trueの場合、これらのパターンの違いは、多くの場合、統合キャッシュを優先します。あなたが言及したようなタイトなループでは、命令キャッシュのほとんどがアイドル状態になっています。統合キャッシュは、ループの期間中、データキャッシュのサイズを基本的に2倍にします。
ジェリーコフィン

そこに多くのコードは、その小さなループの後だと、それはだから、本当に、ないにも可能性が高い配列を扱うことができます。これは、非常に多くのコード(文字列処理など)の特徴です。実際、CPUの最初のキャッシュはユニファイドキャッシュでした。CPUの主要なメモリインターフェイスと外部バスの間にあり、簡単に配置できましたが、実際にはより高速であるため、パーティションキャッシュを使用します
ドナルドフェローズ

@Donal Fellows:はい、本当に。早期キャッシュがどのように行われたか、そしてなぜそれらが分割キャッシュに変更されたかをよく知っています。
ジェリーコフィン

5

不動産と同様に、キャッシュの使用は、場所、場所、場所の3つの要素によって決まります。キャッシュを持つことのポイントは、ほとんどのプログラムが場所のパターンを示すことです。バイト1111111にアクセスする場合、アクセスする次のバイトはおそらく1111110または1111112であり、バイト9999999はそれほど多くありません。指示とデータの場所のパターン。これは、命令とデータがキャッシュを効率的に共有できる可能性が低いことを意味します。なぜなら、命令とデータは必ずしもメモリ内で互いに近くにあるとは限らないからです。データアクセスはキャッシュから命令をバンプし、ロード命令はキャッシュからデータをバンプします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.