日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并行编程——内存模型之缓存一致性

發布時間:2023/12/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并行编程——内存模型之缓存一致性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 ?定義

緩存一致性 Cache coherence 簡稱 CC, 緩存一致性協議是在共享緩存多處理器架構確保最終一致性最突出、最重要的機制。這些協議在緩存線(cache-line)級別實現了對一致性的保證。緩存線是從主內存中讀取數據和向內存中寫入數據的緩存單位(至少從一致性機制的角度看是這樣的)。商用處理器上三個最突出最重要的緩存一致性協議—MOESI, MESI, and MESIF—的縮寫都來自它們為緩存線定義的各種狀態:Modified(已修改), Owned(被占用),Exclusive(獨占的), Shared(共享的), Invalid(無效的), and Forward(轉發的)。緩存一致性協議在對內存確保最終一致性的內存一致性機制的幫助下對這些狀態進行管理。

?Intel 奔騰: MESI 協議

AMD opteron: MOESI 協議

Intel i7 : MESIF 協議

問題 :為什么需要緩存CC?

答案:

從第二章的體系結構圖可以看到,一般每個核心都有一個私有的L1級和L2級Cache,同一個物理CPU上的多個核心共享一個L3級緩存,這樣的設計是出于提高內存訪問性能的考慮。但是這樣就有一個問題了,每個核心之間的私有L1,L2級緩存之間需要同步啊。比如,核心1上的線程A對一個共享變量global_counter進行了加1操作,這個被寫入的新值存到核心1的L1緩存里了;此時另一個核心2上的線程B要讀global_counter了,但是核心2的L1緩存里的global_counter的值還是舊值,最新被寫入的值現在還在核心1上。這就需要CPU有一個模塊來保證,同一個內存的數據在同一時刻對任何對其可見的核心看來,數據是一致的,由第二章緩存圖知道,這種專門的組件就是緩存控制器(Cbox,Bbox)。

2 ?CC協議

2.1 ?MESI?

詳細了解參考 : Cache一致性協議之MESI : http://blog.csdn.net/muxiqingyang/article/details/6615199

2.2 MOESI

MOESI 是MESI 的一種拓展

下面是基于MOESI的一個例子,展示的是共享緩存多處理器中共享讀寫的生命周期。

[http://www.oschina.net/translate/nonblocking-algorithms-and-scalable-multicore-programing]

2.3 ?MESIF

Intel提出了另外一種MESI協議的變種,即MESIF協議,該協議與MOESI協議有較大的不同,也遠比MOESI協議復雜,該協議由Intel的QPI(QuickPath Interconnect)技術引入,其主要目的是解決“基于點到點的全互連處理器系統”的Cache共享一致性問題,而不是“基于共享總線的處理器系統”的Cache共享一致性問題。

在基于點到點互連的NUMA(Non-Uniform Memroy Architecture)處理器系統中,包含多個子處理器系統,這些子處理器系統由多個CPU組成。如果這個處理器系統需要進行全機Cache共享一致性,該處理器系統也被稱為ccNUMA(Cache Cohenrent NUMA)處理器系統。MESIF協議主要解決ccNUMA處理器結構的Cache共享一致性問題,這種結構通常使用目錄表,而不使用總線監聽處理Cache的共享一致性。

?

關于MESIF ,可以參閱陳懷臨的 “淺談intel qpi 的 MESIF 協議和home,soure snoop”

http://www.360doc.com/content/10/1207/13/158286_75798413.shtml

3?偽共享

3.1 ?定義

從上一節可以知道,緩存一致性協議操作的最小對象的緩存行,緩存行內數據的修改、寫入內存、寫入其他緩存等操作都會改變其狀態,這樣,在共享緩存多核架構里,數據結構如果組織不好,就非常容易出現多個核線程反復修改同一條緩存行的數據導致緩存行狀態頻繁變化從而導致嚴重性能問題,這就是偽共享現象。

?下圖就是一個偽共享的例子,core1上運行的線程想修改變量x,core2上運行的線程想修改變量y,但x和y剛好在一個緩存行上。每個線程都要去競爭緩存行的所有權來更新變量。如果核心1獲得了所有權,緩存子系統將會使核心2中對應的緩存行失效。當核心2獲得了所有權然后執行更新操作,核心1就要使自己對應的緩存行失效。這會來來回回的經過L3緩存,大大影響了性能。如果互相競爭的核心位于不同的插槽,就要額外橫跨插槽連接,問題可能更加嚴重。

?

3.2 ?解決

與緩存行導致性能問題的嚴重相比,對這個問題的解決方案顯得非常簡單,這就是緩存行填充,通過填充緩存行,使得某個核心線程頻繁操作的數據獨享緩存行,這樣就不會出現偽共享問題了。下面是一個例子。

32位機 long long 是8字節,這樣一個緩存行64字節可以存8個 counter, 這樣最差的情況下同時會有8個線程爭奪同一個緩存行的操作權,性能會非常低。解決方式非常簡單,如下圖所示,每個counter 變量增加一個填充變量 pad,使得一個counter 變量剛好是一個緩存行大小,這樣數組counters 每個元素占用一個緩存行,所有線程獨占自己的緩存行,避免了偽共享問題。

轉載于:https://www.cnblogs.com/jiayy/p/3246133.html

總結

以上是生活随笔為你收集整理的并行编程——内存模型之缓存一致性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。