如何解决在 2 路关联缓存上确定数组就地反转的缓存未命中数
考虑一台 32 位计算机。采用2路关联缓存,缓存块为8个字,512组。
考虑以下代码块
int A[N];
for(int i =0;i<N/2;i++){
int tmp = A[i];
A[i] = A[N-i-1];
A[N-i-1] = tmp;
}
假设 N 是 8 的倍数。确定缓存未命中数的公式,变量为 N。
我的研究:
内存中的每个块将有 8 个字(1 个字 = 32 位 = 4 个字节)
A block # b 将映射到 b mod 512
有512套。每个集合在缓存中有两行,每行是一个块。
因此,内容将从内存中分块传输到缓存中。
现在根据我的理解,记忆将以 8 个单词为单位进行组织。
假设 N = 8 * K
由于整数是 32 位。它会像:
A[0],A[1],A[2],A[3],..A[7]
A[8],...................A[15]
.
A[8*(K-1)],........A[N-1]
所以这就是 Array 在内存中的布局方式,有 K 个块。
当缓存未命中时,会将完整的一行传输到缓存中。
在第一次迭代代码将访问 A[0] 和 A[N-1]
所以第 0 行和第 K-1 行将被放入缓存中。
在第二次迭代时,它将访问 A[1] 和 A[N-2] 并且它们都已经在缓存中
按照这个逻辑,i=0 会有两次缓存未命中。
无 i=1,2,3,4,5,6,7
然后对于 i = 8,代码将再次访问 A[8] 和 A[N-9] 两次缓存未命中。
对于 i = N/2-5,它将访问 A[N/2-5] 和 A[N/2+4] 这两个将在不同的块中,因此再次出现两次
缓存未命中。
不确定我是否朝着正确的方向前进。我需要以 N 为单位提出缓存未命中数的公式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。