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

dig*_*ger 6 cpu x86 multithreading cpu-cache

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

A=1
B=1
Run Code Online (Sandbox Code Playgroud)

包含A的缓存行,最初由CPU1拥有,并且包含由CPU0拥有的B.

我有两个问题:

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

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

而(B = 0);
打印A.

是否足以加之间只有lfence whileprint命令在CPU1不添加之间的SFENCE A=1B=1在CPU0得到1总是在x86上打印出来?

while (B=0);
lfence
print A
Run Code Online (Sandbox Code Playgroud)

srk*_*ing 8

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

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

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

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