c - 访问数组的连续元素时会发生什么类型的缓存未命中?
问题描述
在 C 中,f 你有这种类型的循环:
for (i = 0; i < N; i++)
sum += a[i]
其中数组“a”包含整数(4 个字节),一个缓存块可以存储 32 个字节,那么我知道每 8 次循环迭代都会有一个冷缺失,因为处理器会将 8 个整数加载到一个块中,然后在第 9 次迭代之前不会出现缓存未命中。我是否理解正确,当它在 a[0] 处发生缓存未命中时,它会将 a[0]-a[7] 加载到缓存块中,并且不会再次将任何“a”加载到缓存中,直到它得到[8] 的另一个冷小姐?
假设 ^^ 是正确的,我真正的问题是,如果你有这样的事情会发生什么:
for (i = 0; i < N; i++)
a[i] = a[i+1]
'a' 没有被初始化?你会得到与上面类似的东西吗,处理器会查找 a[i+1] 的每个连续值并且每 8 次才错过一次?或者它是否也在缓存中搜索 a[i] 以设置值?是否会有与 a[i] 或仅 a[i+1] 相关的缓存未命中?
最后,如果你有
for (i = 0; i < N; i++)
b[i] = a[i]
这是否类似于第一个示例,它查找 a[i] 的每个值并在每 8 次迭代时获取缓存未命中,或者设置 b[i] 的值是否也会导致缓存未命中?
谢谢!
解决方案
这取决于 asm 代码,您应该阅读它并查看您的程序是先读取 a[i] 还是先读取 a[i+1]。
推荐阅读
- python - 如何在一条消息中为 kafka 生成音频(.wav)
- python - 我不能使用 .append() 将值附加到带有 python 的字典中
- python - How can I only show a subset of xtick labels in seaborn catplot of scatter plots?
- laravel - 这是什么“cURL 错误 28:操作在 2000 毫秒后超时,收到 0 个字节中的 0 个字节”?
- python - 基于嵌套列表的第一个元素合并嵌套列表
- python - Django 将 ImageField 保存到 ForeignKey 对象
- sql - 一个带有两个外键的 sql 语句
- android - Android-Work Manager OnetimeWorkRequest 不工作(Android-Jetpack)
- javascript - 运行“开发”时出错:java.util.concurrent.ExecutionException:com.intellij.execution.ExecutionException:未指定可执行文件
- javascript - 现有站点上的 Vue.js 问题