|
发表于 2016-7-26 10:13:49
|
显示全部楼层
如果本次读操作刚好命中,但被替换的cache块有脏数据,那么cache可以先读再写回脏数据吗?这样可以早点返回 ...
董小三 发表于 2016-7-25 22:33
你确定明白自己问的问题?
既然说的是dirty data, 那你应该说的是data cache,
data cache如果是dirty, 为什么read hit后需要回写?
data cache的write一般就write-back, write-through两种,
对于write-through, 数据写到cache也会同时写的level2, 或者memory, 此问题不存在;
对于write-back, 数据写的cache, 做dirty标记。数据仅在cache line被替换时才回写。
如果是read hit, 不会发生回写。 无论是单核还是存在共享data的多核, 都不会发生。
对于多核, 如果存在data share, 就有cache coherence,
cache一致算法目录流行的是directory-based和snooping,原理基本一致。
如果你是一个共享数据的write master, 那情况和单核是一样的。 一致性有coherence控制器
维护,用于更新所以数据副本。
如果你仅仅是维护一个数据的副本, 当数据被master更新后,coherence控制器会标记这个副本为invalid.
这时候dirty标记是无效的。
如果你问的是cache miss, 问题才是成立的。因为此时才可能有cache line被回写。
这种情况下, 你说的方法也是可以的。 没有必要等回写后才把读的数据给内核。
数据既然是可以被cache的, 那就说嘛没有I/O问题,可以回写和读并行。
只是你需要做一个单独的临时的cache line, 当做一个buffer用,以备更新cache.
================================================
对于full associative和N-way set associative, 其实很好理解
搞清楚way/set的含义就清楚了。
full associative, 就是full-way full-set的意思,
way可以理解为通道,这个通道是用高位地址作为tag索引。
set可以理解为a set of cache lines。就是一组cache line的集合。对应一个way.
full-way, full-set就是一个cache line对于一个way。
full associative用的不多, 特别是对于cache比较大的,如果要做到高速,面积和功耗会比较大,
如果内核的cache较小, 可以考虑用这个结构。 |
|