了解CPU如何决定加载到缓存中的内容

时间:2013-09-02 08:32:22

标签: c++ caching optimization

假设一台计算机有64k的L1缓存和512k的L2缓存。

程序员已在主存储器中创建/填充了数据量为10mb的数组(例如,3d模型的顶点/索引数据)。

数组可能包含一系列结构,如:

struct x
{
  vec3 pos;
  vec3 normal;
  vec2 texcoord;
};

接下来,程序员必须对所有这些数据执行一些操作,例如在将数据传递给GPU之前,一次正常计算。

CPU如何决定如何将数据加载到L2缓存中?

程序员如何检查任何给定架构的缓存行大小?

程序员如何确保数据的组织以适应缓存行?

数据对齐字节边界是唯一能够帮助这个过程的事情吗?

程序员可以做些什么来减少缓存未命中?

哪些分析工具可以帮助可视化Windows和Linux平台的优化过程?

1 个答案:

答案 0 :(得分:12)

这里有很多问题,所以我会简短地回答一下。

  

CPU如何决定如何将数据加载到L2缓存中?

无论你使用什么,都会被加载。 L2的行为与L1相同,除了它有更多,并且混叠(可能导致过早驱逐)更常见,因为更大的线条和更少的集合关联性。有些CPU只使用从L1推出的数据加载L2,但它对程序员没有太大影响。

大多数MMU都具有未缓存内存的功能,但这适用于设备驱动程序。我不记得在没有禁用L1的情况下看到禁用L2的选项。没有缓存,就没有性能。

  

程序员如何检查任何给定架构的缓存行大小?

查阅用户手册。某些操作系统提供了sysctl等查询工具。

  

程序员如何确保数据的组织以适应缓存行?

关键的想法是空间位置。通过相同的内部循环同时访问的数据应该进入相同的数据结构。最佳组织是将该结构适配到缓存行并将其与缓存行大小对齐。

除非您仔细使用您的探查器作为指南,否则请不要麻烦。

  

数据对齐字节边界是唯一能够帮助这个过程的事情吗?

不,另一部分是避免使用无关数据填充缓存。如果某些字段仅被某些其他算法使用,则它们在本算法运行时浪费缓存空间。但是你无法一直优化所有内容,重新组织数据结构需要编程工作。

  

程序员可以做些什么来减少缓存未命中?

使用真实数据进行配置文件,并将过多的未命中视为错误。

  

哪些分析工具可以帮助可视化Windows和Linux平台的优化过程?

Cachegrind非常好但使用虚拟机。英特尔V-Tune使用您的实际硬件,无论好坏。我没有用过后者。