【发布时间】:2013-08-01 18:37:52
【问题描述】:
当一个脏缓存行被刷新时(由于任何原因),是整个缓存行写入内存还是 CPU 会跟踪写入哪些字并减少内存写入次数?
如果这在架构之间有所不同,我主要想知道 Blackfin 的这一点,但很高兴听到 x86、ARM 等方面的实践...
【问题讨论】:
当一个脏缓存行被刷新时(由于任何原因),是整个缓存行写入内存还是 CPU 会跟踪写入哪些字并减少内存写入次数?
如果这在架构之间有所不同,我主要想知道 Blackfin 的这一点,但很高兴听到 x86、ARM 等方面的实践...
【问题讨论】:
通常,如果您有一个写缓冲区,它会通过写缓冲区(整个缓存行)刷新。然后写入缓冲区在某个时候完成对 ram 的写入。我还没有听说过一个缓存可以跟踪一行中的每个项目哪些部分是脏的,这就是为什么你有一个缓存行。因此,对于我听说过的情况,整条线路都消失了。另一点是高速缓存 DDR 背面的慢速存储器并不罕见,例如,通过某个固定宽度访问,一次 32 位一次 一次 64 位一次 一次 128 位,或者每个部分都是在那个宽度上,有多个部分。那种事情,所以为了避免读-修改-写,你想写成完整的内存宽度大小。当然,缓存行是它的倍数,并且存在不进行写入的机会。此外,如果该 ram 上有 ecc,那么您需要一次写入整个 ecc 行以避免读取修改写入。
缓存行中的每个可写项目都需要一个脏位,以便将脏位存储乘以一定数量,这可能会对大小或成本等产生实际影响,也可能不会。可能有也可能没有每个事务在 ram 端的开销,并且执行一个多字事务而不是两个单独的事务可能更便宜,因此该方案可能会造成性能损失而不是提升(写入缓冲区内的相同问题,而不是一个事务起始地址和长度,现在是多个事务)。
对于可能会或可能不会带来收益的事情,似乎需要做很多工作。如果你找到了,请在此处发布。
【讨论】:
我正在从 15 年前的课程中学习我的蜘蛛网计算机架构知识——如果我完全错了,请多多指教。
我似乎记得 x86、MIPS 和摩托罗拉,整行都写好了。这是因为缓存线与总线宽度相同(除了在非常奇怪的情况下,例如发霉的旧 386-SX 线,它是 32 位架构和 16 位总线),所以尝试没有意义要进行逐字优化,无论如何都要编写整行。
我无法想象任何类型的硬件架构会做任何不同的事情,但我过去知道我是错误的。
【讨论】: