x86上的两个后续CPU存储是否刷新到缓存保持顺序?

时间:2012-01-15 22:21:26

标签: multithreading x86 cpu cpu-cache

假设x86 CPU0和CPU1上分别运行了两个线程。在CPU0上运行的线程执行以下命令:

A=1
B=1

包含A最初由CPU1拥有并且包含由CPU0拥有的B的高速缓存行。

我有两个问题:

  1. 如果我理解正确,两个存储都将被放入CPU的存储缓冲区。但是,对于第一个存储A=1,CPU1的高速缓存必须无效,而第二个存储B=1可以立即刷新,因为CPU0拥有包含它的高速缓存行。我知道x86 CPU尊重商店订单。这是否意味着B=1之前不会将A=1写入缓存?

  2. 假设在CPU1中执行以下命令:

  3.   

    while(B = 0);
        打印A

    仅在CPU1中的whileprint命令之间添加lfence就足够了,而不在CPU0中的A=1B=1之间添加一个sfence,以便始终打印出1在x86上?

    while (B=0);
    lfence
    print A
    

1 个答案:

答案 0 :(得分:8)

在x86中,所有处理器都以相同的顺序观察单个处理器的写入。不需要在你的例子中,也不需要在x86上的任何正常程序中。你的计划:

while(B==0);  // wait for B == 1 to become globally observable
print A;      // now, A will always be 1 here

缓存中究竟发生了什么特定于模型。缓存中可能会出现各种技巧和推测行为,但 observable 行为始终遵循规则。

请参阅“Intel系统编程指南”第3卷第8.2.2节。有关内存排序的详细信息。