我寫了一些無鎖的代碼,在大多數情況下可以與當地的 一起使用。自旋鎖總是需要記憶障礙嗎?旋轉在記憶障礙上是否昂貴?
本地在讀取內存時是否必然意味着我必須始終在旋轉 之前插入內存屏障?
(爲了驗證這一點,我設法產生一個讀/寫器組合 這導致讀取器從未看到 寫入的值,在某些非常特殊的條件 - 專用CPU,過程連接到CPU, 優化器接通一路向上,在 環沒有進行任何的工作 - 這樣的箭頭做點這個方向發展,但我不 完全確信通過存儲紡 屏障的成本)
是什麼。通過內存屏障旋轉的代價,如果 沒有什麼要在緩存的存儲區中刷新e緩衝區? 即所有的進程正在做(在C)是
while (1) {
__sync_synchronize();
v = value;
if (v != 0) {
... something ...
}
}
我是正確的假設,它是免費的,它不會與任何業務拖累 內存總線?
另一種方式把這個要問:沒有一個內存屏障做 什麼比更多:刷新存儲緩衝區,應用 廢票給它,並防止 重新排序的編譯器讀取在其位置/寫?
拆卸,__sync_synchronize()似乎翻譯成:
lock orl
從英特爾手冊(同樣含糊不清的新手):
Volume 3A: System Programming Guide, Part 1 -- 8.1.2
Bus Locking
Intel 64 and IA-32 processors provide a LOCK# signal that
is asserted automatically during certain critical memory
operations to lock the system bus or equivalent link.
While this output signal is asserted, requests from other
processors or bus agents for control of the bus are
blocked.
[...]
For the P6 and more recent processor families, if the
memory area being accessed is cached internally in the
processor, the LOCK# signal is generally not asserted;
instead, locking is only applied to the processor’s caches
(see Section 8.1.4, 「Effects of a LOCK Operation on
Internal Processor Caches」).
我的翻譯:「當你說LOCK,這將會很昂貴,但我們只在需要的地方使用 。「
@BlankXavier:
我做了測試,如果作家沒有明確推出從存儲緩衝區寫入,它是CPU上運行的唯一的過程中,讀者可以永遠看作者的作用(我可以用測試程序重現它,但正如我上面提到的,它只發生在特定的測試中,具有特定的編譯選項和專用的核心分配 - 我的算法工作正常,只有當我好奇時關於這是如何工作的,並寫下了明確的測試,我意識到它可能會出現問題)。
我認爲默認情況下,簡單的寫入是WB寫入(回寫),這意味着它們不會立即刷新,但讀取將取最近的值(我認爲他們稱之爲「存儲轉發」)。所以我爲作者使用CAS指令。我在英特爾手冊中發現了所有這些不同類型的寫入實現(UC,WC,WT,WB,WP),英特爾第3A卷第11-10章,仍然在瞭解它們。
我的不確定性在讀者身上:我從McKenney的論文中瞭解到,還有一個無效隊列,即從總線進入緩存的無效隊列。我不確定這部分是如何工作的。特別是,您似乎暗示循環讀取正常(即,非LOCK'ed,沒有屏障,並且僅使用volatile來確保優化器在編譯之後保留讀取)將每次都檢查到「無效隊列」 (如果存在這樣的事情)。如果一個簡單的讀取不夠好(也就是說可以讀取一箇舊的緩存行,該行在排隊失效之前仍然顯示有效(這對我來說聽起來有點不一致,但是失效隊列如何工作呢?)),那麼原子讀取會是必要的,我的問題是:在這種情況下,這會對公共汽車產生什麼影響嗎? (我想可能不是)
我仍然在閱讀我通過英特爾手冊的方式,雖然我看到商店轉發的一個很好的討論,但我還沒有找到關於失效隊列的很好的討論。我決定將我的C代碼轉換爲ASM並進行實驗,我認爲這是真正理解它如何工作的最好方法。
「在大多數情況下可以正常讀取。」 - 如果它總是無法正常工作,那麼它就不好...... –
關於全面優化的小循環測試,還有其他一些問題,例如: [Cyrix昏迷錯誤](http://en.wikipedia.org/wiki/Cyrix_coma_bug#Analysis)(儘管它不適用於這種情況),這可能會影響「假」測試。 –
@Mitch:我的,當然,這就是爲什麼我問:-) – blais