【问题标题】:Performance penalty(?) of allocating too much memory分配过多内存的性能损失(?)
【发布时间】:2012-07-16 17:55:28
【问题描述】:

作为我正在使用的算法的新变体的一部分(倾向于使用 SMP),我正在考虑将我的 particles 分类为 boxes,让每个 box 有一个 particle* []。我唯一担心的是,由于每个盒子的粒子数量可能会有所不同(在极少数情况下,平均 10 个会高达 70 个),我需要大量过度分配指针数组。我想大概是 5-10% 的利用率。

极端情况下会有大约一百万个这样的内存,因此我们正在考虑分配半 GB 的内存。就它将运行的机器而言,这不是问题,但我想知道是否存在与跨步内存相关的性能损失(缓存讨厌它或其他东西)。 (例如,访问 500 个字节中的前 60 个左右的字节)。 我确实知道要确保我的步幅宽度最终不会成为破坏缓存的 64 倍数...

我可以在极少数情况下让它失败,只要这个计划能让我获得足够的性能提升,以便能够在相同的时间内运行更多成功的副本。

如果相关,这段代码将主要在 Xeon E5620 上运行,尽管这会改变,我宁愿不做任何特定于架构的事情。

编辑:这是将连续内存中的 N 字节打包数据与均匀跨过更大的连续内存区域的 N 字节数据进行比较。

【问题讨论】:

    标签: c performance memory


    【解决方案1】:

    如果您分配的内存不会导致交换,那么简单地分配它不会导致任何额外的开销。

    但是,如果您的算法当前将数据点打包到连续内存中,并且您的新算法将 5%-10% 的利用率分布在整个分配的缓冲区中(如果是这种情况,您的问题不清楚),您将有很多更多的缓存未命中访问内存。

    另一方面,如果每个 CPU 有一个缓冲区(并且使用连续内存),由于false sharing 的机会减少,您的算法可能会执行得更好。

    【讨论】:

    • 对不起,我会澄清这个问题。我将连续内存中的打包数据与将其分散到更大的分配内存块中进行比较。
    • 在这种情况下,恐怕你会丢失很多缓存命中。如果您之前确实有虚假分享,那么现在这可能不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多