6

關於這個問題,我只對x86和x86-64感興趣。

對於2005年MSVC,爲__faststorefence的文件說:「保證每一位前是之前任何後續全局可見。」

對於MSVC 2008和2010年,將其改爲:「保證每一位以前內存引用,包括加載和存儲內存引用,是任何後續內存引用之前全局可見。」

後者寫入的方式,這意味着我認爲這也會阻止CPU在老商店之前重新排序負載。這與第一個定義不同,這意味着內在性只是爲了處理阻塞或對舊時間存儲(非唯一的其他重新排序的x86(-64))進行重新排序。

然而,隨後的文件似乎自相矛盾:「在x64平臺上,這個程序生成是一個更快店圍欄SFENCE指令的指令在x64平臺上使用,而不是_mm_sfence這種內在。 「。

這意味着它仍然具有類似sfence的功能,因此負載仍然可以在舊商店中重新排序。那它是哪一個?有人可以澄清我的困惑嗎?

PS:尋找這個功能的GCC版本,我碰到long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local));,但我認爲它是從32位代碼;什麼是64位模擬?__faststorefence的行爲是什麼?

+7

你能給出比'__faststorefence'更好的問題標題嗎? –

+1

@JaredFarrish:比從未更好的遲到? :) – GManNickG

回答

2

您引用的GCC版本等同於MSVC生成的代碼。它依賴於x86/x86-64處理器體系結構文檔指定加載和存儲不會被LOCK ed指令重新排序的事實。

我不清楚這是否適用於非臨時存儲,因爲通常內存模型限制不適用於這些指令。

+0

嗨安東尼,感謝您的答案。目前尚不清楚的是,爲什麼這種內在的文檔指出,在x64平臺上它比在32和64上快,而不是在32和64上。這是否意味着暗示鎖定指令比僅在x86-64上的防護更便宜?此外,如果它阻止了加載和存儲被重新排序,這是一個足夠的連續一致性(不包括非臨時存儲的情況)? –

+1

此內在函數僅在x86-64上的MSVC中可用;我不知道爲什麼。我期望它在x86-64上的成本與x86上的「MFENCE」相同,因爲架構基本相同。如果你忽略非臨時商店,那麼這是一個足夠的連續一致性的圍欄。 –