2013-02-07 39 views
3

方案cpu缓存如何处理大内存对象?

  • 高速缓存(L1)的大小(CS):32kB的
  • 线尺寸(LS):64B
  • 关联性(A):8
  • 集大小(SS): 512B(A * LS
  • 套(S):64(C/SS
  • 读/写的对象(O)的尺寸比LS

假设更大(如果无效指正):

  • 虚拟内存块(容量4KB(SS * A的)表示为B)以模似方式映射到集。换句话说,地址0x0 : 0xFFFF(块索引(BI)0)被映射到集合0,0x1000 : 0x1FFFBI1)被映射到1,等等。
  • 读取/写入请求(不使用非时间性写入/读取)给定地址A要求找到其BI,然后将其移动到指定集。例如,A = 0x4600A将具有BI = 70.这BI被映射到集合6(BIS)。
  • 为了正确(没有未对齐)r/w对象(O)进行缓存,需要对齐LS

问题

  1. 请问O在缓存中连续对齐的,或者它可以采取(例如)免费时隙0 5,而不是0 2?
  2. 从缓存中检索分区O的成本(惩罚)是多少?假设O未被分割为几个B
  3. 与上述相同的问题,但在O被置于两个B中的情况下,因此使用了两组。
  4. 如果O尺寸大于SS(512B),会发生什么情况?它会将数据移动到L2并逐步将数据移动到L1吗?它会使用其他套件吗?
  5. 如果L2(和L3就此而言)对于所有数据来说太小,该怎么办?
+1

这和C++ 11有什么关系? –

+0

@BartekBanachewicz主要是因为'alignas()'提供了简单和标准化的对齐操作。当您开始对齐数据以优化缓存性能时,我认为自然会要求缓存大对象的成本。 –

+0

呃。这听起来很像*过早的优化。 –

回答

1

虚拟存储器块(大小的4kB(SS * A)表示为B的)被映射在模状 到集。换句话说,地址0x0:0xFFFF (块索引(BI)0)被映射到集合0,0x1000:0x1FFF(BI 1)是 映射到1,依此类推。 L1高速缓存和存储器层级之间

转移: L1高速缓存和存储器层级的以下电平之间的传送单元是的行大小(LS)字节的块。也就是说,对于L1高速缓存,内存以64字节块(LS字节)构成。

内存块和高速缓存项之间的对应关系: 连续内存块被映射到连续集的高速缓存行。因此,块0(地址0x0000 : 0x003F)映射到集合0处的高速缓存行,块1(地址0x0040 : 0x007F)映射到集合1处的高速缓存行,等等。


请求的读/写(无非时间写/读操作被使用)的 给定地址的需要找到其BI,然后将其移动到 分配集。例如,A = 0x4600A将具有BI = 70。该BI被映射到集合6(BI%S)的 。

正确的步骤,以找到块标识符(或索引)和该组索引(SI)如下:

BI = A >> LS = 0x4600A >> 6 = 0x1180 
SI = BI & (S-1) = 0x1180 & 0x3F = 0x0000 
(when S is a power of two, BI & (S-1) = BI mod S) 

为了正确地(无位置偏移)R/w缓存一个对象(O)到 ,LS的对齐是必需的。

这没有必要。 O不需要被块对齐。


Q1。请将O按顺序排列在高速缓存中,否则可能需要(对于 实例)空闲插槽0 5而不是0 2?

O将存储在具有缓存行粒度(集合k,k + 1,...,S-1,0,1,...)的连续集合中。第二季度销售价格指数为:

Q2。从缓存中检索分区O的成本(惩罚)是多少? 假设O没有被划分为几个B. Q3。与上面相同的问题,但是当O被放置在两个B中时,因此使用两组。

我假设您对读取缓存中的O字的CPU成本感兴趣。 假设顺序引用O,缓存访问的数量将等于引用字的数量。我认为成本不取决于块在相同或不同的集合(至少在多端口缓存中)。

Q4。如果O尺寸大于SS(512B),会发生什么情况?将 它将数据移动到L2并逐步移动数据到L1?它会使用 其他集? Q30。

Q5。如果L2(和L3就此而言)对于所有数据来说太小,该怎么办?

如果必须将块分配给没有空闲缓存行的组,则必须选择一个块才能被逐出(受害块)。替换策略根据algorithm(LRU,pLRU,random)选择受害块。

+0

我不能投票,因为这个主题是我的深度的方式,但我希望有更多的问答这样的。口头+1目前。 – deceze