原文链接:http://blog.csdn.net/vbskj/article/details/38408213

在Intel Sandy Bridge微架构中,Intel引入了256位SIMD扩展AVX,这套指令集在兼容原MMX、SSE、SSE2对128位整点SIMD支持的基础上,把支持的总向量数据宽度扩展成了256位。新增了若干条256位浮点SIMD指令。

昨天(2014年8月5日),Intel刚刚发布了AVX2指令集,这套指令集在AVX基础上做了扩展,不过要在2013年发布的Haswell处理器上才能支持。参考1给出了AVX2的详细特性。

AVX2指令集概述

相比AVX,AVX2在如下方面做了扩展。

  • 支持的整点SIMD数据宽度从128位扩展到256位。Sandy Bridge虽然已经将支持的SIMD数据宽度增加到了256位,但仅仅增加了对256位的浮点SIMD支持,整点SIMD数据的宽度还停留在128位上,
  • 增强广播、置换指令支持的数据元素类型、移位操作对各个数据元素可变移位数的支持、跨距访存支持。

跨距访存支持

跨距访存支持即访存时,每个SIMD数据的向量数据元素可以来自不相邻的内存地址。AVX2的跨距访存指令称为”gather”指令,该指令的操作数是一个基地址加一个向量寄存器,向量寄存器中存放着SIMD数据中各个元素相对基地址的偏移量是多少。有了这条指令,CPU可以轻松用一条指令实现若干不连续数据”聚集”到一个SIMD寄存器中。这会对编译器和虚拟机充分利用向量指令带来很大便利,尤其是自动向量化。另外,参考2中对跨距访存指令的功能描述中可以看到,当该指令的偏移地址向量寄存器中任何两个值相同时,都会出GP错。这意味着编译器还是需要些特殊处理才能利用好这条指令。

跨距访存指令

但跨距访存指令仅仅支持32位整点、64位整点、单精度浮点、双精度浮点的跨距访存操作。从参考4可以猜测其实gather指令只是在硬件上分解成若干条32位或64位的微访存指令实现。这就移位着其实一条32×8的SIMD访存其实就是8次32位普通数据访存,其访存延时和延时不确定性会非常大,聊剩于无。

拓宽原有整点SIMD指令

理论上从128位到256位的成倍SIMD宽度扩展能带来一倍的加速。

从128位扩展到256位的整点SIMD指令

位操作指令支持

这些指令在加速数据库压缩、哈希,大数的算术计算方面会有帮助。

新增的位访存操作指令

任意位置的SIMD数据置换支持

这一支持将使编译器可以更灵活的使用这条指令协助自动向量化。像参考5这类工作就能实施在Intel的芯片中。

任意位置数据置换指令支持

向量-向量移位支持

之前Intel上的所有SIMD扩展指令的移位操作仅支持所有SIMD数据同时移位相同的位数,有了向量-向量移位支持,就可以为每个SIMD数据做不同的移位操作。

向量-向量移位操作支持

浮点乘法累积操作

之前的X86处理器上的累积操作多数针对整点数据,这次针对浮点数据增加的60条SIMD操作会给Intel跑浮点Benchmark,比如linpack之类的带来很多加速。

编译点滴》评论

之前几乎所有在通用微处理器上的SIMD指令,都倾向于一刀切策略,即所有的SIMD操作都针对SIMD数据实施完全相同的操作,并不存在特性化的指令。比如访存都是从一块连续的地址空间直接访存、移位时所有的数据都移动相同的位数,数据置换指令的支持也是最近才出现在通用CPU中的。AVX2的这些支持再次肯定了个性化的趋势,CPU中的SIMD支持朝着GPU的方向大踏步前进,并最终赶上并超越向量机。不得不称赞一下IBM的超前思想。AVX2中的这些特性支持在几年前的Power处理器中就已经出现了。

虽然AVX号称可以扩展到512位甚至1024位的SIMD支持,但是所带来的问题怎么解决,期待AVX3或者AMD的小宇宙爆发,或者威盛的黑马:

  1. 理论上,增加1倍的向量数据宽度,将带来2倍的晶体管数量提升。目前,Intel的AVX指令集只实现在片上每个core里,作为core中的一个功能部件,若扩展到1024位,将增加4倍的晶体管。虽然制造工艺也会改进,但功耗还是会很大,怎么解决?
  2. 在自动向量化仍然不好用的前提下,普通程序很难利用到这些功能做加速,白白的浪费这些晶体管吗?
  3. 这么大的数据计算能力,访存怎么供数?对齐貌似还是没有好的方法。还是要程序员自己吭哧吭哧写向量化代码,调试吗?芯片厂商可以每几年升级一次宽度,但兼容性如何保证,原来有64位、128位、256位分别对应MMX、XMM、YMM寄存器,以后呢?

参考

    1. http://software.intel.com/en-us/blogs/2011/06/13/haswell-new-instruction-descriptions-now-available/
    2. http://software.intel.com/file/36945
    3. http://en.wikipedia.org/wiki/Haswell_%28microarchitecture%29
    4. http://software.intel.com/en-us/forums/showthread.php?t=83459&o=a&s=lr
    5. http://portal.acm.org/citation.cfm?id=1133996

Intel的AVX2指令集解读的更多相关文章

  1. AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。

    查表算法,无疑也是一种非常常用.有效而且快捷的算法,我们在很多算法的加速过程中都能看到他的影子,在图像处理中,尤其常用,比如我们常见的各种基于直方图的增强,可以说,在photoshop中的调整菜单里8 ...

  2. LCD1602指令集解读

    LCD1602指令集(11个)     1.清屏指令(clear display)   RS=0 ,R/w=0, 01H 功能:清除液晶显示器,即将DDRAM中的内容全部填入20H(空白字符)     ...

  3. Intel指令集专有词解释

    SSE 概述 SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是MMX的超集.AMD后来在 ...

  4. CPU指令集不同导致的core分析

    最近程序需要支持CGSL系统运行,测试中发现相同操作系统的两台机器,编译机运行正常,测试机coredump.core信息汇总如下,可以看出是由于测试机不支持编译后的指令导致的问题: Program t ...

  5. 【转帖】超能课堂(186) CPU中的那些指令集都有什么用?

    超能课堂(186)CPU中的那些指令集都有什么用? https://www.expreview.com/68615.html 不明觉厉 开始的地方 第一大类:基础运算类x86.x86-64及EM64T ...

  6. 【转帖】处理器史话 | 服务器CPU市场的战役, AMD、Intel和ARM的厮杀

    处理器史话 | 服务器CPU市场的战役, AMD.Intel和ARM的厮杀 https://www.eefocus.com/mcu-dsp/377300   说完了个性鲜明的消费类电子,接下来聊一聊通 ...

  7. 2018-2019-1 20189218《Linux内核原理与分析》第二周作业

    问题一 动态库链接找不到库问题 这个问题当时确实对我造成了很大的困扰,虽然最终仍然成功用动态库链接但是问题并没有解决.现在回过头来看却觉得有点蠢,但出错的过程仍然值得总结.首先看我的目录结构: 可以看 ...

  8. ue4 优化建议与经验

    转自:https://dawnarc.com/2016/12/ue4%E4%BC%98%E5%8C%96%E5%BB%BA%E8%AE%AE%E4%B8%8E%E7%BB%8F%E9%AA%8C/ 内 ...

  9. .NET如何快速比较两个byte数组是否相等

    目录 前言 评测方案 几种不同的方案 For循环 Memcmp 64字长优化 SIMD Sse Avx2 SequenceCompare 总结 参考文献 前言 之前在群里面有群友问过一个这样的问题,在 ...

随机推荐

  1. Codeforces 336D Dima and Trap Graph 并查集

    Dima and Trap Graph 枚举区间的左端点, 然后那些左端点比枚举的左端点小的都按右端点排序然后并查集去check #include<bits/stdc++.h> #defi ...

  2. SpringBoot中使用纯scala进行开发 配置教程 非常简单的案例

    新建项目 建好之后 建一个叫scala的文件夹 并把它标记为root文件夹 修改pom.xml文件 复制粘贴如下内容: 添加的插件的作用,如果不添加,在新建文件的时候右键只能新建java的文件,无法创 ...

  3. phpinfo常见配置信息

    在开发过程中,经常碰到比如加载的是哪个配置文件.上传文件大小受限.PHP错误日志文件位置等问题需要快速查找出来并解决,因此总结记录出下面的相关配置. phpinfo - 输出关于 PHP 配置的信息 ...

  4. html5 利用谷歌地图显示当前位置

    目前,google在国内需要FQ才能上,翻不了墙的话,只能获取到经纬度信息. *调用navigator.geolocation对象时,首先要获取用户同意. navigator.geolocation. ...

  5. 清理.git文件

    @echo on color 2f mode con: cols=80 lines=25 @REM @echo 正在清理git文件,请稍候...... @rem 循环删除当前目录及子目录下所有的SVN ...

  6. CSDN博客栏目设置个性化

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha ====== <a href=" http://weibo.com/23 ...

  7. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)

    题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...

  8. 最新的裸机联想笔记本装win7系统/SSD(固态硬盘)上安装win7系统/联想K4450A i7装win7系统

    老师让我帮他装个操作系统,由于是新电脑,并且老师的电脑上另安有固态硬盘,老师要我把系统安装在固态硬盘上,BIOS是2014年7月份的,所以BIOS设置项可能会有所变化. 下面是遇到的一些问题,及解决方 ...

  9. iOS9UICollectionView自定义布局modifying attributes returned by UICollectionViewFlowLayout without copying them

    UICollectionViewFlowLayout has cached frame mismatch This is likely occurring because the flow layou ...

  10. shell脚本调用C语言之字符串切分函数——strtok

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...