为什么 RAM 的写入速度低于读取速度?缓存是如何出现的?

use*_*278 5 memory bandwidth nehalem cache

首先,这是真的,对吧?我觉得读取总是比写入快,这里的这个人也做了一些实验来“证明”它。他没有解释原因,只是提到了“缓存问题”。(而且他的实验似乎并不担心预取)

但我不明白为什么。如果重要的话,让我们假设我们谈论的是 Nehalem 架构(如 i7),它为每个内核提供 L1、L2 缓存,然后是共享的包容性 L3 缓存。

可能这是因为我没有正确理解读写是如何工作的,所以我会写下我的理解。请告诉我是否有问题。

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
Run Code Online (Sandbox Code Playgroud)

不确定最后一步。数据是否会渗透到缓存中,这意味着在缓存未命中的情况下,内存首先被读入 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?
Run Code Online (Sandbox Code Playgroud)

再次不确定最后一步。写入是否可以“绕过”所有缓存或写入涉及始终首先读入缓存,修改缓存副本并让直写硬件实际写入 RAM 中的内存位置?(写入 = 读取所有缓存 + 从 RAM 读取到缓存 + 写入到缓存,并行写入 RAM ==> 写入几乎是读取的超集?)

Dav*_*vid 5

内存必须将其位存储在两个状态中,这两种状态之间有很大的能量屏障,否则最小的影响就会改变位。但是在写入内存时,我们必须积极克服那个能量障碍。

克服 RAM 中的能量障碍需要等待能量移动。只需查看该位设置的内容即可花费更少的时间。

有关更多详细信息,请参阅MSalters 对类似问题的出色回答

我不确定缓存如何与 RAM 交互的细节以任何权威回答这部分问题,所以我将把它留给其他人。