当我的程序与获取的语义来执行加载操作/存储操作与释放语义或也许全栅栏,它无效的CPU的缓存中。结果 我的问题是这样的:如果缓存中的部分实际上是无效的?只有高速缓存行认为,我用获取/释放的变量?或许整个缓存无效? (L1 + L2 + L3 ..等?)。是否有这个问题,当我用获取/释放语义,还是有差别时,我使用的是全栅栏?

有帮助吗?

解决方案

我不是这方面的专家,但我无意中发现这个文件上,也许是有帮助 http://www.rdrop.com/users/ paulmck /可扩展性/纸/ whymb.2009.04.05a.pdf

其他提示

当您执行没有围栏或互斥的负载,然后将负载值可能来自任何地方,即,高速缓存,寄存器(由编译器优化的方式),或RAM ...但是从你的问题,你已经知道这一点

在大多数互斥实施方式中,当获得互斥,栅栏总是施加,明确地(例如,MFENCE,屏障等)或隐含地(例如,锁定前缀以锁定在x86的总线)。这将导致所有高速缓存的路径上的高速缓存行被无效。

请注意的是,整个高速缓存不被无效,只是各高速缓存行的存储位置。这也包括用于互斥的线(其通常在存储器中的值来实现)。

当然,也有具体的体系结构的细节,但是这是它是如何工作的总称。

另外请注意,这不是无效缓存的唯一原因,因为有可能是需要在另外一个缓存将被无效的一个CPU上的操作。做一个谷歌搜索“高速缓存一致性协议”将为您提供关于这个问题的大量信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top