假设一台计算机有64k的L1缓存和512 K的L2缓存。
程序员已经在主存中创建/填充了一个数组,例如10 3d的数据(例如,3D模型的顶点/索引数据)。
数组可能包含一系列结构,如:
struct x
{
vec3 pos;
vec3 normal;
vec2 texcoord;
};接下来,程序员必须对所有这些数据执行一些操作,例如,在将数据传递到GPU之前执行一次常规计算。
CPU如何决定如何将数据加载到L2缓存中?
程序员如何检查缓存行对于任何给定体系结构的大小?
程序员如何确保将数据组织成适合高速缓存行的数据?
数据对齐到字节边界是唯一可以帮助这个过程的事情吗?
程序员能做些什么来减少缓存丢失呢?
有哪些分析工具可以帮助可视化windows和linux平台的优化过程?
发布于 2013-09-02 09:12:53
这里有很多问题,所以我会保持简短的回答。
CPU如何决定如何将数据加载到L2缓存中?
不管你用什么,都要上膛。L2的行为与L1一样,只是有更多的,混叠(这可能导致提前驱逐)更常见,因为更大的线条和较少的集合相联性。有些CPU只加载L2中的数据,这些数据正被从L1中排挤出来,但对程序员并没有太大的影响。
大多数MMU都有用于非缓存内存的工具,但这是用于设备驱动程序的。我不记得曾经看到过禁用L2而不禁用L1的选项。没有缓存,就没有性能。
程序员如何检查缓存行对于任何给定体系结构的大小?
通过查阅用户手册。有些操作系统提供了像sysctl这样的查询工具。
程序员如何确保将数据组织成适合高速缓存行的数据?
关键思想是空间局部性。同时,通过相同的内环访问的数据应该进入相同的数据结构。最佳组织是将该结构安装到缓存线上,并将其与缓存行大小对齐。
除非你仔细地使用你的分析器作为向导,否则不要惹麻烦。
数据对齐到字节边界是唯一可以帮助这个过程的事情吗?
不,另一部分是避免用无关的数据填充缓存。如果某些字段仅供其他算法使用,则在当前算法运行时,它们正在浪费缓存空间。但是,您不可能一直优化所有的东西,重新组织数据结构需要编程的努力。
程序员能做些什么来减少缓存丢失呢?
使用真实世界的数据进行概要分析,并将过多的错误视为错误.
有哪些分析工具可以帮助可视化windows和linux平台的优化过程?
Cache差使很不错,但使用了虚拟机。英特尔V调使用你的实际硬件,无论好坏。我还没用过后者。
https://stackoverflow.com/questions/18568768
复制相似问题