【问题标题】:Handing out addresses in a custom memory allocator w.r.t. cache conflicts在自定义内存分配器中分发地址 w.r.t.缓存冲突
【发布时间】:2013-02-01 14:56:01
【问题描述】:

在阅读了the effect power of twos 可能导致缓存冲突之后,我花了一个下午的时间阅读处理器缓存。现在我希望将这些新知识应用到我的多线程程序的内存分配器中。但是,我还没有完全理解。

我的印象是处理器喜欢 2 的幂,所以我的分配器将请求的大小舍入到它们的下一个 2 的幂,然后将页面切成这个大小的倍数并分发出去。当页面已满时,它只是映射一个新页面并以相同的方式对其进行切片。这会导致页面中非常相似且可预测的偏移量。

我应该在多大程度上调整我的分配器以避免这个问题?例如,我应该尝试稍微随机化地址,还是我一开始就因为使用 2 的幂而被搞砸了?

谢谢!

【问题讨论】:

  • 当你尝试它时会发生什么,并对差异进行基准测试?
  • @SecurityMatt 我还没有对任何东西进行基准测试,因为我对如何正确测试它没有信心。但是,考虑到分配器的操作方式,它可能会导致缓存利用率低下。尝试在分配器级别与之抗争甚至可能没有意义。我不知道。 :)
  • 如果我是你,我会让你的分配器假设缓存不存在,然后链接一些大程序来使用它并测试它们。如果性能足够好,恭喜你,大功告成。否则,您可以编辑您的代码,并且您有一个很好的参考实现来进行基准测试。

标签: c performance memory-management cpu-cache


【解决方案1】:

直到您有无可争议的证据证明 对性能至关重要,否则就别管它了。额外的复杂性很可能不值得。

每个人都应该阅读(并理解!)Bentley 的“编写高效程序”(遗憾的是现在绝版了,他的 "Programming Pearls" 包含一个摘要,也非常值得一读)。

  • 在开始代码优化回合之前,确保这是值得的。如果性能足够,您的时间会得到更好的利用。是的,您必须先测量。
  • 衡量花费的成本。众所周知,程序员不善于猜测成本在哪里
  • 最大的性能提升来自重述问题(有时它足以解决更快解决的问题),然后是系统的整体组织,下一个更好的算法/数据结构;并在最后的细节优化,就像这里考虑的那样。
  • 您友好的编译器,如果在“生成好代码”的方向上稍加推动,今天将在执行类似(全功能规模)任务时生成比经验丰富的汇编语言程序员好多更好的代码。大多数“为了性能”的本地源代码重组要么没有实际意义(编译器自己会这样做)要么有害(编译器将识别并重写通常的代码序列,不寻常的代码可能会使其无所事事或生成错误的代码) .
  • 程序员的时间(编写、调试、维护)比计算机时间的几微秒更有价值,除了极不寻常的情况。编写最简单的代码来完成这项工作,只有在经验表明它是有价值的情况下才重新编写。

【讨论】:

  • 您所说的通常是正确的,如果它是针对问题的,我会赞成。我认为 OP 应该收到比一般“过早优化”警告更多的答案。
  • 没错,忘记了。 OP 应该仔细研究一下 Linux 内核内存分配器,kernelnewbies.org/KernelMemoryAllocation> 应该是一个很好的起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 2019-08-11
  • 2012-07-08
  • 2012-05-29
相关资源
最近更新 更多