2009-11-03 62 views
6

我在Visual C++文檔,它是安全的多線程從同一個對象讀取讀取。多線程和內存

我的問題是:如何使用多個內核的CPU X86-64處理呢?

假設你有一個內存1 MB塊。不同的線程在字面上能夠同時讀取完全相同的數據,或者一次只讀取一個字,一次只允許一個內核讀取特定字?

回答

4

不僅是不同的內核允許從相同的內存塊讀取,他們被允許在同一時間寫太。如果它是「安全」或不是,那是完全不同的故事。你需要在你的代碼中實現某種警戒(通常是通過信號量或派生它們來完成的),以防止多核心以你不特別允許的方式在同一塊內存上作戰。

關於芯每次讀取的存儲器的大小,這是通常的寄存器的價值,在一個32位CPU 32位,對64位的CPU 64位,依此類推。即使流也是由dword完成的dword(例如,看看memcpy)。

關於併發多核的真實情況,每個內核都使用一條總線來讀寫內存,因此訪問任何資源(內存,外部設備,浮點處理單元)是一次一個請求,一個核心一次。然而,核心內的實際處理是完全併發的。 DMA傳輸也不會阻塞總線,併發傳輸會一次排隊並處理一個(我相信,這不是100%肯定的)。

編輯:只是爲了澄清,不同於這裏的其他答覆,我只談論沒有緩存的情況。當然,如果內存被緩存,只讀訪問是完全併發的。

+1

對於現代處理器,任何內存訪問都具有真正的高速緩存行= 64字節的大小。訪問緩存行是原子的。行可以由內核共享以供閱讀。 – osgx 2010-02-08 03:06:23

8

如果真的有你的1MB塊沒有寫那麼是的,每個核心可以從自己的緩存行沒有任何問題,因爲沒有寫入正在致力於和出現因此沒有高速緩存一致性問題讀取。

在多核架構,基本上都爲每個核心和緩存失效對不具備最先進的最新信息,一些核心的「高速緩存一致性協議」的高速緩存。我認爲大多數處理器實現緩存一致性的MOESI protocol

緩存一致性是一個複雜的話題,我們已經在很大程度上進行了討論(我特別喜歡Joe Duffy的一些文章herehere)。儘管如此,討論圍繞着代碼可能的性能損失,雖然顯然無鎖,但由於高速緩存一致性協議踢入以保持處理器高速緩存中的一致性,可能會減慢速度,但只要沒有寫入,根本就沒有保持一致性,從而不會失去性能。

正如澄清,如評論中所述,RAM不能同時訪問,因爲x86和x64架構實現了一個單獨的總線,在覈心之間共享,SMP保證訪問主存儲器的公平性。儘管如此,每種核心緩存都隱藏着這種情況,每個核心都有自己的數據副本。對於1MB的數據,在覈心更新其緩存時可能會發生某些爭用,但這可能會忽略不計。

一些有用的鏈接:

+0

今天一般正確的答案。 RAM本身不能維持多個併發訪問,但是這實際上被高速緩存所隱藏。但是如果多個內核執行非緩存讀取,則這些請求仍需要進行仲裁。 – MSalters 2009-11-03 11:26:42