专栏首页皮振伟的专栏[x86][kvm]avx512指令相关

[x86][kvm]avx512指令相关

前言:

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

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60),作者:AlwaysGeek

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [nptl][pthread]一种判断thread是否在执行的方法

    前言: 主线程中怎么确定某线程是否在执行? 作者遇到这个问题,第一感觉有点蒙。翻了一下glibc的代码,算是找到一个比较好的办法吧。 分析: 1,变量控制 ...

    皮振伟
  • [nptl][mutex]老司机带你十分钟定位死锁问题

    前言: 死锁问题,几乎可以用“自古”来形容。PV原语一出,信号量嵌套使用,就伴随着死锁问题的发生。死锁类问题的解决过程,基本上就是定位到发生死锁的位置以及原因,...

    皮振伟
  • [x86][QEMU]虚拟化场景下的CPU拓扑

    前言 目前的主流服务器一般是二路,即有2个NUMA node。每个NUMA上有一个CPU。比较主流的CPU一般是10Core/12Core,打开了Hyper-t...

    皮振伟
  • VMware开源云控制平面:光子控制器

    在部署微服务化容器应用时,由于容器数目较多,往往需要自动化集群调度工具,譬如Mesos,Kubernetes(K8s)以及Docker Swarm等,使用这些工...

    Henry Zhang
  • volatile的双重锁实现单例理解

    加锁有两种方式,一种是sychronized的重量级锁,一种是volatile,相比更为轻量级

    逆回十六夜
  • java — 线程池

    Mister24
  • apache2.2,mysql5.7,php7.0搭建lamp环境步骤

    进入到/var/local/,新建rar存放apache,mysql,php源码,lamp安装apache,mysql,php目录,www网站根目录

    93年的老男孩
  • 线程的基本方法

    在前面实例中调用该函数,发现t1线程cpu执行时间片多于t2线程,t1完成了t2还在开头

    晚上没宵夜
  • JVM学习笔记——线程安全与锁优化

    定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行...

    用户1665735
  • 关于线程池,那些你还不知道的事

      最近在学习线程相关的知识,然后顺理成章少不了学习线程池,刚开始在没有深入的学习之前,感觉线程池是很神秘的东西,而且完全想不到怎么才能实现一个自己的线程池,然...

    阿豪聊干货

扫码关注云+社区

领取腾讯云代金券