cha*_*255 5 c++ multithreading caching
我正在阅读有关错误共享和缓存乒乓的信息,当不同内核上有多个线程尝试使用相同的缓存行但数据不同时(例如数组中彼此相邻的两个 int 值)。在这种情况下,缓存线需要在核心之间来回移动。我感到困惑的是,我认为每个核心都有自己的 L1 缓存,那么为什么它需要与其他核心共享该缓存行?难道它不只是保留自己的副本并更新它吗?另外,如果 cpu 被迫使核心之间的所有缓存保持一致,那么像 c++ 中这样的关键字有什么意义volatile
(除了可能阻止编译器将值存储在寄存器中)?
首先,您不应该将其用于volatile
线程同步。有关详细说明,请参阅为什么 volatile 在多线程 C 或 C++ 编程中不被认为有用?
其次,错误共享成为问题的原因是,当更新缓存行中的变量时,整个缓存行被标记为脏。然后,这会强制所有核心上的同一缓存行无效,因为它们不知道更新了哪些部分,它们只知道该行已更新,因此需要同步。
英特尔有一篇关于此的非常好的文章,名为避免和识别线程之间的错误共享
归档时间: |
|
查看次数: |
358 次 |
最近记录: |