当您在不同内核上有多个线程尝试使用相同的缓存行但针对不同的数据(例如数组中彼此相邻的两个 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/