【问题标题】:Is it possible to create a vector on the stack?是否可以在堆栈上创建向量?
【发布时间】:2019-09-22 00:56:04
【问题描述】:

由于优化原因,我希望我的向量存在于缓存中,并且将它放在堆栈上会大大增加这种可能性。是否可以在堆栈上创建向量?如果有必要,我完全愿意重新实现我自己的std::vector 变体以使其成功。如有必要,我也很乐意使用内联汇编。

【问题讨论】:

  • 如果它在堆栈上,那么它如何调整大小?它需要一个在编译时已知的固定大小。也许您正在寻找std::array
  • 关于“将[向量]放在堆栈上会大大增加[其内容在缓存中]的几率。” 这是推测。缓存可以从堆栈和堆中加载数据。事实上,从软件的角度来看,内存的位置(自动存储与免费存储)与它的物理位置(缓存、RAM、磁盘等)之间甚至没有很强的相关性。
  • CPU缓存不关心栈上是否有东西。
  • 只使用一个向量。它将被加载到缓存中。这就是为什么它是您应该首先考虑使用的容器。在很多情况下,它会比其他具有更好算法保证的容器更快,因为它们都会遇到缓存未命中的问题,而遍历向量则不会。
  • 你测量过 malloc/new 的开销有多大吗?在大多数情况下,开销不是真正的问题,但缓存友好性才是。因此,您必须以这样一种方式编写您的算法,即操作数可以正确地放入缓存行或至少放入 L1/L2 缓存中。

标签: c++ performance caching optimization


【解决方案1】:

将[向量]放在堆栈上会大大增加[其内容在缓存中]的几率。”

这是猜测。缓存可以从堆栈和堆中加载数据。缓存不关心原始物理内存的来源。这就是缓存的目的。所有人都称赞缓存。事实上,从软件的角度来看,内存的位置(自动存储与免费存储)与它的物理位置(缓存、RAM、磁盘等)之间甚至没有很强的相关性。

由于优化原因,我想要 [...]

我猜你想要一个更快的软件。要做到这一点,您需要确定究竟是什么让它对您的口味太慢了。有这方面的工具,a profiler is one of them。当您解决了所有瓶颈并留下一个仍然太慢的软件时,您可以确定您面临data-oriented 性能问题。这时你会问自己:如何以可预测的方式处理内存,让我的 CPU cacheCPU branch prediction 帮助我

【讨论】:

  • 我无法强调分析的重要性,它实际上是确定性能问题的唯一方法。
【解决方案2】:

CPU 缓存不知道也不关心您是否使用堆栈或堆内存,它使用原始内存地址,细分为缓存行(例如 64 字节)。此外,虚拟内存子系统在页面上运行(例如 4KB),这也可能是减速的原因。因此, 重要的是停留在相同的内存位置或附近,即通过重用内存。

是的,堆栈内存在缓存方面通常是一个安全的选择,因为堆栈的顶部通常是“热的”,这意味着已经缓存。但是堆栈并不意味着存储大型或动态大小的对象,因为这样做会将顶部移出热区并破坏目的。

std::vector 可以是缓存友好的。只需确保事先reserve 内存,这样您就可以避免代价高昂的重新分配和数据移动,并使用缓存友好的内存分配器,如 jemalloc(内置在 BSD 中)或 ptmalloc(内置在 Linux 中)。当然,个人资料,个人资料,个人资料。

【讨论】:

    【解决方案3】:

    如果您希望您的向量存在于堆栈上,则无需重新实现该向量,而是“仅”提供一个使用堆栈而不是堆的新分配器。

    您可以查看this 了解一下。

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2010-12-06
      • 2014-10-23
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      相关资源
      最近更新 更多