我想知道應該它需要多少個時鐘週期來修改一個std ::原子(或atomic_flag)假設它是使用最嚴格的存儲器模型設定?多少個時鐘週期來修改C++ 11原子布爾?
1
A
回答
4
這是相當難以確定它實際上究竟有多少clockcycles需要。我會的,而是試圖解釋到底發生了什麼,如果我們假設它是一個x86處理器(如註釋說明),以及運行時庫實現了atomic
使用「鎖定」的指令 - 如果這些假設是錯誤的,那麼「所有投注都關閉:俗話說得好:
當執行atomic
操作時,CPU將首先確保它具有「獨佔」訪問(可能)高速緩存的值。這意味着發送一條消息給所有其他CPU說「我爲這個變量的it」。每個其他CPU然後必須刷新其副本(如果修改)並將該值標記爲「無效」,然後用「我完成」回覆。
一旦所有的處理器都表示「我已完成」,主處理器可以繼續。這個過程,特別是在有大量CPU(核心)的大型系統中可能需要相當長的時間(數百或數千個週期)。
當然,CPU可以知道沒有其他的CPU已經看到它的值,或沒有其他CPU已經發出關於該值的寫入,在這種情況下,它可以非常快優化此。
你也許可以通過編寫一些代碼來了解這是多麼糟糕[在特定的機器上],在兩個線程中,例如1秒,試圖更新和讀取相同的原子變量,看看它有多好/壞。然後嘗試兩個「更新」循環(以便在兩個線程之間進行更新)。
1
它是大約相同的,以未緩存的主存儲器的訪問。大約100-1000納秒,或大約100個時鐘週期。
相關問題
- 1. 測量時鐘週期C#
- 2. 確定代碼塊需要多少個時鐘週期
- 3. 易變vs原子布爾
- 4. 正在讀取bool原子,需要多少個週期
- 5. 獲得來自時鐘週期時間
- 6. Django原子布爾值
- 7. CUDA時鐘()導致零時鐘週期
- 8. 如何計算rdtsc指令執行需要多少個時鐘週期?
- 9. GCC的時鐘週期數
- 10. Swift 3 - 原子布爾
- 11. Verilog輸出是1個時鐘週期
- 12. 如何在每n個時鐘週期切換採樣時鐘?
- 13. 如何使用C++ 11個原子能
- 14. 在一個時鐘週期內多次重新分配變量 - 鑿子
- 15. 如何在多個時鐘週期內執行for循環?
- 16. 原始修改日期時間/水銀
- 17. C++ 11的std ::線程週期
- 18. 週期檢測含有多個週期
- 19. 如何準確測量C++函數使用的時鐘週期?
- 20. C++,C++ 11,std ::原子成員函數
- 21. Qt App Building中將來發布的時鐘歪斜和修改時間
- 22. 原子文件修改
- 23. 每週六上午11點Javascript倒計時時鐘
- 24. 應該布爾標誌總是原子?
- 25. C++未修改的布爾數組更改(OS X)
- 26. 原子布爾與Java中的SynchronizedBoolean
- 27. 有關時鐘週期的幫助
- 28. CUDA扭曲發散和時鐘週期
- 29. 5個分鐘的週期,不論
- 30. 使用5級流水線CPU在指定的指令序列中需要多少個時鐘週期?
您錯過了很多關鍵信息:什麼處理器(體系結構,模型,類型),數據在修改時的位置(緩存,主內存,另一個處理器的緩存),還有多少其他處理器系統中有多少處理器擁有原子變量的副本? –
說Linux Ubuntu 12.04,2.5 GHz和Intel 64位架構。我想我關心的場景是該值已經在L1緩存中。那麼還有兩種情況:1)沒有其他線程在運行,2)多線程訪問變量,但爲了簡單起見,假設只有生產者和消費者(綁定在不同的核心上)。 –
介於幾十到幾千之間......這不是一個足夠好的答案嗎? –