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