cache-line-ping-pong 和 false sharing 是一样的吗?

Are cache-line-ping-pong and false sharing the same?

为了完成我的学士论文,我必须评估多核系统上的常见问题。

我在一些书中读到了有关虚假共享的内容,在其他一些书中读到了有关缓存行乒乓的内容。具体的问题听上去很耳熟,那么这些是不是同一个问题只是换了个名字呢? 谁能给我详细讨论这些主题的书名? (我已经有来自 Darry Glove、Tanenbaum 的文学作品……)

总结:

False sharingcache-line ping-ponging 相关但不是一回事。错误共享可能导致缓存行 ping-ponging,但这不是唯一可能的原因,因为 cache-line ping-ponging 也可能由真正的共享引起。

详情:

虚假分享

当不同的线程在程序中具有未共享的数据,但此数据被映射到共享的缓存行时,就会发生错误共享。例如,假设一个程序有一个整数数组,其中一个线程对具有偶数索引的所有数组条目执行读取和写入操作,而另一个线程对具有奇数索引的条目执行读取和写入操作。在这种情况下,线程实际上不会共享数据,但它们会共享缓存行,因为每个缓存行都包含奇数和偶数索引值(假设缓存行大于整数,这通常是正确的)。

缓存行乒乓

缓存行乒乓是缓存行在多个 CPU(或核心)之间快速连续传输的效果。这可能是由 虚假或真实共享引起的。本质上,如果多个 CPU 试图在同一个缓存行中读取和写入数据,那么该缓存行可能必须在两个线程之间快速连续传输,这可能会导致性能显着下降(性能可能比单个线程更差线程正在执行)。错误共享会使这个问题特别难以检测,因为程序员可能试图编写一个应用程序以使线程不共享数据,而没有意识到数据被映射到同一缓存行。但错误共享并不是缓存行乒乓的唯一可能原因。这也可能是由多个线程试图读取和写入相同数据的真正共享引起的。