【发布时间】:2015-05-25 19:48:01
【问题描述】:
在研究无锁/无等待算法时,我偶然发现了false sharing 问题。进一步挖掘让我找到了 Folly 的源代码(Facebook 的 C++ 库),更具体地说,是这个 header file 和 FOLLY_ALIGN_TO_AVOID_FALSE_SHARING 宏的定义(目前在第 130 行)。第一眼最让我吃惊的是这个值:128(即:而不是64)...
/// An attribute that will cause a variable or field to be aligned so that
/// it doesn't have false sharing with anything at a smaller memory address.
#define FOLLY_ALIGN_TO_AVOID_FALSE_SHARING __attribute__((__aligned__(128)))
AFAIK,现代 CPU 上的缓存块长度为 64 字节,实际上,到目前为止,我在这件事上找到的所有资源,包括来自 Intel 的 this article,都谈到了 64 字节对齐 和 填充以提供帮助解决虚假共享。
不过,Facebook 的人们会在需要时将他们的班级成员对齐并填充到 128 字节。然后我在FOLLY_ALIGN_TO_AVOID_FALSE_SHARING的定义上面找到了一个解释的开头:
enum {
/// Memory locations on the same cache line are subject to false
/// sharing, which is very bad for performance. Microbenchmarks
/// indicate that pairs of cache lines also see interference under
/// heavy use of atomic operations (observed for atomic increment on
/// Sandy Bridge). See FOLLY_ALIGN_TO_AVOID_FALSE_SHARING
kFalseSharingRange = 128
};
虽然它为我提供了更多细节,但我仍然觉得我需要一些见解。我很好奇 连续 缓存行的同步或对它们的任何 RMW 操作如何干扰在大量使用原子操作的情况下。 有人能告诉我这怎么可能发生吗?
【问题讨论】:
-
这里的一个重要概念是“缓存关联性”
-
英特尔优化手册,第 2.1.5.4 章。空间预取器努力将缓存行对保留在 L2 缓存中。
-
@Hans:我会接受这个答案(虽然在第 2.2.5.4 章中找到)。
-
你的可能是最新的。你可以自己写答案。
-
@Ben:有用的提示。谢谢!
标签: c++ locking false-sharing