ここ から:
命令とデータは異なるアクセスパターンを持ち、メモリの異なる領域にアクセスします。したがって、命令とデータの両方に同じキャッシュを使用すると、常にうまくいくとは限りません。
したがって、2つのキャッシュを持つのが一般的です。1つは命令のみを保存する命令キャッシュ、もう1つはデータのみを保存するデータキャッシュです。
命令とデータの違いを理解するのは直感的ですが、今ではこのコンテキストの違いがわかりませんか?何がデータとして構成され、データキャッシュに配置され、何が命令として構成され、命令キャッシュに配置されますか?
ARMアセンブリ。STR
、LDR
、LDMF
、またはSTMFD
を必要とするものはデータキャッシュを使用しますか?しかし、技術的に言うと、STR
、LDR
、LDMF
、STMFD
はすべて指示なので、混乱しているのはこのためです。 「命令」?データは.data
セクション?
例えば LDR R1, =myVar
その後、LDRは命令キャッシュに入り、myVarの内容はデータキャッシュに入りますか?それとも、そのように機能しませんか?
命令とデータは異なるアクセスパターンを持っています
役立つ投稿で行ったこのコメントは、私の理解の難しさを強調しています。
「アイデアは、命令がメモリからロードされた場合、すぐに再び使用される可能性が高いということです」が、次の命令を知る唯一の方法はそれを読み取ることです。これは、メモリの読み取りを意味します(新しい命令が赤であるため、キャッシュに既にあるとは言えません)。だから私はまだポイントが見えませんか? LDR命令が発生したと言うと、LDRはデータキャッシュ内にあります。別のLDR命令が発生する可能性がありますが、発生しない可能性があるため、次の命令を実際に読み取らなければならないので、キャッシュの目的を無効にします。
命令フェッチは、多くの時間を連続して多くの命令を実行することを想定して、チャンクで実行できます。そのため、命令フェッチはより効率的になる可能性があり、トランザクションごとにオーバーヘッドのクロックが少数またはそれ以上発生する可能性があり、メモリがデータを準備できるまでの遅延と、トランザクションのサイズに対するバスの幅ごとのクロックが発生します。 8ワードまたは命令は、たとえば5 + n + 8クロックである場合があります。これは、一度に1つの命令(5 + 1 + 1)* 8よりも効率的です。
一方、データは多くの時間で連続して読み取られるため、追加のサイクルが破損する可能性があるという仮定は良くありません(要求されたデータのみを取得します(メモリまたはバスの幅まで無料です) )。
ARMでは、L1キャッシュIとDは別々であり、L2は組み合わされていることを知っています。 L1はaxi/ambaバス上になく、L2およびそれ以上のamba/axiよりもアクセス効率が高い可能性があります(オーバーヘッドの数サイクルと時間、各トランザクションのデータのバス幅ごとに1クロック)。
キャッシュ可能(mmuがオンの場合)としてマークされているアドレススペースの場合、L1とその結果、L2は、データの個々のアイテムの代わりにキャッシュラインをフェッチし、おそらく命令フェッチのIデータのフェッチ量を超えます。
Ldrおよびldm命令のそれぞれは、アドレスがキャッシュ可能であればL2およびL1キャッシュにまだ存在していなければ、データサイクルが発生する可能性があります。キャッシュ可能なアドレスにある場合は、命令自体もまだ存在しない場合はL2およびL1キャッシュに移動します。 (はい、キャッシュ可能なものとそうでないものを制御するためのノブがたくさんあります。これらのニュアンスにしたくないので、議論のためにこれらの命令フェッチとデータアクセスはすべてキャッシュ可能です。).
ループがある場合、またはそのコードを再度実行する場合に備えて、キャッシュで実行されたばかりの命令を保存する必要があります。また、キャッシュラインに続く命令は、より効率的なアクセスの節約されたオーバーヘッドの恩恵を受けます。ただし、キャッシュラインのごく一部を実行するだけの場合は、これらのサイクル全体が無駄になり、それが多すぎるとキャッシュが遅くなります。
何かがキャッシュにあると、次に読み取られる(または設定に応じて書き込まれる)ときに、キャッシュコピーが使用されますが、低速メモリのコピーではありません。最終的に(設定に応じて)書き込み(str、stm)により一部のアイテムのキャッシュコピーが変更され、新しいアクセスをキャッシュに保存する必要がある場合、古いものは低速メモリに追い出され、書き込みが行われますメモリを遅くするキャッシュが発生します。命令でこの問題が発生することはありません。命令は基本的に読み取り専用であるため、スローメモリに書き戻す必要はありません。理論的にはキャッシュコピーとスローメモリコピーは同じです。
ldr r1,=myvar
pCの相対負荷になります
ldr r1,something
...
something: .Word myvar
ldr命令は、キャッシュラインフェッチの一部であり、命令フェッチ(さらに多くの命令とともに)の一部になります。これらは、アーム上のL1キャッシュのI部分とL2の共有部分(有効な場合など)に保存されます。その命令が最終的に実行されると、何かのアドレスでデータの読み取りが発生します。その読み取りでその領域でキャッシュが有効になっている場合、まだ存在しない場合は、L2およびL1キャッシュ(D部分)にも移動します。ループしてすぐにその命令を再度実行すると、理想的には命令はL1キャッシュにあり、フェッチするためのアクセス時間は非常に高速で、わずか数クロックです。また、データはL1キャッシュに格納され、読み取り用の少数のクロックにもなります。
上記の5 + n + 8、オーバーヘッドのクロック数(5は単なる可能性であり、設計および他の並列処理の両方によって異なる場合があります)。 Nは、遅いメモリ速度に依存します。 nはdramに対して非常に大きいため、キャッシュl2およびL1ははるかに高速です。そのため、dramアクセスごとに多数のクロックサイクルを効率的にまたは効率的に削減するためにキャッシュが存在します。
命令キャッシュには、実行のためにメモリからフェッチされたキャッシュラインが含まれます。データキャッシュには、レジスタとしてデータとしてロードするためにメモリからフェッチされたキャッシュラインが含まれます。
命令キャッシュは、命令に高速にアクセスするための単なる別のレベルのメモリです。 CPUの時計仕掛け/内部部品/フェッチ-デコード-実行ロジックの一部ではありませんが、名前を付けます。
つまり、命令がキャッシュされると、CPUメモリレベルに非常に近いため、CPUがアドレスXで命令をロードする必要がある場合、他のアドレスYと比較して非常に高速です。
CPUは内部的に命令をキャッシュしません。
命令とデータは異なるアクセスパターンを持っています
たとえば、命令を更新(上書き)するのは嫌で、一般的ではありません。したがって、命令用のキャッシュを設計すると、読み取り用に最適化できます。また、命令はシーケンシャルなので、cpuがNの命令にアクセスする場合、N + 1の命令にもアクセスする可能性があります。ただし、これら2つのプロパティは、データキャッシュにとってそれほど重要ではないか、データキャッシュをより詳細にする必要があります。