Caching 回迁在直写缓存中做什么?

Caching 回迁在直写缓存中做什么?,caching,cpu-architecture,Caching,Cpu Architecture,假设您有一个32字节的直接映射缓存,每个块16字节,它读取地址0xd。缓存的内容是什么?我原以为取数器会将0xd添加到集合1(第二个)字节6中的缓存中。但在我的模拟器中,0xc是一个热门,所以很明显这是错误的!非常感谢您的帮助。要确定在哪个集合中找到地址,请使用: (addr >> log2(block size)) & (number of sets - 1) (假设块大小和集合数都是2的幂,它们通常都是2的幂,因此&(n-1)与%n,一个模相同) 对于您的情况,它将是:

假设您有一个32字节的直接映射缓存,每个块16字节,它读取地址0xd。缓存的内容是什么?我原以为取数器会将0xd添加到集合1(第二个)字节6中的缓存中。但在我的模拟器中,0xc是一个热门,所以很明显这是错误的!非常感谢您的帮助。

要确定在哪个集合中找到地址,请使用:

(addr >> log2(block size)) & (number of sets - 1)
(假设块大小和集合数都是2的幂,它们通常都是2的幂,因此
&(n-1)
%n
,一个模相同)

对于您的情况,它将是:
(0xd>>4)&1
,即0

集合0中的块包含字节0x0到0xf,因此对0xc的引用是命中


它包含字节0x0到0xf的原因是,计算机内存系统通常设计为比未对齐的数据更快地处理自然对齐的数据。如果启动块的地址在地址的低位log2(N)位中有零,则大小为N的块自然对齐。因此,当引用地址0xd时,包含它的对齐块(起始地址为0x0)将加载到缓存中。

对于加载,写入策略无关紧要。它应该与直写缓存相同。0xd在前16个字节中,所以它在第一组中。@Peter Cordes是的,我错了。公式的后半部分错了。512组给出log2(512)=9=
0b1001
。实际上,对于使用连续地址位范围(从块内偏移量的正上方)作为索引的简单索引函数,您需要
&(set-1)
,即对集合数进行模化。(某些缓存对地址进行散列以确定集合(例如,当前Intel CPU上的L3缓存),以减少在工作集包含多个地址时发生的冲突未命中,这些地址之间的偏移量为2的高次方。(例如,许多阵列或函数都是2MB对齐的,或者出现其他意外情况。)@PeterCordes-修复!