2017-10-09 59 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