【发布时间】:2013-09-02 08:32:22
【问题描述】:
假设一台计算机有 64k 的 L1 缓存和 512k 的 L2 缓存。
程序员在主内存中创建/填充了一个 10mb 的数据数组(例如 3d 模型的顶点/索引数据)。
数组可能包含一系列结构,例如:
struct x
{
vec3 pos;
vec3 normal;
vec2 texcoord;
};
接下来,程序员必须对所有这些数据执行一些操作,例如在将数据传递给 GPU 之前进行一次正常计算。
CPU 如何决定数据如何加载到 L2 缓存中?
程序员如何检查任何给定架构的缓存线大小?
程序员如何确保组织数据以使其适合高速缓存行?
数据对齐到字节边界是唯一可以帮助这个过程的事情吗?
程序员可以做些什么来最大程度地减少缓存未命中?
有哪些分析工具可以帮助可视化 Windows 和 linux 平台的优化过程?
【问题讨论】:
-
这是一个相当大的问题,所以我希望它会被“搁置”。无论如何,为了确保良好的缓存使用率,请考虑切换到 Struct of Arrays 布局。这将确保您几乎不会将缓存空间浪费在您没有立即使用的数据上。拆分 vecx 可能也是一个好主意,但原因不同:矢量化。
-
为了尽量减少缓存未命中,请查看stackoverflow.com/questions/460666/…
-
我主要反对关闭问题(暂停,哈哈!按钮仍然显示“关闭”),但这里有太多问题,有点令人讨厌。这将是大学课程中大型课程单元的材料。如果您至少知道其中一些问题的答案,请在问题中提供。您知道什么是缓存行这一事实表明您也知道 CPU 如何决定如何将数据加载到 L2 中。
标签: c++ caching optimization