web-dev-qa-db-ja.com

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

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

23
Nils

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

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

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

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

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

28
Jerry Coffin

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

5