前言:
前文《[x86][linux]AVX512指令引起的进程crash》中,介绍了一次因为avx512指令导致的进程crash。
本文记录一下avx指令导致的计算的性能差异,以及内核、虚拟化对avx512的支持。
分析:
1,linux-4.14 avx512
lscpu | grep Flags
可以看到kernel对avx的支持情况。
avx,avx2,avx512bw,avx512c,avx512dq,avx512f,avx512vl
2,linux-4.4 avx512
在linux-4.4上同样执行lscpu | grep Flags,发现只有avx,avx2,avx512cd,avx512f。
在https://www.kernel.org上查看最新的4.4 longterm的changelog,并没有支持。
3, KVM支持情况
目前linux-4.14上,已经支持了avx,avx2,avx512bw,avx512c,avx512dq,avx512f,avx512vl。Guest里面是否支持取决于Guest的kernel版本。
4,glibc对avx的支持
在ubuntu1604的版本中,使用glibc2-23,不支持v5的avx指令。
在ubuntu1804的版本中,使用glibc2-27,支持来v5的avx指令。
5,cpuid命令
目前cpuid的upstream(https://github.com/tycho/cpuid)支持了v5的avx指令。
编译upstream的cpuid,执行
也可以看到对应的支持。
在linux-4.4上执行cpuid,也可以看到,那么原因是什么呢?
avx512指令集是CPU指令,不同的cpu以及cpu版本支持情况不同。如果不支持,运行到对应的指令就会让cpu没办法解码,dmesg就会提示“invalid opcode”。
cpu提供了cpuid这条指令,根据返回值的flag判断,当前cpu是否支持。
lscpu(或者cat /proc/cpuinfo),是kernel实现的对指令支持的检查,然后输出字符串。4.4上并没有对应的代码实现,所以看不到avx512vl这样的输出。
cpuid命令,在用户态直接执行cpuid指令,获取cpu的flag。并不依赖内核实现。
所以,在v5的cpu上,4.4的内核上,会看到lscpu和cpuid的不同结果。
6,影响
作者是在测试CPU性能的时候,发觉的性能测试异常。测试代码的逻辑是:复制一段字符串到buffer中,然后执行md5计算。执行n多遍,看执行时间。
后来发现是copy字符串的地方产生的影响,即avx指令加速了memcpy的执行速度。