- 論壇徽章:
- 4
|
"看到"是指引用其結(jié)果沒?
CPU1中這條指令之前的所有指令--這個之前是指CPU1上已經(jīng)運行的指令(這個沒多大問題,如果每CPU讀寫總是按一定序), 還是指即使存在亂序的情況下, 在亂序之前的指令序都能被"看到".
smalloc 發(fā)表于 2011-09-10 15:28 ![]()
這里是說的順序模型。不過這個是最重要的。
因為亂序模型是根據(jù)順序模型來設(shè)計的,mb()的作用,就是搞了個順序一致的點,mb()前后的指令表現(xiàn)為順序一致。
什么叫“看到”,雖然很多個文檔中定義了到底什么叫“看到”,不過以arm architecture reference manual中定義的最為標(biāo)準(zhǔn)。
什么時候可以認(rèn)為load指令被看到? 對同一地址執(zhí)行store時,不影響load的返回結(jié)果,即為load被看到
什么時候可以認(rèn)為store指令被看到? 對同一地址執(zhí)行l(wèi)oad時,將返回store的值,即為store被看到
雖然原理看起來很簡單,不過reorder buffer,load / store unit,store buffer,cache............的設(shè)計,均是以此為出發(fā)點。
一個例子,執(zhí)行mb()時需要將CPU1的各個讀寫請求通過MESI發(fā)給別的CPU,然后等待這些讀寫請求完成,即這些請求的應(yīng)答reply后,才叫mb()執(zhí)行完成。
但是為什么對于讀請求,需要這個讀操作確實在其他CPU的cache中完成,才能發(fā)回reply; 但是對于寫請求,僅僅是將invalidate request掛在其他CPU的incoming queue上,不等invalidate在其他CPU的cache中完成,就可以發(fā)回來reply???
對于上邊這種情況,有一個基本的設(shè)計原則:對于本CPU而言,
1) 從其他CPU發(fā)過來的invalidate request,
2) 從其他CPU發(fā)過來的的read reply,invalidate reply
這兩類數(shù)據(jù)包之間,一定不能亂序;但是本類數(shù)據(jù)包內(nèi)部,可以亂序。 這樣的話:
處理其他CPU發(fā)來的read replay之前,則必然已經(jīng)處理了其他CPU發(fā)來的invalidate request。即看到其他CPU的一個store操作時,則必然可看到這個store之前的所有store。
處理其他CPU發(fā)來的invalidate replay之前,則必然已經(jīng)處理了其他CPU發(fā)來的invalidate request。即看到其他CPU的一個load操作時,則必然可看到這個load之前的所有store。 |
|