2017-10-09 39 views
2

我正在从原始文件Memory Barriers: a Hardware View for Software Hackers复制该图的文本。内存障碍:软件黑客的硬件视图示例3

表4示出三个码片段,由CPU的0,1同时执行,和2所有变量都是初始为零。

请注意,除非CPU 1和CPU 2在第3行上看到CPU 0分配给“b”,否则CPU 1和CPU 2都不能继续行5。一旦CPU 1和2在第4行上执行了其内存屏障,它们都将保证请参阅第2行上的内存屏障之前的CPU 0的所有分配。同样,第8行上的CPU 0的内存屏障与第4行上的CPU 1和2的内存屏障配对,因此CPU 0不会在线执行“e”分配9直到其赋值为“a”之后对其他两个CPU均可见。因此,保证线9上的CPU 2断言不会触发。

enter image description here

对我来说,线6-9上CPU0似乎没有必要在所有的,因为在第2行存储器屏障CPU 0和内存屏障在第4行用于CPU 1 & 2保证了作用的b=1被拿起,以及所有商店之前,以及a=1。然后,断言e == 0 || a == 1总是成功。

我不知道我是否忽略了任何东西。任何澄清表示赞赏。

回答

0

将6-9行留给CPU 0肯定会阻止assert()的触发。然后,如果将e初始化为零,那么除去断言之外的所有代码也是如此。但是,这两种修改都是无益的。相反,断言的关键点是“CPU2在执行结束时看到状态e==1&&a==0是否可能?”用这种方式来看待它应该强制你根据什么值按照什么顺序传播。

但是你忽略的主要原因是这篇论文是非常古老的,从那以后,在理解和形式化记忆顺序方面取得了巨大的进步。我正在为Is Parallel Programming Hard, And, If So, What Can You Do About It?添加一个新的内存顺序章节。同时,这对LWN文章herehere可能会有所帮助。

或者如果您想查看本书的当前状态,请点击这里git clone git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/perfbook.git