まず、これは本当ですよね?読み取りは書き込みよりも常に速いと思います。また、この男 ここ はそれを「証明」するためにいくつかの実験を行います。彼はその理由を説明せず、「キャッシュの問題」について言及しているだけです。 (そして彼の実験はプリフェッチについて心配していないようです)
しかし、その理由はわかりません。重要な場合は、コアごとにL1、L2キャッシュ、次に共有の包括的L3キャッシュを備えたNehalemアーキテクチャ(i7など)について話していると仮定します。
おそらくこれは、読み取りと書き込みがどのように機能するかを正しく理解していないためです。そのため、理解を記述します。何かおかしいのなら教えてください。
If I read some memory, following steps should happen: (assume all cache misses)
1. Check if already in L1 cache, miss
2. Check if in L2 cache, miss
3. Check if in L3 cache, miss
4. Fetch from memory into (L1?) cache
最後のステップについてはよくわかりません。データはキャッシュに浸透しますか?つまり、キャッシュミスの場合、メモリは最初にL3/L2/L1に読み込まれ、次にそこから読み込まれますか?または、すべてのキャッシュを「バイパス」して、後でキャッシュを並行して実行することもできます。 (読み取り=すべてのキャッシュにアクセス+フェッチからRAMキャッシュへ+キャッシュから読み取る?)
Then write:
1. All caches have to be checked (read) in this case too
2. If there's a hit, write there and since Nehalem has write through caches,
write to memory immediately and in parallel
3. If all caches miss, write to memory directly?
最後のステップについてもよくわかりません。すべてのキャッシュを「バイパス」して書き込みを行うことはできますか、または書き込みには、常に最初にキャッシュに読み込み、キャッシュされたコピーを変更し、ライトスルーハードウェアに実際にRAMのメモリ位置に書き込むようにする必要がありますか? (書き込み=すべてのキャッシュの読み取り+フェッチからRAMキャッシュへ+キャッシュへの書き込み、書き込みRAM並列==>書き込みはほとんど読み取りのスーパーセットです?)
メモリは、ビット間に大きなエネルギー障壁がある2つの状態でビットを格納する必要があります。そうしないと、最小の影響でビットが変更されます。しかし、その記憶に書き込むとき、私たちはそのエネルギー障壁を積極的に克服しなければなりません。
RAMのエネルギー障壁を克服するには、エネルギーが移動するまで待つ必要があります。ビットが何に設定されているかを確認するだけで、時間がかかりません。
詳細については、 MSaltersのやや類似した質問に対する優れた回答 を参照してください。
キャッシングがRAMとどのように相互作用するかについての詳細が十分にわからないので、質問のその部分に任意の権限で答えます。
書き込みケース:メモリに書き込むものがあり、すべてのキャッシュを無視して優れたメモリコントローラがある場合は、書き込みたいデータを使用してトランザクションをメモリコントローラに送信するだけです。メモリオーダリングルールにより、トランザクションがコアを離れるとすぐに、ハードウェアがメモリへの書き込みを処理していると想定できるため、次の命令に進むことができます。これは、書き込みに実質的に時間がかからないことを意味します。
Read Case:一方、読み取りはまったく異なる操作であり、キャッシュによって大幅に支援されます。データを読み込む必要がある場合は、実際にデータを取得するまで、プログラムの次のステップに進むことはできません。つまり、最初にキャッシュをチェックし、次にメモリをチェックしてデータの場所を確認する必要があります。データがどこにあるかに応じて、それに応じてレイテンシーが低下します。非スレッド、非パイプラインコア、非プリフェッチシステムでは、データが返されるのを待っているコアサイクルを燃焼しているだけなので、次のステップに進むことができます。キャッシュとメモリは、コア速度/レジスタスペースよりも桁違いに低速です。これが、読み取りが書き込みよりもはるかに遅い理由です。
書き込みトランザクションに戻ると、速度で遭遇する可能性がある唯一の問題は、同じアドレスへの書き込みトランザクションの後に読み取りを実行している場合です。その場合、アーキテクチャでは、読み取りが書き込みを飛び越えないようにする必要があります。もしそうなら、あなたは間違ったデータを取り戻すでしょう。本当にスマートなアーキテクチャを使用している場合、その書き込みはメモリに向かって伝播するため、同じアドレスへの読み取りが行われると、ハードウェアはデータがメモリに出力される前にデータを返すことができます。この書き込み後の読み取りの場合でも、コアの観点から時間がかかるのは書き込みではなく、読み取りです。
RAMの観点から:コアについて話しているのではなく、RAM /メモリコントローラーについてのみ話している場合でも、MCへの書き込みを行うと結果としてMCはそれをバッファーに格納し、トランザクションが完了したことを示す応答を送り返します(完了していない場合でも)。バッファを使用すると、MCが処理するため、実際のDIMM/RAMの書き込み速度について心配する必要はありません。この場合の唯一の例外は、書き込みの大きなブロックを実行していて、MCバッファーの機能を超えている場合です。その場合、RAMの書き込み速度について心配し始める必要があります。そして、それはリンクされた記事が言及しているものです。次に、Davidの答えが触れている読み取り速度と書き込み速度の物理的な制限について心配し始める必要があります。通常、それはコアがとにかく行うのは馬鹿げたことです。そのため、DMAが発明されました。しかし、それはまったく別のトピックです。