2012-04-08 111 views
3

在多個核心之間共享數據的效率最高。當然你可以使用共享內存,但這也是有代價的。說一個核心是不斷寫入一個變量,另一個核心必須不斷讀取它。使用MESI高速緩存一致性協議,寫入內核會導致讀核心立即使其高速緩存失效。所以在這種情況下,共享數據的最有效方式是什麼?在覈心之間共享數據的最有效方式

回答

3

在一個典型的共享內存機,場景,您所描述可能已經是最有效的方法是可行的:

  • 核心A寫入內存位置。核心B的副本無效。
  • 核心B抓取內存或核心A的緩存中的數據。

無論採用哪種方式,數據都必須從核心A發送到核心B.現代處理器中的高速緩存一致性有時會支持直接緩存到高速緩存的傳輸,而不會直接進入內存。


想要避免的情況(只要有可能)就是過度鎖定共享資源。這會增加雙向緩存一致性流量(和延遲)。

+0

那麼我讀過的是,MESI協議並不做緩存,緩存傳輸和MESI是Intel處理器使用的協議型。 AMD通過使用MOESI協議來實現這一點,但缺點是當緩存處於乾淨的共享狀態時從內存中讀取數據。 – pythonic 2012-04-08 19:45:22

+1

據我所知,現代處理器實現比這更復雜的協議。他們都「基於」MESI及其變體,但通常更復雜。例如,Power7具有13狀態一致性協議。我不確定英特爾使用的是什麼(因爲它可能是專有的),但基於我讀過的內容,它具有窺探機制...... – Mysticial 2012-04-08 19:51:21

+1

基本上,我試圖說依靠硬件緩存一致性是可能是共享內存機器上共享數據的最快(也是唯一)方式。在分佈式機器上,你沒有這個選項,所以你需要處理消息傳遞。 – Mysticial 2012-04-08 19:53:46

0

一種常見和普遍的方法是讓每個核心的數據結構可能時。

例如,在生產者 - 消費者場景中,每個消費者處理器可以具有隊列的一部分並在其上進行操作。只有當他們的工作項目用完時,他們才能聯繫生產者處理器。

當然,這並不總是可能的,但如果工作項可以架構這種方式,降低了核心之間的相互依存,並讓應用程序擴展到內核的數量。

此技術已在Solaris OS中得到廣泛使用。欲瞭解更多信息,請參閱Multicore Application Programming: for Windows, Linux, and Oracle Solaris

0

這取決於有多少你可以容忍的陳舊(請告訴我們)。

如果需要更新,以儘可能快地傳播出去,這已經是最有效的解決方案。如果您可以容忍過時數據的毫秒或秒,則可以爲每個內核使用不同的內存位置,並使用計時器進行同步。

+0

我希望儘快更新。 – pythonic 2012-04-08 21:15:43

+0

然後,這是你能做的最好的。 – usr 2012-04-08 21:16:16

相關問題