从多个线程写入内存区域会导致争用吗?

Does writing to a region of memory from multiple threads cause contention?

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

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

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

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

检索一个数字

忽略这一点,您将掉入一个陷阱:虚假共享。这是通过写入同一缓存行上的不相关值使您使用的缓存行失效。

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

总而言之:只要有可能,就给线程内存区域 is 随机元素。