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