从多个线程写入内存区域会导致争用吗?
Posted
技术标签:
【中文标题】从多个线程写入内存区域会导致争用吗?【英文标题】: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>
访问呢?
【问题讨论】:
读取或写入权限?读:不,写:是,感谢缓存线 en.wikipedia.org/wiki/False_sharing @JVApen:读取的情况还在污染缓存行;每个缓存行的 5/6 与线程无关。 【参考方案1】:我不了解所有 CPU,因为我最熟悉 Intel 64 位。虽然一般来说,如果至少有一个线程正在写入内存,我会说是。
这一切都与缓存行有关。在我的 PC 中,缓存行是 64 字节(不是位),您可以通过 std::hardware_destructive_interference_size 检索一个数字。
忽略这一点,你就会掉入一个叫做:虚假分享的陷阱。这是通过写入同一缓存行上的不相关值而使您使用的缓存行失效。
您可以使用std::memory_order 来防止这种情况发生,但是,该值是最低要求,在 Intel 64 位上大多数时间都会被忽略,因为 CPU 本身会保证 std::memory_order_seq_cst。它可能仍然对优化有影响。 (对于可以处理原子的小优化通道)
总结:尽可能给内存线程区域iso随机元素。
【讨论】:
以上是关于从多个线程写入内存区域会导致争用吗?的主要内容,如果未能解决你的问题,请参考以下文章