【发布时间】:2021-05-07 03:08:37
【问题描述】:
如果我运行lscpu 或查看/proc/cpuinfo,他们都说我的处理器支持AVX2。
$ lscpu | grep -o avx2
avx2
但是,当我在代码中使用 vpsllvw 时,它给出了 SIGILL。
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-7200U
解决方案
原来AVX2中只有dword和qword版本,vpsllvw是AVX512。
【问题讨论】:
-
另外,
0x29c67af & (1<<5)不为零,因此CPUID是报告 AVX2 可用性 (sandpile.org/x86/cpuid.htm),这与您的问题标题相反。您尝试运行什么vpsllw指令,确切地说(minimal reproducible example)?您是否不小心以需要 AVX512 的方式使用它?例如vpsllw ymm0, [rdi], 1? AVX2 只允许源是寄存器,用于立即数形式,或者从内存中获取计数,而不是要移位的数据。但 AVX-512 确实允许内存。 -
哦,等一下,您使用的不是
xmm, [mem], immediate表单,而是xmm, xmm, [mem]表单,count 来自内存,使用的是 NASM如果它与目标相同,则可以省略第一个源的速记。是的,AVX1 没问题。您仍然没有在您的问题中包含错误代码的minimal reproducible example。 -
所以让大家知道我做了一个大笨蛋:我一直在说 vpsllw,它工作正常,vpsllvw 是问题所在。此外,它似乎确实是使用
62编码的(不完全确定如何包含它,我只是使用x (the address)从gdb 中获取它) -
但是
vpsllvw无疑是 AVX512,不是吗? felixcloutier.com/x86/vpsllvw:vpsllvd:vpsllvq -
天哪,我正看着documentation,我什至没有注意到AVX2 上只有dword 和qword 版本
标签: assembly x86-64 avx2 cpuid