關於這個問題,我只對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的行爲是什麼?
6
A
回答
2
您引用的GCC版本等同於MSVC生成的代碼。它依賴於x86/x86-64處理器體系結構文檔指定加載和存儲不會被LOCK
ed指令重新排序的事實。
我不清楚這是否適用於非臨時存儲,因爲通常內存模型限制不適用於這些指令。
+0
嗨安東尼,感謝您的答案。目前尚不清楚的是,爲什麼這種內在的文檔指出,在x64平臺上它比在32和64上快,而不是在32和64上。這是否意味着暗示鎖定指令比僅在x86-64上的防護更便宜?此外,如果它阻止了加載和存儲被重新排序,這是一個足夠的連續一致性(不包括非臨時存儲的情況)? –
+1
此內在函數僅在x86-64上的MSVC中可用;我不知道爲什麼。我期望它在x86-64上的成本與x86上的「MFENCE」相同,因爲架構基本相同。如果你忽略非臨時商店,那麼這是一個足夠的連續一致性的圍欄。 –
相關問題
- 1. _mm_sfence vs __faststorefence
- 2. db.find.sort()的行爲是什麼?
- 3. getAttributeNS的行爲是什麼?
- 4. scala.concurrent.ExecutionContext.Implicits.global的行爲是什麼?
- 5. 什麼是「錯誤」行爲?
- 6. 這是爲什麼運行?
- 7. 什麼是CakePHP行爲?
- 8. 爲什麼這是不同的行爲?
- 9. ActiveRecord :: Migration的create_join_table的行爲是什麼?
- 10. runAllManagedModulesForAllRequests =「false」的具體行爲是什麼?
- 11. iscroll的默認行爲是什麼。
- 12. date.setHours(-1)的正確行爲是什麼?
- 13. 預期的行爲是什麼?
- 14. performDefaultHandlingForAuthenticationChallenge的默認行爲是什麼:?
- 15. _NET_WM_STATE_MODAL的預期行爲是什麼?
- 16. toolTip.AutoPopDelay的行爲是什麼?0
- 17. ruby中的'where'行爲是什麼?
- 18. 整數除法的行爲是什麼?
- 19. LocaleChangeInterceptor - 預期的行爲是什麼?
- 20. ACL行爲的用途是什麼?
- 21. ng-submit的默認行爲是什麼?
- 22. php set_time_limit,確切的行爲是什麼?
- 23. line-seq的行爲是什麼?
- 24. mousedown的默認行爲是什麼?
- 25. 以下代碼的行爲是什麼?
- 26. 什麼是strstr的NULL參數行爲?
- 27. 爲什麼UML不是流行的IDEF?
- 28. 這是什麼類型的行爲?
- 29. Polymer JS中的行爲是什麼?
- 30. 阻塞信號的行爲是什麼?
你能給出比'__faststorefence'更好的問題標題嗎? –
@JaredFarrish:比從未更好的遲到? :) – GManNickG