c++ - 如果不同的内核具有不同的 L1 缓存,为什么会出现缓存 ping-ponging 和问题?

标签 c++ multithreading caching

当您在不同内核上有多个线程尝试使用相同的缓存行但针对不同的数据(例如数组中彼此相邻的两个 int 值)时,我正在阅读有关错误共享和缓存 ping-ponging 的内容。在这种情况下,高速缓存行需要在核心之间向后和第四移动。我感到困惑的是,我认为每个内核都有自己的 L1 缓存,那么为什么它需要与其他内核共享该缓存行呢?它不会只保留自己的拷贝并更新它吗?此外,如果 cpu 被迫使内核之间的所有缓存保持一致,那么在 c++ 中使用诸如 volatile 之类的关键字有什么意义(除了可能阻止编译器将值存储在寄存器中)?

最佳答案

坚决反对,你不应该使用 volatile 进行线程同步。有关详细说明,请参阅 Why is volatile not considered useful in multithreaded C or C++ programming?

其次,错误共享成为问题的原因是,当更新缓存行中的变量时,整个缓存行都被标记为脏。然后,这会强制所有核心上的同一缓存行失效,因为它们不知道更新了哪个部分,他们只知道该行已更新,因此需要同步。

英特尔有一篇关于此的非常好的文章,名为 Avoiding and Identifying False Sharing Among Threads

关于c++ - 如果不同的内核具有不同的 L1 缓存,为什么会出现缓存 ping-ponging 和问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060513/

相关文章:

c++ - C++中奇怪的析构函数调用

Android:具有多个 UI Activity (多线程/处理程序)的蓝牙 SPP 应用程序的一般方向

multithreading - C++11 std::thread 接受带有右值参数的函数

c# - 简单注入(inject)器的生活方式作为缓存解决方案

HTML:强制代理服务器获取页面的新副本

c++ - 类方法与构建器

c++ - #define 和预期的主表达式错误

Java 同步线程未按预期工作

ios - 如何确定我的 iOS 文档目录中是否存在某个名称的文件

c++ - std::initializer_list 返回成员变量返回不正确的值