[x86][kvm]avx512指令相关

2018-10-23 10:03:01 浏览数 (1)

前言:

前文《[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的执行速度。

0 人点赞