SFENCE和LFENCE对相邻核心的缓存有何影响?

时间:2013-12-02 10:43:45

标签: caching assembly x86 intel memory-barriers

来自第2页幻灯片图中的 speech Herb Sutter https://skydrive.live.com/view.aspx?resid=4E86B0CF20EF15AD!24884&app=WordPdf&wdo=2&authkey=!AMtj_EflYn2507c enter image description here

以下显示了单独的缓存 - L1S 和存储缓冲区( SB )。

1。在处理器中,Intel x86 缓存-L1和存储缓冲区 - 是一回事?

下一张幻灯片: enter image description here

正如我们从x86的下一张幻灯片中看到的那样,只有在重新排序后才有可能。 是:

MOV eax, [memory1] / / read
MOV [memory2], edx / / write
... / / MOV, MFENCE, ADD ... any other code

成为:

MOV [memory2], edx / / write
MOV eax, [memory1] / / read
... / / MOV, MFENCE, ADD ... any other code

这是由于处理器管道中的无序执行造成的。

2。但是,您能否展示另一个与此相似的示例 - 如何影响重新排序商店缓冲区?

3。主要问题 - 如何影响相邻核心缓存的LFENCESFENCE

这是正确的说法:

  1. SFENCE进行“推送”,即对存储缓冲区 - > L1进行刷新,然后将Core0-L1 / L2的缓存中的更改发送到所有其他核心Core1 / 2/3 ......- L1 / L2 <?/ LI>
  2. LFENCE进行“拉”,即接收来自我们核心Core0-L1 / L2中所有其他Core1 / 2/3 ...... -L1 / L2(和存储缓冲区?)的缓存的变化?

1 个答案:

答案 0 :(得分:3)

  1. 存储缓冲区不是缓存,它是一个排序队列。它保存挂起的存储,而缓存可以被认为是内存的逻辑部分(即 - 所有其他代理都可以看到任何缓存中的所有内容,并且必须正确回答窥探)

  2. 商店不会重新排序,会破坏内存排序,因为它们会立即可见(与仅影响内部状态的加载不同)。

  3. 围栏不适用于缓存,与其他核心无关。缓存已经完全可见并同步。围栏仅适用于执行顺序(如果它在内部无序完成),因此仅适用于当前上下文。

  4.   

    这是正确的说法:

         
        
    1. SFENCE进行“推送”,即对Store Buffer-&gt; L1进行刷新,然后将Core0-L1 / L2的缓存中的更改发送到所有其他核心   核心-1 / 2/3 ...- L1 / L2 <?/ LI>   
    2. LFENCE进行“拉”,即接收来自我们核心Core0-L1 / L2中所有其他Core1 / 2/3 ...... -L1 / L2(和存储缓冲区?)的缓存的变化?
    3.   

    sfence / mfence将刷新存储缓冲区,因为它们不允许保留未决的推测存储(这就是它们为防护的原因)。然而正如我所说 - 一旦他们改变了L1,他们已经可以被任何人观察到,他们不必在更远的地方冲洗。

    从同样的意义上说,lfence不会“拉”任何东西,它只会阻止所有年轻负载的执行,直到较旧的负载(以及围栏本身)完成并提交。这将通过序列化负载来影响性能,但不会以其他方式保护您免受其他核心中的任何操作,除非您有另一种方法来确保当时已经执行了您需要的任何存储(在这种情况下 - 更新加载结果及时)。