跳至內容

CMPXCHG16B

架構參考資料Feex

CMPXCHG16B 使用定義的暫存器對介面,對 16 位元組記憶體數值進行比較並有條件地交換。正確的對齊與不可分割性 (atomicity) 需求對於並行使用至關重要。

您需要瞭解的資訊

CMPXCHG16B 使用定義的暫存器對介面,對 16 位元組記憶體數值進行比較並有條件地交換。正確的對齊與不可分割性 (atomicity) 需求對於並行使用至關重要。

運作方式

該指令將 128 位元記憶體運算元與 RDX:RAX 中的預期值進行比較,然後有條件地儲存 RCX:RBX,或將觀察到的記憶體數值載入預期值暫存器中。記憶體運算元必須滿足其 16 位元組對齊需求。共用記憶體的不可分割操作需要適當的 LOCK 語意。

適用場景

執行階段可使用此指令來對標記指標 (tagged pointer) 或一對機器字組進行不可分割更新。編譯器的不可分割 API 還考慮了記憶體排序、型別對齊與備用行為;手寫組譯碼必須滿足所有這些協定規範。

如何檢查支援與啟用狀態

CPUID.01H:ECX 位元 13 指示支援 CMPXCHG16B。除了硬體位元外,還應檢查 ABI 與執行階段的不可分割性保證。在判定某個操作是否為無鎖 (lock-free) 時,請使用語言支援的不可分割性查詢方式。

請檢查確切的指令和運算元形式,而非從相鄰的擴充功能推斷支援狀態。純量整數功能通常使用通用暫存器;與向量相關的編碼並不自動代表需要向量狀態支援。

該功能未涵蓋的範疇

該指令不是通用的 128 位元算術單元,且它的存在並不代表所有語言的 128 位元不可分割型別在每個組建中都是無鎖的。即使在受支援的 CPU 上,未對齊操作仍可能觸發錯誤中斷。

實務中的相容性與效能

正確性取決於邊界情況以及速度。零輸入、溢位、進位旗標、運算元寬度、對齊和記憶體順序都可能改變語意。建議優先選擇已記錄這些細節並提供受支援後備機制的編譯器或函式庫介面。

實用驗證檢查清單

  1. 記錄所涉及的確切處理器或平台型號,以及應用程式、OS 和執行階段版本。保留實際錯誤或需求的確切措辭。
  2. 檢查該確切型號的原廠參考資料,然後在程式執行的環境中檢查有效功能和啟用狀態。
  3. 比對所選二進位檔或後端的所有需求。僅憑名稱相似的功能、別名或廣泛的技術標籤是不夠的。
  4. 確認應用程式已選擇預期的實作方式。當需求未獲滿足時,請使用其記載的診斷工具和受支援的後備機制。
  5. 一次進行一項受支援的變更,並重複執行相同的負載。隨時保留原始設定和復原途徑。

如果列出該功能但軟體無法使用

從確切發生失敗的元件著手。硬體資料庫描述的是記錄的硬體能力;作業系統或 Hypervisor 可能呈現不同的有效環境。非法指令錯誤同樣需要調查實際出錯的指令和二進位建置版本,因為損毀或無關的不受支援指令也可能產生類似的症狀。

安裝適用於該確切平台的受支援應用程式、驅動程式或執行階段版本,並在需要時使用廠商記載的基準建置版本或後備建置版本。軟體更新無法無中生有地創造處理器所缺乏的指令。韌體與安全性原則的變更應遵循系統製造商的程序和復原計劃,而非泛用的最佳化偏方。

本說明的來源與範圍

Intel 64 和 IA-32 架構軟體開發者手冊 · x86-64 psABI:處理器架構與微架構等級

這些參考資料確立了架構行為和軟體需求。它們不會獨立驗證連結硬體型號頁面上的每個功能數值。有關型號支援,請使用該頁面的製造商實證並檢查有效系統組態。本文不提供效能基準測試、認證或獨立審查日期。

來源與驗證

編輯權限:Feex。未記錄獨立審查日期。 我們的研究方式.

這篇文章實用嗎?

只要回答「是」或「否」即可。您也可以依意願選擇原因,或附上簡短說明。

這篇文章實用嗎?