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

C++ 了解CPU如何决定加载到缓存内存中的内容,c++,caching,optimization,C++,Caching,Optimization,假设一台计算机有64k的一级缓存和512k的二级缓存 程序员在主内存中创建/填充了一个大约10mb的数据数组(例如3d模型的顶点/索引数据) 数组可能包含一系列结构,如: struct x { vec3 pos; vec3 normal; vec2 texcoord; }; 接下来,程序员必须在将数据传递给GPU之前,对所有这些数据执行一些操作,例如一次正常计算 CPU如何决定如何将数据加载到二级缓存中 对于任何给定的体系结构,程序员如何检查缓存线的大小 程序员如何确保数据被组织起

假设一台计算机有64k的一级缓存和512k的二级缓存

程序员在主内存中创建/填充了一个大约10mb的数据数组(例如3d模型的顶点/索引数据)

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

struct x
{
  vec3 pos;
  vec3 normal;
  vec2 texcoord;
};
接下来,程序员必须在将数据传递给GPU之前,对所有这些数据执行一些操作,例如一次正常计算

CPU如何决定如何将数据加载到二级缓存中

对于任何给定的体系结构,程序员如何检查缓存线的大小

程序员如何确保数据被组织起来,以适合缓存线

字节边界的数据对齐是否是唯一可以帮助此过程的方法

程序员可以做什么来最小化缓存未命中


有哪些评测工具可以帮助可视化windows和linux平台的优化过程?

这里有很多问题,因此我将简要回答

CPU如何决定如何将数据加载到二级缓存中

无论你用什么,都会被加载。L2的行为与L1相同,只是其行为更多,而且由于线条更大,集合关联性更少,因此别名(可能导致过早逐出)更为常见。一些CPU只在L2中加载从L1中挤出的数据,但这对程序员没有多大影响

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

对于任何给定的体系结构,程序员如何检查缓存线的大小

通过查阅用户手册。一些操作系统提供了类似于
sysctl
的查询功能

程序员如何确保数据被组织起来,以适合缓存线

关键思想是空间局部性。同一内部循环同时访问的数据应该进入同一数据结构。最佳组织是将该结构适配到缓存线上,并将其与缓存线大小对齐

除非您仔细使用探查器作为指导,否则不要惹麻烦

字节边界的数据对齐是否是唯一可以帮助此过程的方法

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

程序员可以做什么来最小化缓存未命中

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

有哪些分析工具可以帮助可视化windows和linux平台的优化过程


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

这是一个相当大的问题,所以我希望它会被“搁置”。。无论如何,为了确保良好的缓存使用,考虑切换到一个数组布局结构。这将确保您几乎永远不会在不立即使用的数据上浪费缓存空间。拆分vecx可能也是一个好主意,但原因不同:矢量化。为了最大限度地减少缓存未命中,请看一看我主要反对结束问题(暂停,哈!按钮上仍然显示“关闭”),但这里的问题太多,有点令人讨厌。这将是大学课堂上大型课程单元的材料。如果您至少知道其中一些问题的答案,请在问题中提供。您知道缓存线是什么,这表明您也知道CPU如何决定如何将数据加载到二级缓存中。