来自第2页幻灯片图中的 speech Herb Sutter :https://skydrive.live.com/view.aspx?resid=4E86B0CF20EF15AD!24884&app=WordPdf&wdo=2&authkey=!AMtj_EflYn2507c
以下显示了单独的缓存 - L1S 和存储缓冲区( SB )。
1。在处理器中,Intel x86 缓存-L1和存储缓冲区 - 是一回事?
下一张幻灯片:
正如我们从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。主要问题 - 如何影响相邻核心缓存的LFENCE
和SFENCE
?
这是正确的说法:
SFENCE
进行“推送”,即对存储缓冲区 - > L1进行刷新,然后将Core0-L1 / L2的缓存中的更改发送到所有其他核心Core1 / 2/3 ......- L1 / L2 <?/ LI>
LFENCE
进行“拉”,即接收来自我们核心Core0-L1 / L2中所有其他Core1 / 2/3 ...... -L1 / L2(和存储缓冲区?)的缓存的变化?答案 0 :(得分:3)
存储缓冲区不是缓存,它是一个排序队列。它保存挂起的存储,而缓存可以被认为是内存的逻辑部分(即 - 所有其他代理都可以看到任何缓存中的所有内容,并且必须正确回答窥探)
商店不会重新排序,会破坏内存排序,因为它们会立即可见(与仅影响内部状态的加载不同)。
围栏不适用于缓存,与其他核心无关。缓存已经完全可见并同步。围栏仅适用于执行顺序(如果它在内部无序完成),因此仅适用于当前上下文。
这是正确的说法:
- SFENCE进行“推送”,即对Store Buffer-&gt; L1进行刷新,然后将Core0-L1 / L2的缓存中的更改发送到所有其他核心 核心-1 / 2/3 ...- L1 / L2 <?/ LI>
- LFENCE进行“拉”,即接收来自我们核心Core0-L1 / L2中所有其他Core1 / 2/3 ...... -L1 / L2(和存储缓冲区?)的缓存的变化?
醇>
sfence / mfence将刷新存储缓冲区,因为它们不允许保留未决的推测存储(这就是它们为防护的原因)。然而正如我所说 - 一旦他们改变了L1,他们已经可以被任何人观察到,他们不必在更远的地方冲洗。
从同样的意义上说,lfence不会“拉”任何东西,它只会阻止所有年轻负载的执行,直到较旧的负载(以及围栏本身)完成并提交。这将通过序列化负载来影响性能,但不会以其他方式保护您免受其他核心中的任何操作,除非您有另一种方法来确保当时已经执行了您需要的任何存储(在这种情况下 - 更新加载结果及时)。