2013-09-16 56 views
1

我想知道應該它需要多少個時鐘週期來修改一個std ::原子(或atomic_flag)假設它是使用最嚴格的存儲器模型設定?多少個時鐘週期來修改C++ 11原子布爾?

+10

您錯過了很多關鍵信息:什麼處理器(體系結構,模型,類型),數據在修改時的位置(緩存,主內存,另一個處理器的緩存),還有多少其他處理器系統中有多少處理器擁有原子變量的副本? –

+1

說Linux Ubuntu 12.04,2.5 GHz和Intel 64位架構。我想我關心的場景是該值已經在L1緩存中。那麼還有兩種情況:1)沒有其他線程在運行,2)多線程訪問變量,但爲了簡單起見,假設只有生產者和消費者(綁定在不同的核心上)。 –

+1

介於幾十到幾千之間......這不是一個足夠好的答案嗎? –

回答

4

這是相當難以確定它實際上究竟有多少clockcycles需要。我會的,而是試圖解釋到底發生了什麼,如果我們假設它是一個x86處理器(如註釋說明),以及運行時庫實現了atomic使用「鎖定」的指令 - 如果這些假設是錯誤的,那麼「所有投注都關閉:俗話說得好:

當執行atomic操作時,CPU將首先確保它具有「獨佔」訪問(可能)高速緩存的值。這意味着發送一條消息給所有其他CPU說「我爲這個變量的it」。每個其他CPU然後必須刷新其副本(如果修改)並將該值標記爲「無效」,然後用「我完成」回覆。

一旦所有的處理器都表示「我已完成」,主處理器可以繼續。這個過程,特別是在有大量CPU(核心)的大型系統中可能需要相當長的時間(數百或數千個週期)。

當然,CPU可以知道沒有其他的CPU已經看到它的值,或沒有其他CPU已經發出關於該值的寫入,在這種情況下,它可以非常快優化此。

你也許可以通過編寫一些代碼來了解這是多麼糟糕[在特定的機器上],在兩個線程中,例如1秒,試圖更新和讀取相同的原子變量,看看它有多好/壞。然後嘗試兩個「更新」循環(以便在兩個線程之間進行更新)。

1

它是大約相同的,以未緩存的主存儲器的訪問。大約100-1000納秒,或大約100個時鐘週期。