c++ - 访问多个数组时 cpu 缓存会做什么?
问题描述
假设我们有 2 个巨大的数组(20MB+),我们做这样的事情:
for(int i = 0; i < length; i++) {
arrayA[i] = 13;
arrayB[i] = 13;
}
这将如何加载到缓存中?何时从缓存中卸载?
解决方案
CPU 缓存老实说有点善变,但是有一些方法可以改进缓存,对于一个不惜一切代价避免多维数组和嵌套向量,CPU 缓存讨厌这些,也避免任何类型的链表,或者像我一样喜欢称它们为菊花链类型,例如链表、无序映射和其他标准容器,它们不会平坦地存储在内存中,因此 CPU 不会缓存它,如果你想使用 CPU 缓存,你最好的朋友就是旧向量一个类型安全的平面数组,或者使用标准数组,或者去老学校,简单地使用一个 C 风格的数组,这些都是平面容器,当 CPU 缓存中有空间时,大多数时候会被缓存,CPU 还有很多缓存,但这只是一个非常基本的见解,在涉及缓存时,在容器方面什么和不使用什么,如果你在 google 上搜索 c++ 缓存友好代码,GameDev net 和其他网站上有一些非常好的文章,
所以简单地说你当前的代码不会被缓存......好吧,我不会说这些天CPU变得非常好,但是缓存不会有利于你的代码,并且会选择在需要时从内存中调用它在某些情况下会影响你的表现,
希望这能有所启发(=
推荐阅读
- go - Go mod private repo 在 cloudbuild 中读取错误的路径
- python - 以新的表/数据框格式有效地将 spark 数据框列转置/分解为行 [pyspark]
- java - 退出while循环在java中不起作用
- python - 用另一个词替换一个词的每个实例,而不会破坏包含该词的其他词
- dataframe - 如何在 Pyspark 中设置 KryoSerializer?
- c - 使用 libnet 发送的 Rst 数据包不会重置连接
- c# - 二维数组切片
- sharepoint - 在线整合sql数据库中的数据到sharepoint
- javascript - 是否可以使用 Microsoft 身份验证库从 SPA 进行身份验证但没有重定向 Uri?
- selenium - Selenium 错误消息 (nvalidArgumentException)