【问题标题】:memory access vs. memory copy内存访问与内存复制
【发布时间】:2012-05-24 08:48:05
【问题描述】:

我正在用 C++ 编写一个应用程序,该应用程序需要从多个线程多次从同一内存读取。 我的问题是从性能的角度来看,为每个线程复制内存或给所有线程相同的指针并让它们都访问相同的内存会更好。

谢谢

【问题讨论】:

  • 显而易见的问题是:这个内存在被读取时是不变的,还是会发生变化?
  • @Mysticial,希望所有架构都能有效处理多次读取数据,而不仅仅是 NUMA 系统。
  • @AmigableClarkKant:您对答案的假设可能会更好地限制在您的答案中(并且在您的答案开始时说明您的假设会更好,让人们更容易阅读它们)。但是,我并不真正关心您的假设here;这个问题是针对 OP(不是你),因为我们需要 OP 来澄清。
  • @edA-qamort-ora-y:我认为关键是在 NUMA 系统上,在每个节点上都有一个本地副本可能会有好处,而拥有一个本地副本可能没有好处如果内存访问是统一的,则有多个副本。
  • @MikeSeymour,我只是想表明,尽管内存架构是相关的,但它是否是 NUMA 可能不是。 SMP/NUMA(可能还有其他)都倾向于对当前使用的数据使用本地缓存。

标签: c++ performance memory


【解决方案1】:

您提供的有关目标系统等的少量信息没有明确的答案,但在普通 PC 上,最快的可能就是不复制。

复制速度可能很慢的一个原因是,如果数据区域很大,它可能会导致缓存未命中。普通 PC 会在线程之间非常有效地缓存对同一数据区域的只读访问,即使这些线程碰巧在不同的内核上运行。

英特尔明确列出的缓存方法的好处之一是"Allows more data-sharing opportunities for threads running on separate cores that are sharing cache"。 IE。他们鼓励您不必对线程进行编程以显式缓存数据的做法,CPU 会为您完成。

【讨论】:

    【解决方案2】:

    由于您特别提到了许多线程,我假设您至少有一个多插槽系统。通常,内存条与处理器插槽相关联。也就是说,一个处理器离它自己的内存库“最近”,并且需要与其他处理器的内存控制器通信以访问其他内存库上的数据。 (这里的处理器是指套接字中的物理事物)

    当您分配数据时,通常会使用先写入策略来确定您的数据将分配到哪些内存条上,这意味着它可以比其他处理器更快地访问它。

    因此,至少对于多个​​处理器(不仅仅是多个内核)而言,至少为每个处理器分配一个副本应该会提高性能。确保使用每个处理器/线程而不是从主线程分配/复制数据(利用首次写入策略)。此外,您需要确保线程不会在处理器之间迁移,因为那样您可能会失去与内存的紧密连接。

    我不确定,为单个处理器上的每个线程复制数据会如何影响性能,但我想不复制可以提高共享更高级别缓存内容的能力,这些缓存在内核之间共享。

    在任何情况下,根据实际测量进行基准测试和决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-19
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多