簡體   English   中英

AVX512 矢量長度和 SAE 控制

[英]AVX512 vector length and SAE control

我的問題涉及沒有舍入語義的 EVEX 編碼打包 reg-reg 指令,這允許 SAE 控制(抑制所有異常),例如 VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE* 等。英特爾聲明 SAE 意識僅具有完整512位向量長度,例如

VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}

但我不明白為什么 SAE 不能應用於使用 xmm 或 ymm 寄存器的指令。

英特爾指令集擴展編程參考表 4-7 的第 4.6.4 章中,在沒有舍入語義的指令中,位 EVEX.b 指定應用 SAE,位 EVEX.L'L 指定顯式向量長度:

00b: 128bit (XMM)
01b: 256bit (YMM)
10b: 512bit (ZMM)
11b: reserved

所以他們的組合應該是合法的。

然而 NASM 將vminpd zmm1,zmm2,zmm3,{sae}組裝為 62F1ED185DCB,即 EVEX.L'L=00b, EVEX.b=1,由 NDISASM 2.12 反匯編為vminpd xmm1,xmm2,xmm3

NASM 拒絕組裝vminpd ymm1,ymm2,ymm3,{sae}並且 NDISASM 將 62F1ED385DCB (EVEX.L'L=01b, EVEX.b=1) 反匯編為vminpd xmm1,xmm2,xmm3

我想知道 Knights Landing CPU 是如何執行VMINPD ymm1, ymm2, ymm3{sae} (組裝為 62F1ED385DCB, EVEX.L'L=01b, EVEX.b=1) 的

  1. CPU 拋出異常。 英特爾文檔表 4-7 具有誤導性。
  2. SAE 有效,CPU 僅使用 xmm 操作,與標量操作相同。 NASM 和 NDISASM 做對了,Intel 文檔是錯誤的。
  3. SAE 被忽略,CPU 根據 Intel 文檔中的 VMINPD 規范以 256 位運行。 NASM 和 NDISASM 是錯誤的。
  4. SAE 有效,CPU 以指令代碼中指定的 256 位運行。 NASM 和 NDISASM 錯了,Intel doc 需要用 {sae} 補充修飾 xmm/ymm 指令。
  5. SAE 有效,CPU 以隱含的 512 位全矢量大小運行,與 EVEX.L'L 無關,就像允許靜態舍入 {er} 一樣。 NDISASM 和 Intel 文檔表 4-7 是錯誤的。

您的VMINPD ymm1, ymm2, ymm3{sae}指令無效。 根據英特爾架構指令集擴展編程參考(2016年2月)中 MINPD的指令集參考,僅允許以下編碼:

 66 0F 5D /r MINPD xmm1, xmm2/m128 VEX.NDS.128.66.0F.WIG 5D /r VMINPD xmm1, xmm2, xmm3/m128 VEX.NDS.256.66.0F.WIG 5D /r VMINPD ymm1, ymm2, ymm3/m256 EVEX.NDS.128.66.0F.W1 5D /r VMINPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst EVEX.NDS.256.66.0F.W1 5D /r VMINPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst EVEX.NDS.512.66.0F.W1 5D /r VMINPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst{sae} 

請注意,只有最后一個版本顯示帶有{sae}后綴,這意味着它是您允許使用它的唯一形式的指令。 僅僅因為存在編碼特定指令的位並不意味着它有效。

另請注意,部分4.6.3,EVEX中的SAE支持,清楚地表明SAE不適用於128位或256位向量:

EVEX編碼系統允許使用SAE屬性編碼沒有舍入語義的算術浮點指令。 此功能適用於標量和512位向量長度,僅通過設置EVEX.b進行寄存器到寄存器。 設置EVEX.b時,隱含“禁止所有異常”。 [...]

我不確定你的手工制作指令是否會產生Invalid Opcode異常,如果EVEX.b位將被忽略,或者EVEX.L'L位將被忽略。 EVEX編碼的VMINPD指令屬於E2類異常類,根據表4-17,類型E2類異常條件,該指令可以在以下任何一種情況下生成#UD異常:

  • 國家要求,表4-8未達到。
  • 表4-9中的操作碼獨立的#UD條件。
  • 操作數編碼表4-10中的#UD條件。
  • Opmask編碼表4-11的#UD條件。
  • 如果EVEX.L'L!= 10b(VL = 512)。

只有最后一個理由似乎適用於此處,但這意味着您的指令會生成#UD異常,無論是否有{sae}修飾符。 由於這似乎與指令摘要中允許的編碼直接相矛盾,我不確定會發生什么。

在 Twitter 上, iximeow 為上面羅斯·里奇的回答提供了一些補充

  • ross ridge 說的對,文字無效,但重要的細節是L'L選擇了特定的 SAE 模式,所以如果你設置L'L表示ymm ,你只會得到{rd-sae}
  • 這就是說,如果你完全設置bsae ,向量寬度立即固定為 512 位
  • 矢量寬度固定為 512 位*

    *除了一些 cvt 指令,其中一個操作數是 512 位並且一個操作數更小

(@Pepijn 對羅斯回答的評論已經與這些推文相關聯;但我認為值得將其作為單獨的答案,即使只是為了可見性。)

暫無
暫無

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

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