【发布时间】:2021-03-24 01:31:35
【问题描述】:
现代多核 CPU 通过窥探在内核之间同步缓存,即每个内核广播它在内存访问方面所做的事情,并监视其他内核生成的广播,以确保内核 B 看到来自内核 A 的写入.
这很好,因为如果您确实需要在线程之间共享数据,它可以最大限度地减少您必须编写的代码量以确保它确实被共享。
糟糕的是,如果您的数据应该只存在于一个线程的本地,那么窥探仍然会发生,不断地消耗能量而没有任何目的。
如果您声明相关变量thread_local,是否仍会发生窥探?不幸的是,根据Can other threads modify thread-local memory?的接受答案,答案是肯定的
当前存在的任何平台(CPU 和操作系统的组合)是否提供任何方法来关闭线程本地数据的窥探?不必是便携的方式;如果它需要发出特定于操作系统的 API 调用,甚至需要放入程序集中,我仍然感兴趣。
【问题讨论】:
-
现代多核 CPU 通过窥探在内核之间同步缓存 - 并非如此,这无法扩展功率和聚合 L3 缓存带宽。在实践中,现代 CPU 使用基于目录的一致性,例如英特尔的包容性 L3 缓存中的标签增加了位,以说明哪个内核可能具有修改后的行副本。
-
不幸的是,这是为“透明”共享内存支持付费的众多方式之一。完全消除线程私有内存的窥探流量(或相应的目录查找)可能需要操作系统将线程“固定”到特定的缓存上下文,并且操作系统的架构使其永远不会接收到线程私有内存的指针,或者任何使用此类指针的系统调用必须在进行调用的同一内核上。分层(基于页面)目录可以减少大量的窥探流量,也许与扩展的 TLB 支持相结合。
标签: multithreading operating-system cpu-architecture cpu-cache thread-local