首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MESI协议是否足够,还是仍然需要内存屏障?(英特尔CPU)

MESI协议是否足够,还是仍然需要内存屏障?(英特尔CPU)
EN

Stack Overflow用户
提问于 2014-12-17 09:27:19
回答 2查看 1.8K关注 0票数 4

我发现了一个英特尔文档,说明当使用字符串(不是std::string,而是程序集字符串指令)时需要内存屏障,以防止它们被CPU重新排序。

但是,当两个线程(位于两个不同的内核上)访问相同的内存时,是否也需要内存屏障?我想到的场景是,其中一个没有“拥有”缓存行的CPU写入这个内存,而核心写到它的存储缓冲区(而不是它的缓存)。需要一个内存屏障将值从存储缓冲区刷新到缓存,这样另一个核心就可以获得这个值了?

我不确定,对于英特尔,MESI协议是否能处理这个问题?

(我在下面的论文第6至12页中对此作了更好的解释:

http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf

上面的文件非常笼统,我不确定Intel CPU是如何实际处理这个问题的。

EN

回答 2

Stack Overflow用户

发布于 2014-12-17 16:27:14

MESI协议适用于缓存,存储缓冲本质上是预缓存,这意味着它还没有被“释放”到外部世界,它的同步点还没有确定。

您还需要记住,缓存一致性只保证写入不会发生在过时的抄袭副本上,并在途中丢失。这些协议的唯一保证是隐藏具有复制值的缓存(性能优化本身)的事实,并向程序员/OS公开单层平面物理内存的错觉。

这本身并不能保证从多个核写入和读取的顺序,为此,您需要使用ISA提供的附加构造来管理代码,例如锁、栅栏和依赖内存排序规则。

您所描述的情况是不可能的,因为它破坏了第一部分--没有一行的核心不能写入内存,因为它会丢失拥有行的核心中的更新数据(如果存在的话)。在MESI协议下会发生的情况是,该写将被缓冲一段时间,当轮到它发出时,它将发送一个所有权请求,该请求将使其他核中该行的所有副本无效(如果有修改的副本,则触发写回),并获取更新的数据。只有这样,作者核心才能修改行并将其标记为修改后的行。

但是,如果两个核心同时写入同一行,MESI协议只保证这些写入将有一定的顺序,而不是您可能想要的特定顺序。更糟糕的是--如果每个核心写了几行,而你想要原子化,那么MESI并不能保证这一点。您将需要积极地添加互斥或某种类型的屏障,以强制HW以您想要的方式执行写入。

票数 4
EN

Stack Overflow用户

发布于 2015-11-29 13:08:22

我认为您是在讨论英特尔IvB中的ERMSB (快速字符串),然后让rep movs使用弱有序的写操作。

My conclusion from Intel's docs是说,您仍然不需要SFENCE相对于其他商店订购这些商店,当然您也不能在rep movsb中间运行SFENCE。关于x86上的内存障碍的更多信息,请参见这个答案。

AFAICT,您所需要做的就是避免使用相同的rep movs来编写缓冲区和标记,读者将检查这些标志是否准备好了。在缓冲区的所有存储都可见之前,读取器可以看到该标志。这是新的ERMSB功能影响正确性的唯一方法,对于已经正确的程序(即不依赖于时间的侥幸)。它对memcpy / memset的性能有积极的影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27522190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档