假设一台计算机有 64k 的 L1 缓存和 512k 的 L2 缓存。
程序员在主内存中创建/填充了一个包含 10mb 数据的数组(例如 3D 模型的顶点/索引数据)。
该数组可能包含一系列结构,例如:
struct x
{
vec3 pos;
vec3 normal;
vec2 texcoord;
};
接下来,程序员必须对所有这些数据执行一些操作,例如在将数据传递给 GPU 之前进行一次正常计算。
CPU 如何决定数据如何加载到 L2 缓存中?
程序员如何检查给定架构的高速缓存行的大小?
程序员如何确保数据组织得适合缓存行?
数据与字节边界对齐是帮助此过程唯一可以做的事情吗?
程序员可以采取什么措施来最大限度地减少缓存未命中?
有哪些分析工具可以帮助可视化 Windows 和 Linux 平台的优化过程?
这里有很多问题,所以我将简短地回答。
CPU 如何决定数据如何加载到 L2 缓存中?
无论你使用什么,都会被加载。 L2 的行为与 L1 相同,只是它的数量更多,而且由于线条较大且设置的关联性较少,因此出现混叠(可能导致过早驱逐)更为常见。有些 CPU 只向 L2 加载从 L1 推出的数据,但这对程序员来说没有太大区别。
大多数 MMU 都有用于未缓存内存的功能,但这是用于设备驱动程序的。我不记得曾经见过在不禁用 L1 的情况下禁用 L2 的选项。如果没有缓存,就无法获得性能。
程序员如何检查给定架构的高速缓存行的大小?
通过查阅用户手册。有些操作系统提供查询功能,例如sysctl
.
程序员如何确保数据组织得适合缓存行?
关键的想法是空间局部性。通过同一内部循环同时访问的数据应该进入相同的数据结构。最佳组织是将该结构适合高速缓存行并将其与高速缓存行大小对齐。
除非您仔细地使用分析器作为指导,否则不要自找麻烦。
数据与字节边界对齐是帮助此过程唯一可以做的事情吗?
不,另一部分是避免用无关数据填充缓存。如果某些字段仅由其他算法使用,那么在当前算法运行时它们就会浪费缓存空间。但您不可能一直优化所有内容,并且重新组织数据结构需要编程工作。
程序员可以采取什么措施来最大限度地减少缓存未命中?
使用真实数据进行分析,并将过多的遗漏视为错误。
有哪些分析工具可以帮助可视化 Windows 和 Linux 平台的优化过程?
Cachegrind 非常好,但使用虚拟机。无论好坏,英特尔 V-Tune 使用您的实际硬件。后者我没用过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)