Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是什么使两个数组映射到同一缓存线? (i=0;i_C++_C_Caching - Fatal编程技术网

C++ 是什么使两个数组映射到同一缓存线? (i=0;i

C++ 是什么使两个数组映射到同一缓存线? (i=0;i,c++,c,caching,C++,C,Caching,对于具有8字节缓存线且总缓存大小为16字节的缓存, 答案是 请注意,每个缓存线正好容纳数组的一行,缓存的大小正好足以容纳一个数组,并且src和dst的行i映射到同一缓存线。 " 所以这个映射会导致非常具体的逐出。与src仅对[0][0]和[1][0]未命中不同,它还未命中[0][1],因为第一条缓存线已被逐出并替换为dst[0][0][0][1]。为什么缓存没有逐出第二个缓存线,该缓存线可能不包含任何内容或src的[1][0][1][1]。为什么src和dst的0行必须映射到同一缓存线?这是什么

对于具有8字节缓存线且总缓存大小为16字节的缓存, 答案是 请注意,每个缓存线正好容纳数组的一行,缓存的大小正好足以容纳一个数组,并且src和dst的行i映射到同一缓存线。 "


所以这个映射会导致非常具体的逐出。与src仅对[0][0]和[1][0]未命中不同,它还未命中[0][1],因为第一条缓存线已被逐出并替换为dst[0][0][0][1]。为什么缓存没有逐出第二个缓存线,该缓存线可能不包含任何内容或src的[1][0][1][1]。为什么src和dst的0行必须映射到同一缓存线?这是什么决定的

典型的缓存实现使用地址位来选择保存地址的缓存集。哪些位可能因实现而异,以及使用的是虚拟地址位还是物理地址位

问题陈述告诉您,
src
dst
的地址映射到彼此相同的缓存集。这也意味着,对于任何
i
src+i
dst+i
将映射到彼此相同的缓存集

例如,假设在32位体系结构上,硬件使用地址位10-3来选择缓存集。位2-0索引每行中的八个字节。当处理器想要加载或存储地址时,硬件使用位10-3选择缓存集。缓存集可以容纳多行。缓存中的每一行将包含一个标记,该标记记录其对应地址的位31-11。因此,硬件会将当前地址的位31-11与集合中线路的标记进行比较。如果不匹配,它将拾取集合中要逐出的一行,然后将其替换为新行

我们可以从一个集合中有多条线的行为中看出,硬件能够在缓存集合中保留一系列线。但是要做到这一点需要很多硬件。当考虑一条线路时,硬件必须评估一组中的每一条线路。对一组中的四行执行此操作要比对整个缓存中的数千行执行此操作容易得多。因此,硬件的这种能力是有限的。这是一个便宜得多的解决方案,但在缓存中保留哪些行方面有一定的灵活性

您提供的问题描述似乎表明,每个缓存集只能容纳一行(尽管对此尚不清楚)。这意味着使用相同缓存集的新行一经使用,旧行就会被逐出。这是相当严格的,通常是避免在设计硬件时,今天。但它可能适用于一些教程示例

for ( i =0; i < 2; i++)
for( j  = 0 ; j < 2: j++)
dst[j][i] = src[i][j];