首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lscpu和cpuid说我有AVX2,但是vpsllvw不工作。

lscpu和cpuid说我有AVX2,但是vpsllvw不工作。
EN

Stack Overflow用户
提问于 2021-02-02 21:51:25
回答 1查看 371关注 0票数 2

如果我运行lscpu或查看/proc/cpuinfo,他们都说我的处理器支持AVX2。

代码语言:javascript
复制
$ lscpu | grep -o avx2
avx2

但是,当我在代码中使用vpsllvw时,它给出了SIGILL。

代码语言:javascript
复制
bits 64
global main
section .text
main:
        movdqa xmm0, [initial]
        vpsllvw xmm0, [shift]
        ret


section .data
        align 16
        initial dw 0,1,2,3,4,5,6,7
        shift dw 4,0,4,0,4,0,4,0

$ nasm -g -felf64 test.asm && g++ -g -m64 test.o组装

我知道这不是很多要处理的信息,但这是我所能想到的全部。

处理器是Intel Core i5-7200 u。

解决方案

原来只有dword和qword版本在AVX2中,vpsllvw是AVX512。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-02 22:56:24

vpsllVw需要AVX512。AVX2只有dword / qword每个元素的可变计数移位。(仅用于算术右移位)。vpsravq还需要AVX512。)旋转还需要AVX-512:vprord / vprorvd等。

这个问题的最初版本是关于vpsllw的,它是指令的AVX形式,可以追溯到MMX/SSE2 2(对所有元素使用相同的计数,从寄存器或内存位置的底部,或作为直接的计数)。下面这部分就是关于这个的。

对于将来有其他vpsllw / vpslld / vpsllq问题的(或VPSLLDQ洗牌)的读者,您可能使用了一种需要AVX-512‘t的vpsllw形式(包含即时计数和内存源数据),而您的CPU没有这种格式。

  • AVX2 1/2 (VEX前缀)允许vpsllw xmm1, xmm2, imm8 (AVX2允许ymm)
  • AVX512 (EVEX前缀)允许vpsllw xmm1, xmm2/mem, imm8,将数据从内存中移出。当然,ymm/zmm表单也是如此。
  • AVX1 1/2和AVX512允许vpsllw xmm1, xmm2, xmm3/mem128 (从内存操作数的低64位计数)。

因此,vpsllw xmm1, [rdi], 1只能使用EVEX前缀进行编码,默认情况下,NASM不会停止或警告您。

(如果你想避免意外地使用CPU功能,YASM可以使用CPU skylake AMD指令(AMD包含x86-64;它不是一个非常好的设计系统)。但据我所知,雅思根本不支持AVX-512,所以这只适用于之前的东西,而不是不同级别的AVX-512。我认为在NASM上也有一些支持,可能是用一个宏包。GAS可以使用命令行选项进行CPU特性检查。)

我不知道为什么英特尔选择而不是来允许AVX1 1/2即时计数表单的负载和移位存储源。这个限制似乎完全是武断的,并且没有机器代码编码的原因,这将是一个问题。它使用ModRM中的ModRM字段对只读源操作数(操作数编码表中的"D“行,用于该指令的手动输入。)进行编码,与EVEX表单相同,因此它似乎是一个任意的决定,将内存源设置为非法而不是允许它。( r字段是额外的操作码位,VVVV字段是目标寄存器。)

也许是某种历史原因,因为他们在设计沙桥之前就在计划AVX?由于遗留-SSE转换无法转移内存,Nehalem CPU内部就不需要支持为这种uop提供内存源。这似乎是一个站不住脚的借口,而且可能并没有给他们带来多大的好处,因为无论如何,Sandybridge最终都会对内部uop格式进行重大的重新设计。

存在类似形式的imul reg, [mem], imm这样的指令,尽管它使用ModRM /r作为目标reg,而不是作为额外的操作码位(这就是它在VEX中可编码的方式)。所以,也许没有使用/r作为额外操作码位的指令,也没有使用ModRM:r/m作为只读源操作数的指令,这可以是内存吗?

shl dword [rdi], 4这样的常规标量移位使用r/m作为读-写操作数( /r是额外的操作码位),就像许多单操作数8086指令(如neg dword [rdi] )一样,因此解码器已经不得不对内存操作数和/r中的额外操作码位进行解码。

似乎设计很差,引入了一个任意的意外限制,克服了使用某种紧凑的机器代码格式(允许内存源操作数)成为CISC的意义。幸运的是,他们用AVX-512修复了这个问题,但这会导致在您无意或不希望使用AVX-512时意外使用AVX-512的可能性。

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

https://stackoverflow.com/questions/66018139

复制
相关文章

相似问题

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