在研究无锁/无等待算法时,我偶然发现了伪共享问题。进一步挖掘后,我找到了Folly的源代码(Facebook的C++库),特别是这个头文件和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)))
据我所知,现代CPU的缓存块长度为64字节。事实上,到目前为止我找到的所有资源,包括英特尔公司的这篇文章,都谈到了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操作可能会相互干扰。 有人能告诉我这怎么可能发生吗?