【问题标题】:Are cache misses correlated to whether we use heap memory?缓存未命中是否与我们是否使用堆内存相关?
【发布时间】:2019-04-26 17:48:32
【问题描述】:

要获得最佳性能,请尽量减少缓存未命中。我想我们都可以同意这一点。

我的建议和想问的是以下内容。我这样说:

template <typename T>
struct {
    T* a;
    T* b;
    T* c;
};

比这更容易受到缓存未命中的影响:

template <typename T>
struct {
    T a;
    T b;
    T c;
};

我经常提出以下论点:尽量减少堆分配以尽量减少缓存未命中。我错了吗?

理由:来自我的工作模拟器(我编写了包括 MMU 的 PowerPC 模拟器):内存是按页或块提取的。如果您在堆栈上分配所有内容,编译器将有更好的机会将所有内容放入连续的内存块中,这意味着拉出单个页面/块将包含您的整个结构/类(假设您没有使用巨大的结构/类),因此您将有更少的缓存未命中。

当人们提到现代 CPU 中的缓存行时,我并不完全理解它们(我不知道它是否只是指多个缓存级别上的页表遍历过程)。有些人告诉我我的论点是不正确的,我不明白他们的意思。有人可以告诉我我的论点是否正确/不正确,以及在 x86/x64 架构中是否因特定原因而错误?

【问题讨论】:

  • 如果不知道是否将数据一起使用,则无法决定是否将数据保存在一起。

标签: c++ c performance caching memory


【解决方案1】:

在堆栈或堆上,您将获得缓存未命中。所以不,这与最小化堆分配无关。

问题是处理器如何尽可能多地重用缓存信息并预测你想去哪里。这就是vector 比列表更好的原因,因为您正在以可预测的方式浏览数据(与列表或地图相比)。

所以问题是,你的 struct 是在堆上分配的说 3 float 的结构,还是 float 的数组?如果是第一个,那就不好了,使用数据本身而不是指针,如果是后者,很好,如果你遍历每个数组,你就有了局部性。

三个基本规则是地方、地方、地方。

然后是关于结构数组(AoS)、数组结构(SoA,当并非所有条目都对计算有用时通常更好)和数组结构数组(AoSoA,带有矢量化代码,最后一个数组)的完整讨论将被打包浮点数/整数...)。

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2012-10-14
    • 2013-07-21
    • 2016-10-11
    • 2021-12-26
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多