首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AVX512矢量长度与SAE控制

AVX512矢量长度与SAE控制
EN

Stack Overflow用户
提问于 2016-04-23 17:58:48
回答 2查看 751关注 0票数 5

我的问题涉及到EVEX编码的打包reg-reg指令,它没有舍入语义,它允许SAE控制(抑制所有异常),例如VMIN*、VCVTT*、VGETEXT*、VREDUCE*、VRANGE*等等。

代码语言:javascript
运行
复制
VMINPD xmm1 {k1}{z}, xmm2, xmm3
VMINPD ymm1 {k1}{z}, ymm2, ymm3
VMINPD zmm1 {k1}{z}, zmm2, zmm3{sae}

但我看不出为什么SAE不能应用于使用xmm或ymm寄存器的指令。

Intel指令集扩展编程参考表4-7的第4.6.4章中,表4-7指出,在没有舍入语义位的指令中,EVEX.b指定应用SAE,BITEVEX.L‘l指定显式向量长度:

代码语言:javascript
运行
复制
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

我想知道骑士如何执行VMINPD ymm1, ymm2, ymm3{sae} (组装为62F1ED385DCB,EVEX.L'L=01b,EVEX.b=1)

  1. CPU抛出异常。英特尔文件表4-7是误导性的.
  2. SAE是有效的,CPU只使用xmm操作,与标量操作相同。NASM和NDISASM做的对,英特尔的文档是错误的。
  3. 忽略SAE,CPU按照Intel doc中的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是错误的.
EN

回答 2

Stack Overflow用户

发布于 2016-08-15 18:20:55

您的VMINPD ymm1, ymm2, ymm3{sae}指令无效。根据Intel体系结构指令集扩展编程参考(2016年2月)中MINPD的指令集引用,只允许进行以下编码:

660F5D /r 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 3/M 256 EVEX.NDS.128.66.0F.W1 5D /r VMINPD xmm1 {k1}{z},xmm2,xmm3/m 128/m64bst EVEX.NDS.256.66.0F.W1 5D /r VMINPD /r{z}{z},,EVEX.NDS.512.66.0F.W1 5D /r zmm1 {k1}{z},zmm2,zmm3/m 512/m64bcst{sae}

请注意,只有最后一个版本以{sae}后缀显示,这意味着它是允许使用它的唯一指令形式。仅仅因为比特存在来编码特定的指令,并不意味着它是有效的。

还请注意,第4.6.3节( EVEX中的SAE支持)明确指出,SAE不适用于128位或256位向量:

EVEX编码系统允许不舍入语义的算术浮点指令使用SAE属性进行编码。这一能力适用于标量和512位矢量长度,仅通过设置EVEX.b寄存器到寄存器。当设置EVEX.b时,意味着“禁止所有异常”。..。

但是,我不确定手工编写的指令是否会生成无效的Opcode异常,如果EVEX.b位被忽略,或者EVEX.L'L位将被忽略。EVEX编码的VMINPD指令属于类型E2异常类,根据表4-17类型的E2类异常条件,该指令可以在下列任何情况下生成#UD异常:

  • 国家要求,表4-8未满足.
  • 表4-9中与代码无关的#UD条件。
  • 操作数编码#UD条件在表4-10中.
  • 表4-11的光掩码编码#UD条件.
  • 如果EVEX.L‘l != 10b (VL=512)

只有最后一个理由似乎适用于这里,但这意味着您的指令将生成带或不带{sae}修饰符的#UD异常。因为这似乎直接与指令摘要中允许的编码相矛盾,所以我不确定会发生什么。

票数 4
EN

Stack Overflow用户

发布于 2021-06-22 09:36:41

在推特上,iximeow给出了一些增编对罗斯里奇的回答如下:

  • ridge认为文本无效是正确的,但重要的细节是L'L选择了特定的ymm模式,因此如果您设置L'L来指示ymm,则只得到{rd-sae}

  • 这就是说,如果将b设置为sae,则向量宽度将立即固定为512位。

  • 矢量宽度固定在512位* *除了一些cvt指令,其中一个操作数为512位,而一个操作数较小。

(@Pepijn的评论 on Ross的答案已经链接到了这些推特上,但我认为这是一个值得单独回答的问题,如果仅仅是为了显而易见的话。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36814429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档