計算機體系架構中Coherence 與 Consistency的區別?
通常來說Coherency指Cache Coherence,Consistency指Memory Consistency
那是否存在Memory Coherence 與 Cache Consistency?能否結合實例解釋兩者?為什麼Cache Coherency不足以保證正確性?Store-Load的約束為什麼可以relax?程序員角度如何保證Consistency ?
簡單地說coherence就是同一個地址上的consistency問題。
Consistency難點在於缺乏統一時間。如果我們在地球上看太陽(同樣包括在太陽上看地球)總是在8分鐘之後,怎麼定義一個地球上發生的寫事件和一個太陽上幾乎同時發生的內存寫事件到底誰先誰後呢?如果他們在同一個地址上,在好多好多光年外的半人馬座中不同的恆星上讀這個內存的時候,應該得到的是在太陽上寫的值,還是在地球上寫的值呢?如果這兩個寫是在不同的內存地址上呢?如果這兩個寫之間存在因果關係呢?
Shared memory模型的基本假設是經典時空觀的(每個事件有統一的時間刻度),而分散式系統本質上是需要引入相對論時空觀的,同一信息事件在不同坐標系之間傳遞都會經過時間變換。所以,store-load的約束不是可以relax,而是其實物理邏輯上memory模型已經不復存在了,要維持它還存在的假象則往往要付出非常高的性能代價。
不過也不一定……實際工程中,如果時間刻度差別沒那麼大(比如都在一個房間里),其實互相等一等,取一個大伙兒之間最慢的刻度就好了。其實大部分時候也是能接受的。
程序員角度……理解上我覺得最簡單(也最本質)的辦法就是別把shared memory當理所當然,盡量別用經典思維模式,忘了內存讀寫,記著一切本質都是message。應用上應該有很多現成的庫吧,如果性能還能接受,用就是了……謝邀。
@劉賀已經寫的非常棒了。我只來補充幾點,針對答主的直接疑問。
1. Memory Coherence是存在的,事實上Cache Coherence還是從Distributed Memory System裡面誕生的。 Cache Consistency也是存在的,照我的理解,memory consistency裡面的memory指代的是整個memory hierarchy,不單是cache。
2. 實例有不少,推薦一本書A Primer on Memory Consistency and Cache Coherence,裡面有講解,我比較懶,不太喜歡在知乎上貼圖。
4. 先來看第4問,很多Store-Load操作的不是同一個地址,在不同場合下可以允許不同形式的亂序操作提高性能,比如把一個數組裡面所有元素加1,先load-add-store第1個元素或者第10個元素在不觸發異常的情況下沒有區別,如果允許一定程度的亂序可以解放硬體去發掘更多的並行性。
3. 再回頭說3,在4的基礎上如果允許了亂序,就會導致有些狀況下指令的實際執行次序與程序員所設想的順序不同,導致出錯,Cache Coherence只能保證多個核心相互看到新值,而如果更新順序本身就錯了的話,Coherence是無能為力的。
5. 提供一些語義上的輔助,幫助編譯器和底層微結構判斷呢哪些地方不能重排序,哪些地方可以,哪些操作不能被打斷,哪些操作可以,等等,也就是使用鎖、原子操作等。Memory Consistency:
假設一個擁有在線課程計劃表的大學。計算機體系結構課程最初被安排到了152室。在課程開始的前一天,學校登記員決定將課程轉到252室。登記員向網站的管理員發送電子郵件要他更新在線計劃表。幾分鐘後,登記員向所有登記的學生髮送信息要他們檢查一下最進更新的計劃表。不難想像一下這樣的情形,如果網站的管理員太忙而沒有及時的發布更新的信息,這時反應積極的學生收到信息後馬上就去檢查在線計劃表,那麼他們會看到(老的)課程仍在152室舉行。即使在線計劃表最終更新到了252室,登記員執行了正確的「寫」順序,這些反應積極的學生卻看到了一個不同的順序,導致了他們去了一個錯誤的教室。Cache Coherence:
一個學生檢查網上課程計劃表,發現計算機系統結構將在152室舉行(讀取數據),然後將這個信息拷貝到了他的記事本(將數據緩存)。接著,學校的登記員決定將該課程轉到252室並更新了網上的計劃表(寫入數據)。現在學生拷貝的數據就是陳舊的了,我們遇到了一個不一致的狀況。如果他去了152室,就會找不到他所要上的課程。這樣看來分散式文件系統中Memory Coherence的問題也是存在的。多核心亂序執行如果無法確保最新的數據是正確的,那就只能通過程序員使用鎖、原子操作來保證咯。
摘取自A Primer on Memory Consistency and Cache Coherence的例子個人理解Coherency是空間一致性,即每個觀察者都應該看到最新的數據。
Consistency是時間一致性,在多觀察者存在的情況下,允許不同的觀察者在不同的時間看到同一件事情,但是不允許不同的觀察者看到的兩件事情之間發生的順序不同。
亂序執行會導致Data hazard/dependency,包括RAW, WAR, WAW,通常情況下不認為RAR會導致任何問題。但是在多核或者SMT的情況下,RAR也會有問題。考慮兩個支持亂序執行的核/線程分別執行以下程序,假設兩個Core的R0值相等:
Core1: LDR R1, [R1]; LDR R2, [R1]Core2: STR R3, [R1];由於亂序執行的存在,(簡單起見,忽略緩存)內存端可能看到以下幾種執行順序:
LDR1, LDR2, STR3;LDR1, STR3, LDR2;STR3, LDR1, LDR2;STR3, LDR2, LDR1;LDR2, LDR1, STR3;LDR2, STR3, LDR1;
前五種情況,(至少對於ARM架構來說)都是沒有問題的,但是第六種有問題。前五種可以是因為,要麼較老的LDR1看到了較老的數據,較小的LDR2看到較新的數據,要麼兩者同時看到了一樣的數據。第六種不可以是因為,較老的LDR1看到了較新的數據而較小的LDR2看到了舊的數據。保證類似於第6種情況不會發生的機制,就是Consistency。沒人理!%&>_&<%Coherence 保證的是同一地址有不同copy的時候,保證load看到的是在timing上離自己最近的store。但是,只保證Coherence 是不夠的,在multip processor不同地址的多個copy訪問的時候會出現問題,這個就是consistency 。Coherence is concerned with updates/invalidations to a single shared variable.Consistency is concerned with the behavir of memory references from multiple concurrent threads.對我自己來說,Consistency的理解難點在於,程序員的大腦總是默認Consistency是存在的,所以根本沒有必要構建這個概念。但是對於硬體工程師來說,這個很需要care。
Sequential consistency is the strictest memory-consistency model expected by a programmer.(Parallel Computer Organization and Design)
如上所言,SC對於hardware來說是很嚴格的,所以就想放鬆,也就有了store-load的relax。
Relaxed models not relying on synchronization (這種情況 程序員不必做更多工作)
Relaxed models relying on synchronization (程序員要做sync的工作 保證整體SC)(這塊依然不懂,但是感覺程序員的debug明顯加重在這種情況下,略坑啊)
To ensure SC, many hardware and compliler optimization are disallowed. Therefore, many commecail machine use relaxed models. 參考:Shared Memory Consistency Models: A Tutorial Sarita V. Adve Kourosh Gharachorloo推薦閱讀:
※這張截圖裡面的電腦的系統是什麼?
※有哪些小的 C 語言項目(大概幾千行)適合個人開發?
※在一家大公司如果想要自暴自棄的話, 是不是就可以選擇去開發Android?
※為什麼黑客領域幾乎一片男生?
※2G內存和64位處理器到底裝32位還是64位系統?