for ( i =0; i < 2; i++)
for( j = 0 ; j < 2: j++)
dst[j][i] = src[i][j]; 对于具有8字节高速缓存线和总高速缓存大小为16字节的高速缓存,回答键说:“请注意,每个高速缓存线正好持有阵列的一行,高速缓存大小正好足以容纳一个阵列,并且src和dst的第i行映射到相同的高速缓存线。”
因此,这种映射会导致非常具体的逐出。因为第一高速缓存线被逐出并用dst替换,所以它也未命中,而不是src仅具有for和1。为什么缓存没有驱逐第二个缓存线,它可能没有包含任何东西或者src的11。为什么src和dst的0行必须映射到相同的缓存线?是什么决定了这一点?
发布于 2018-06-04 07:42:07
典型的高速缓存实现使用地址位来选择保存地址的高速缓存组。这些位可以随实施方式的不同而变化,以及是使用虚拟地址位还是使用物理地址位。
问题语句告诉您,src和dst的地址相互映射到相同的缓存集。这也意味着,对于任何i,src+i和dst+i将映射到彼此相同的缓存集。
例如,假设在32位架构上,硬件使用地址位10-3来选择高速缓存组。位2-0索引每行中的8个字节。当处理器想要加载或存储地址时,硬件使用位10-3来选择高速缓存组。高速缓存组可以能够保持多个行。高速缓存中的每一行将包含记录其所对应的地址的位31-11的标签。因此硬件将把当前地址的位31-11与该组中的线的标签进行比较。如果没有匹配,它将选择集合中的一行进行驱逐,然后用新行替换它。
从一组中具有多个行的这种行为可以看出,硬件能够保持高速缓存组中的行的选择。但这需要大量的硬件来完成-当考虑一条线时,硬件必须评估集合中的每一条线。与整个高速缓存中的数千行相比,只针对一组中的四行执行此操作要容易得多。因此,硬件的构建仅具有有限数量的这种能力。这是一个更便宜的解决方案,但在缓存中保留哪些行提供了一定的灵活性。
您提供的问题描述似乎建议每个缓存组只能保存一行(尽管不清楚这一点)。这意味着,一旦使用相同高速缓存组的新行被使用,旧行就会被逐出。这是相当有限制的,在今天的硬件设计中通常是避免的。但它可能适用于一些教程示例。
https://stackoverflow.com/questions/50671247
复制相似问题