缓存行刷新是否将整行写入内存?

时间:2013-08-01 18:37:53

标签: caching assembly flush

当刷新脏缓存行时(由于任何原因),写入内存或CPU的整个缓存行是否跟踪写入哪些字并减少内存写入次数?

如果这在架构之间有所不同,我主要是想知道Blackfin的这个,但听听x86,ARM等的实践会很好...

2 个答案:

答案 0 :(得分:2)

我从15年前的课程中清除了我的蜘蛛网计算机架构知识 - 如果我完全错了,请善待。

我似乎记得x86,MIPS和摩托罗拉,全线都写完了。这是因为高速缓存行与总线宽度相同(除非在非常奇怪的情况下,例如发霉的旧386-SX线路,这是一个带有16位总线的32位架构),所以尝试没有意义要进行逐字优化,无论如何都要编写整行。

我无法想象任何类型的硬件架构会做出任何不同的情况,但过去我一直都知道这是错误的。

答案 1 :(得分:2)

通常如果你有一个写缓冲区,它会通过写缓冲区(整个缓存行)刷新。然后写缓冲区在某一点完成对ram的写入。我没有听说过一个缓存跟踪每个项目在一行中哪些部分是脏的,这就是为什么你有一个缓存行。因此,对于我听说过整条生产线的情况。另一点是,缓存DDR背面的慢速内存并不少见,例如,通过一些固定宽度访问,一次只有32位,一次128位,或者每个部分是在那个宽度,有多个部分。这样的事情,所以要避免读取 - 修改 - 写入你想要完整的ram宽度大小。高速缓存行是其中的倍数,当然,并且存在不进行写入的机会。如果该ram上有ecc,那么你需要一次写一个完整的ecc线以避免读 - 修改写。

在缓存行中每个可写项目需要一个脏位,以便将脏位存储增加一些,这可能会或可能不会对大小或成本产生实际影响等。可能有也可能没有每个事务的ram端的开销,并且执行多字事务而不是甚至两个单独的事务可能更便宜,因此该方案可能创建性能命中而不是提升(写缓冲区内的相同问题,而不是一个事务一个起始地址和长度,现在是多个交易)。

对于可能会或可能不会产生收益的事情,似乎有很多工作要做。如果您找到一个,请在此处发布。