【问题标题】:Does writing to a region of memory from multiple threads cause contention?从多个线程写入内存区域会导致争用吗?
【发布时间】:2019-02-28 07:32:08
【问题描述】:

假设我有一个从地址 0 到 128 的连续内存部分,并将其整齐地一分为二,以便每六个字节有 6 个线程工作,线程 1 得到 0, 6, 12, 18...,线程 2 得到 1, 7, 13, 19...,等等

如果这些线程写入这些字节,是否会导致 CPU 尝试在每个内核之间同步缓存,因为它们是彼此本地的?如果每个字节都作为std::atomic<uint8> 访问呢?

【问题讨论】:

  • 读取或写入权限?读:不,写:是,感谢缓存线
  • @JVApen:读取的情况还在污染缓存行;每个缓存行的 5/6 与线程无关。

标签: c++ multithreading memory optimization atomic


【解决方案1】:

我不了解所有 CPU,因为我最熟悉 Intel 64 位。虽然一般来说,如果至少有一个线程正在写入内存,我会说是。

这一切都与缓存行有关。在我的 PC 中,缓存行是 64 字节(不是位),您可以通过 std::hardware_destructive_interference_size 检索一个数字。

忽略这一点,你就会掉入一个叫做:虚假分享的陷阱。这是通过写入同一缓存行上的不相关值而使您使用的缓存行失效。

您可以使用std::memory_order 来防止这种情况发生,但是,该值是最低要求,在 Intel 64 位上大多数时间都会被忽略,因为 CPU 本身会保证 std::memory_order_seq_cst。它可能仍然对优化有影响。 (对于可以处理原子的小优化通道)

总结:尽可能给内存线程区域iso随机元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2016-05-19
    • 2017-10-30
    相关资源
    最近更新 更多