AVX全称Advanced Vcetor Extension,是对SSE的后续扩展,主要分为AVX、AVX2、AVX512三种。在目前常见的机器上,大多只支持到AVX系列,因此其他SIMD扩展指令我们就先不学习了。

1. AVX系列

1.1 AVX

AVX使用了16个YMM寄存器,主要针对的是浮点数计算优化,支持32位单精度和64位双精度。AVX将打包长度由SSE的128位扩展为256位。

AVX主要有两个改进:

  • 256浮点打包数据长度。
  • 三位操作数:计算形式可以由先前的A = A + B改为A = B + C

AVX使用了SSE的128的寄存器,YMM寄存器的低位部分是XMM寄存器:

1.2 AVX2

AVX2是AVX指令的扩展,主要在整形数据方面做了完善:

  • 256位整形打包数据。
  • 算数运算支持完善。

1.3 AVX-512

AVX-512指令扩展主要把256位数据扩展到512位,在数据级并行又迈进了一步。AVX-512扩展包含好几个部分:

  • AVX-512 Foundation
  • AVX-512 Conflict Detection Instructions (CD)
  • AVX-512 Exponential and Reciprocal Instructions (ER)
  • AVX-512 Prefetch Instructions (PF)
  • AVX-512 Vector Length Extensions (VL)
  • AVX-512 Byte and Word Instructions (BW)
  • AVX-512 Doubleword and Quadword Instructions (DQ)
  • AVX-512 Integer Fused Multiply Add (IFMA)
  • AVX-512 Vector Byte Manipulation Instructions (VBMI)
  • AVX-512 Vector Neural Network Instructions Word variable precision (4VNNIW)
  • AVX-512 Fused Multiply Accumulation Packed Single precision (4FMAPS)
  • AVX-512 Vector Neural Network Instructions (VNNI)
  • AVX-512 Galois Field New Instructions(GFNI)
  • AVX-512 Vector AES instructions (VAES)
  • AVX-512 Vector Byte Manipulation Instructions 2 (VBMI2)
  • AVX-512 Bit Algorithms (BITALG)

但是只有Foundation部分是各实现保证支持的

2. AVX功能支持检测

不是所有机型都通用的指令集需要调用cpuid指令来检测:

    push ecx

    mov eax, 0
cpuid
cmp ecx, 1
jb notSupported // check if supports EAX=1 when using CPUID mov eax, 1
cpuid
and ecx, 0x18000000 // clear non-related bits
cmp ecx, 0x18000000 // check OSXSAVE and avx
jne notSupported mov ecx, 0
XGETBV // get XCR0 register value
and eax, 0x6
cmp eax, 0x6 // check XMM and YMM state
jne notSupported mov eax, 1
jmp done notSupported:
mov eax, 0 done:
pop ecx

根据Intel开发者指南,我们需要检测OSXSAVE、AVX、XMM state、YMM state这四个功能。cpuid隐式使用eax寄存器作为指令参数执行:当eax位0时,cpuid返回eax可传入最大值;传入1时,返回功能标记为,这时候我们通过检查ecx寄存器的第28、29位就可以判断是否分别支持OSXSAVE和AVX功能;之后我们要给ecx赋值0来作为参数调用XGETBV指令,这个指令返回结果的第2、3位表明XMM、YMM状态是否开启。

3. AVX优化使用

与之前的随笔一样,我们对10000000个单精度浮点数进行加操作,但是我电脑机型不支持AVX2,因此无法演示AVX系列的整数优化操作:

__m256 step = _mm256_set_ps(10.0, 10.0, 10.0, 10.0,
10.0, 10.0, 10.0, 10.0);
__m256* dst = reinterpret_cast<__m256*>(data);
for (unsigned i = 0; i < count; i += 8)
{
__m256 sum = _mm256_add_ps(*dst, step);
*dst++ = sum;
}

4. 运行结果

这个运行时间表明,有时候简单的使用AVX来进行计算优化并不一定会提升程序的运行效率,得深入分析,完整代码见链接

SIMD---AVX系列的更多相关文章

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

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

  2. 深入理解 OpenFOAM 环境变量与编译

    操作系统选择 由于 OpenFOAM 在 Linux 平台开发和测试,在非 Linux 平台无法直接对软件进行编译和安装,所以在非 Linux 平台上最简便方法是使用 docker 容器运行 Open ...

  3. AVX图像算法优化系列一: 初步接触AVX。

    弄了SSE指令集,必然会在不同的场合不同的人群中了解到还有更为高级的AVX指令集的存在,早些年也确实有偶尔写点AVX的函数,但是一直没有深入的去了解,今年十一期间也没到那里去玩,一个人在家里抽空就折腾 ...

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

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

  5. SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由480ms降低到30ms)。

    这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...

  6. SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。

    一个同事在github上淘到一个基于SIMD的RGB转Y(彩色转灰度或者转明度)的代码,我抽了点时间看了下,顺便学习了一些SIMD指令,这里把学习过程中的一些理解和认识共享给大家. github上相关 ...

  7. SIMD指令集——一条指令操作多个数,SSE,AVX都是,例如:乘累加,Shuffle等

    SIMD指令集 from:https://zhuanlan.zhihu.com/p/31271788 SIMD,即Single Instruction, Multiple Data,一条指令操作多个数 ...

  8. [转]SIMD、MMX、SSE、AVX、3D Now!、NEON

    转载来源<[整理]SIMD.MMX.SSE.AVX.3D Now!.neon> 本文摘取部分内容,详细请看原文. SIMD NEON是通用的SIMD(单指令多数据)引擎. 对于SISD,每 ...

  9. SSE图像算法优化系列三十二:Zhang\Guo图像细化算法的C语言以及SIMD指令优化

    二值图像的细化算法也有很多种,比较有名的比如Hilditch细化.Rosenfeld细化.基于索引表的细化.还有Opencv自带的THINNING_ZHANGSUEN.THINNING_GUOHALL ...

随机推荐

  1. FAT32文件系统的存储组织结构(二)

    前面已经基于一个格式化的空U盘分析了一下FAT32文件系统存储的组织结构,下面我们从文件操作的角度来分析一下文件系统的运作机制.由于换了个U盘,所以仍然贴出刚格式化的空U盘的几个重要的数据区如下:   ...

  2. 使用jQuery的一些建议

    1.尽可能使用id选择器而不是类选择器 例如: //html <p id="chooseId">测试文本</p> //jQuery console.time ...

  3. 生成report由Eamil定時寄出

    Blat 是一个命令行发邮件的小工具,仅支持简单的SMTP协议,需要SMTP服务器的支持. 官网:http://www.blat.net/    下载地址:https://sourceforge.ne ...

  4. Dynamics CRM中一个查找字段引发的【血案】

    摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复267或者20180311可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

  5. springmvc后台取值中文乱码问题

    字符-->字节.字节-->字符时需要用到编码(Encoder).解码(Decoder) 几种编码: ASCII:总共128 ISO-8859-1:涵盖大部分西欧语言字符.一个字符一个字节表 ...

  6. 【BZOJ2132】圈地计划(最小割)

    [BZOJ2132]圈地计划(最小割) 题面 BZOJ 题解 对我而言,不可做!!! 所以我膜烂了ZSY大佬 他的博客写了怎么做... 这,,...太强啦!! 完全想不到黑白染色之后反着连边 然后强行 ...

  7. 【NOIP2012】【CJOJ1093】【洛谷1083】借教室

    我写的是不完美算法!!! 题面 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的 ...

  8. 1.1 java语言有什么优点

    1.java是一种纯面向对象的语言.(更易理解和学习) 2.平台无关性.(java是一种解释性的语言,编译器会把java语言变成中间代码,然后在JVM上运行,可移植性) 3.java提供了很多内置的库 ...

  9. Listener监听器生命周期

    一.Listener生命周期 listener是web三大组件之一,是servlet监听器,用来监听请求,监听服务端的操作. listener分为:(都是接口类,必须实现相应方法) 1.生命周期监听器 ...

  10. 洛谷 P2401 不等数列

    其实有两种方法来解这道题# 第一种:找规律(非正经) 一看,这玩意像是个杨辉三角,还左右对称呢 因为新插入一个数$n$,有$n+1$个位置可以选,所以总数就乘$n+1$,对应的$f[n+1][i]$也 ...