SIMD---AVX系列
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系列的更多相关文章
- 【转帖】超能课堂(186) CPU中的那些指令集都有什么用?
超能课堂(186)CPU中的那些指令集都有什么用? https://www.expreview.com/68615.html 不明觉厉 开始的地方 第一大类:基础运算类x86.x86-64及EM64T ...
- 深入理解 OpenFOAM 环境变量与编译
操作系统选择 由于 OpenFOAM 在 Linux 平台开发和测试,在非 Linux 平台无法直接对软件进行编译和安装,所以在非 Linux 平台上最简便方法是使用 docker 容器运行 Open ...
- AVX图像算法优化系列一: 初步接触AVX。
弄了SSE指令集,必然会在不同的场合不同的人群中了解到还有更为高级的AVX指令集的存在,早些年也确实有偶尔写点AVX的函数,但是一直没有深入的去了解,今年十一期间也没到那里去玩,一个人在家里抽空就折腾 ...
- AVX图像算法优化系列二: 使用AVX2指令集加速查表算法。
查表算法,无疑也是一种非常常用.有效而且快捷的算法,我们在很多算法的加速过程中都能看到他的影子,在图像处理中,尤其常用,比如我们常见的各种基于直方图的增强,可以说,在photoshop中的调整菜单里8 ...
- SSE图像算法优化系列九:灵活运用SIMD指令16倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由480ms降低到30ms)。
这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...
- SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。
一个同事在github上淘到一个基于SIMD的RGB转Y(彩色转灰度或者转明度)的代码,我抽了点时间看了下,顺便学习了一些SIMD指令,这里把学习过程中的一些理解和认识共享给大家. github上相关 ...
- SIMD指令集——一条指令操作多个数,SSE,AVX都是,例如:乘累加,Shuffle等
SIMD指令集 from:https://zhuanlan.zhihu.com/p/31271788 SIMD,即Single Instruction, Multiple Data,一条指令操作多个数 ...
- [转]SIMD、MMX、SSE、AVX、3D Now!、NEON
转载来源<[整理]SIMD.MMX.SSE.AVX.3D Now!.neon> 本文摘取部分内容,详细请看原文. SIMD NEON是通用的SIMD(单指令多数据)引擎. 对于SISD,每 ...
- SSE图像算法优化系列三十二:Zhang\Guo图像细化算法的C语言以及SIMD指令优化
二值图像的细化算法也有很多种,比较有名的比如Hilditch细化.Rosenfeld细化.基于索引表的细化.还有Opencv自带的THINNING_ZHANGSUEN.THINNING_GUOHALL ...
随机推荐
- Django学习-22-Form
Form是Django的功能较强的验证组件,负责各种表单验证 input中的name属性值要和form中的字段名相同 from django import forms from django.form ...
- java自带的类压缩和下载,以及递归删除动态的文件(shiro项目中来的十)
详见项目,不用借助于任何外在的jar包,通过jre自带的实现.
- java 值传递和引用传递
public class PassValue { /** * 值传递 基本数据类型参数 * 值传递:方法调用时,实际参数吧他的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值 */ ...
- 登录对话框(窗体程序)--JAVA基础
1.用到的JFrame(框架)类对象(这里设JFrame类对象是frame)的方法有: frame.add(); 添加组件到frame框架中 frame.setVisible(); 设置框架是否可见 ...
- JAVA IDE IntelliJ IDEA 快捷键使用详记
一.高效定位代码 1.项目之间的跳转 Ctrl + Alt + [ :切换到下一个项目窗口 Ctrl + Alt + ] : 切换到上一个项目窗口 2.文件之间的跳转↑↓←→ Ctrl + E ...
- 期望$DP$ 方法总结
期望\(DP\) 方法总结 这个题目太大了,变化也层出不穷,这里只是我的一点心得,不定期更新! 1. 递推式问题 对于无穷进行的操作期望步数问题,一般可用递推式解决. 对于一个问题\(ans[x]\) ...
- [BZOJ1601] [Usaco2008 Oct] 灌水 (kruskal)
Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. ...
- iOS开发--XMPPFramework--环境的配置(一)
一.XMPPFramework概述 XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具, ...
- 【BZOJ3529】【SDOI2014】数表
Time Limit: 1000 ms Memory Limit: 512 MB Description 有一张n×m的数表,其第i行第j列 (1≤i≤n,1≤j≤m)的数值为能同时整除i和j的所有自 ...
- Go实现短url项目
首先说一下这种业务的应用场景: 把一个长url转换为一个短url网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长url的地址转换为短url地址 通过短url获取对应的原始长u ...