我想在包含__int128的C++聯合上執行128位cas - 我是否需要對齊此聯合以使用https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html的__atomic_compare_exchange_n內部?128位比較和交換固有
回答
它完全取決於您的目標架構。
如果您使用的x86,那麼你the documentation聯說,沒有原子爲128位類型比較並交換:
的「__atomic」內建可與任何積分標量使用或長度爲1,2,4或8字節的指針類型。如果體系結構支持'__int128'(請參閱__int128),則也允許使用16字節的整數類型。
論__int128鏈接的文檔,它說:
作爲擴展整數標量型__int128是支持具有整數模式寬度足以容納128位的目標。只需將__int128寫爲有符號的128位整數,或將無符號__int128寫爲無符號的128位整數。 GCC不支持對長整數長度小於128位的目標表達__int128類型的整數常量。
x86沒有足夠寬的整數模式來保存128位。即使在64位x86上,long long類型也對應64位整數,小於128位寬。因此,文檔建議在x86上不支持128位類型的內部函數。
也就是說,x86架構does有一個cmpxchg16b
指令,它允許在16字節類型上進行原子比較和交換。我不知道GCC __atomic
內置插件是否支持發出這條指令。 (不幸的是,there are some x86 processors that do not support this instruction;您需要確定目標處理器是否支持它,或者編寫執行運行時檢查的代碼,並且如果當前系統不支持,則可以回退到其他實現。 64位AMD處理器不支持cmpxchg16b
,以及英特爾酷睿/酷睿2處理器也缺乏支持的某些步進,它也是not supported by Intel's Many Integrated Core (MIC) architecture)
無論如何,cmpxchg16b
確實其實要求它的目的操作數是16字節對齊,所以導致它被髮射的任何內在因素都會對用戶產生相同的要求。用__attribute__((__aligned__(16)))
註釋將實現此目標。
如果您使用x86以外的體系結構,並且它本機支持標量128位整數類型,那麼您必須查閱其文檔以查看其比較和交換指令是否需要對齊。它可能的確如此,即使在沒有必要的情況下,它也幾乎不會損害性能。
- 1. 整數比較,10和128
- 2. 比較和交換庫?
- 3. 在64位字上進行32位比較和交換
- 4. 高級比較和交換(CAS)函數?
- 5. weakCompareAndSwap VS比較並交換
- 6. 大於比較並交換
- 7. 比較NSNumber與固定值?
- 8. 固定時間比較
- 9. 比較一些原子交換其他
- 10. 快速排序 - 比較/交換櫃檯
- 11. Mergesort互換和比較
- 12. 字比較和更換
- 13. 比較/相交比較標準
- 14. 海灣合作委員會內部原子比較和交換
- 15. EhCache中的比較和交換(CAS)實現
- 16. 比較和交換後CPU高速緩存行會刷新嗎?
- 17. 用於比較和交換多個值的編程建議
- 18. 插入排序 - C中的比較和交換計數
- 19. 哪些CPU架構支持比較和交換(CAS)?
- 20. 如何實現一種新的比較和交換指令
- 21. 插入排序中的比較和交換之間的區別
- 22. POSIX兼容的文件系統對象的比較和交換
- 23. 比較提交的textarea和初始值
- 24. Java位比較,bitset?
- 25. 在每個排序算法中有多少個交換和比較?
- 26. 轉換和微秒和毫秒比較
- 27. 轉換和比較NSString和NSDate
- 28. 轉換和比較mysql和c#datetime
- 29. SQL Server爲什麼在比較位和文字時沒有隱式轉換?
- 30. 交叉表比較,產品
爲什麼不用'std :: atomic'來移植它? –