【问题标题】:Can multiple threads access shared memory at the same time?多个线程可以同时访问共享内存吗?
【发布时间】:2016-03-18 16:52:15
【问题描述】:

多个线程在 CPU 的多个内核上并行运行。它们可以同时访问主存吗?

【问题讨论】:

  • 也许吧。取决于地址、访问宽度、内存架构,通常情况下,如果没有硬件锁定的帮助,就不能依赖它。

标签: multithreading shared-memory cpu-architecture hardware-acceleration


【解决方案1】:

主内存和共享的最后一级缓存读取带宽是多个内核竞争的共享资源,但是是的,读取相同内存字节的多个读取器通常比从不同页面读取的多个读取器更快地完成。 (混合写入时不正确。)

如果共享内存区域足够小,以至于它在每个核心的私有缓存中都很热,那么每个核心都可以以非常高的速度从中读取。写作会减慢其他读者的速度,尤其是。其他作者(参见Are cache-line-ping-pong and false sharing the same?)。

如果不使用任何类型的锁定,其他阅读器不会减慢很多,而是依靠lockless algorithms 来避免由于竞争条件导致的错误。这就是为什么与仅使用锁定或生产者-消费者标志相比,无锁编程有时值得(大)挑战以使其正确。

【讨论】:

  • 虽然我同意这个答案,但我非常怀疑 OP 是否能理解其中的一个词。只是说。
  • @SergeyA:我也是 :P 这是一个答案相当有趣的问题,所以我回答了。如果人们提出他们无法理解答案的问题,那不是我的问题。他们可以在谷歌上搜索这些短语以开始了解更多信息。 x86 tag wiki 有更多好的链接,我没有包括在内。我认为这比仅仅回答“是的,而且完整的答案真的很复杂”要好,因为这个问题足够具体,可以给出一个简短的答案。 (它不包括任何关于同步或内存排序的内容。)
  • 不久前,我做了一个小型基准测试,比较了单个命名共享段上的单个读取器与多个读取器(准确地说是 6 个),一个写入器定期写入,每个读取器都绑定到一个专用核心并且都在同一个CPU上。 E5 和 Skylake 的延迟实际上上升了。直觉上,我和你有同样的想法,平均延迟应该下降,因为最后一级缓存在大多数 CPU 中是共享的。知道为什么我会看到不同的东西吗?
  • @HCSF:如果多个线程竞争对相同 L3 高速缓存行的读取访问,它们可能会相互拖慢。您是否在一个大型工作集上追逐指针以击败 L1d 和 L2 缓存以测量 L3 延迟?
  • @PeterCordes 我不熟悉硬件级交互。您是说读取相同内存地址(其内容可能在 L3 上)的多个线程会更慢,因为只有 1 个线程(或少数线程?)具有对同一位置(或缓存行?或整个 L3 的读取权限)作为尽管?)?内存段设计为 64MB 环形缓冲区,每个线程具有相同的读取顺序,每个线程 memcpy()-ed 输出消息,所以我认为除非 memcpy() 以某种方式序列化,否则不会有太多指针追逐.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
相关资源
最近更新 更多