簡體   English   中英

ST64B 和 MOVDIR64B 的暫時性

[英]Temporality of ST64B and MOVDIR64B

x86_64 有一條指令movdir64b ,據我所知,這是一個 64 字節(高速緩存行)的非臨時副本(好吧,至少存儲是)。 AArch64 似乎有一個類似的指令st64b ,它執行相同大小的原子存儲。 但是,官方 ARMv9 文檔並不清楚st64b是否也是非臨時存儲。

Intel 的movdir64b指令集參考文檔要詳細得多,但我的研究還不夠深入,無法完全理解每個 memory 類型協議代表什么。

到目前為止,我可以推斷出,x86_64 指令movntdq大致相當於stnp ,並且是寫組合。 由此看來,似乎movdir64b就像一個原子存儲中的四個,因此我猜測st64b

這幾乎可以肯定是對實際情況的過度簡化(當然可能是錯誤的/不准確的),但這是到目前為止可以推斷出的。

可以將st64b用作四個stnp指令的原子序列,以這種方式作為高速緩存行的非臨時寫入嗎?

ST64B / ST64BV / ST64BV0指令旨在有效地將工作項添加到支持此接口的 I/O 設備的工作隊列中。 當目標地址映射到 I/O 設備時,存儲被轉換為非發布的寫入事務,這意味着必須有一個包含狀態代碼的完成消息,如文檔中所述。 ST64B指令簡單地丟棄狀態代碼,而其他兩條指令將其存儲在Xs操作數指定的寄存器中。

如果您查看偽代碼,這些指令要求目標地址位於不可緩存的 memory 中:

if acctype == AccType_ATOMICLS64 && memattrs.memtype == MemType_Normal then
    if memattrs.inner.attrs != MemAttr_NC || memattrs.outer.attrs != MemAttr_NC then
        fault.statuscode = Fault_Exclusive;
        return (fault, AddressDescriptor UNKNOWN);

否則,生成的狀態代碼為0xFFFFFFFF_FFFFFFFF ,如文檔中所述,它表示目標地址不支持原子 64 字節存儲。 請注意,這與表示失敗的狀態代碼 1 不同。 發生這種情況的原因有很多。 例如,目標設備的工作隊列已滿。

我從偽代碼的理解是,只要目標地址在不可緩存的 memory 中,這些指令就可以在正常的 memory 和設備 memory 上使用。你應該通過檢查狀態碼來實驗性地檢查它們是否真的在正常的 memory 上工作。

這些指令與 ARM 的STNP和 x86 的MOVNTDQ完全不同。 x86中對應的指令為MOVDIR64BENQCMDENQCMDS 盡管 ARM 和 x86 之間存在重大差異。 如果您打算在目的而非行為方面,那么您在這些說明之間進行的“心理等價”是可以的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM