一段时间后保证CPU缓存更新

时间:2016-04-18 08:03:49

标签: multithreading multiprocessing cpu cpu-cache

假设我有一个位于内存中的变量var,并且任意数量的处理器/线程可以在任何给定时间读取和修改它。但保证在修改n的处理器与任何其他读取var之间至少var秒。是否可以确定,如果以秒为单位的时间为nn的值是否保证处理器读取var将读取更新后的值?

3 个答案:

答案 0 :(得分:1)

如果你的关注真的Cache coherence,你应该一般安全 1
但是,具体而言,你可能不是。

高速缓存一致性通常由硬件 2 处理,无需软件的帮助。 然而,这是非常特定于实现的:NUMA可能是非缓存一致的,Compute Shader可能需要特定的内置函数,IA32e和ARM通常隐藏程序员的缓存一致性。

直接回答您的问题:不,您无法保证

关键是缓存一致性是您在群集和并行非统一架构中处理的事情。
虽然在这种情况下编程模型本质上是多线程,但两个概念 3 是分开的,真正应该让你感到困惑的是如何正确处理多线程,特别是{ {3}}和synchronization

你的问题似乎暗示了一个简单的案例,即读者在作家完成后很久就被执行了 如果此属性真正强制执行,则您不需要任何同步或内存障碍。但请注意sleep函数不具备有效执行的条件。

如果你需要同步(以便订购内存访问),那么你需要使用特定于语言的结构,例如 C# Java中的volatile atomics C C ++ 程序集中的具体说明。
您可能还需要实现关键部分

如果您确实需要手动控制架构的缓存一致性,那么您必须检查感兴趣的规范(通常是数据表和正式文件),因为没有统一的方法来处理它,编译器应该提供一些内在的或运行时应提供库。

所以要在上面的直接答案中添加一些东西:不,你没有任何保证,但是当通常的 CPU,在通常的架构中时,需要无论如何,它将能够使用最新的数据。因此,您不必担心 方面。

请注意使用 common 这些

1 例如,如果您使用 Intel / AMD / ARM CPU,请不要这样做甚至考虑缓存一致性 2 CPU本身,本地监视器,系统监视器或特定设备 3 多线程和缓存一致性。

答案 1 :(得分:0)

当缓存进入调度程序以查看是否有不同的任务要运行时,缓存将倾向于在操作系统节拍中断上刷新。

然而,随着操作系统变得越来越聪明,诸如无嘀嗒NoHz之类的东西以及随着CPU核心数量的增加,这种可能性越来越小,你不应该依赖它。

超级计算机集群可能无法一次切换几分钟,因为他们使用的是不会中断正在运行的作业的自定义操作系统代码。计算作业从1-7分配给核心,没有中断,所有其他工作都在核心0上运行。

答案 2 :(得分:0)

您的问题中有两个概念:软件同步和硬件一致性。玛格丽特已经讨论过硬件一致性,所以我不会在这里讨论它。

软件同步

x86保证如果在64位边界上对齐,则将以原子方式执行四字访问。但这保证了其他处理器不会读取部分结果(例如[32位新] <32位旧&gt;奇怪的混合物)。它不保证在另一个处理器看到新分配的值之前的硬时间期限。让另一个线程等待一段时间并不是一个优雅的解决方案,因为首先两个线程需要具有相同的开始时间。所以,如果你需要这样的保证,你需要条件变量来确保另一个线程应该等待。

specify the source attribute

总之,如果需要排序效果并使用锁/事务内存等来保护变量长于四字或不是64位对齐,请使用条件变量。

顺便说一句,如果您有兴趣,这里有一个有用的缓存一致性材料。

https://en.wikipedia.org/wiki/Monitor_(synchronization)