Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]

Intel 内部指令 — AVX和AVX2学习笔记[通俗易懂]AVX编程基础数据类型数据类型描述__m128包含4个float类型数字的向量__m128d包含2个double类型数字的向量__m128i包含若干个整型数字的向量__m256包含8个float类型数字的向量__m256d包含4个double类型数字的向量__m256i包含若干个整型数字的向量每一种类型,从2个下划线开头,接…

大家好,又见面了,我是你们的朋友全栈君。

AVX编程基础

数据类型

数据类型 描述
__m128 包含4个float类型数字的向量
__m128d 包含2个double类型数字的向量
__m128i 包含若干个整型数字的向量
__m256 包含8个float类型数字的向量
__m256d 包含4个double类型数字的向量
__m256i 包含若干个整型数字的向量
  • 每一种类型,从2个下划线开头,接一个m,然后是vector的位长度。
  • 如果向量类型是以d结束的,那么向量里面是double类型的数字。如果没有后缀,就代表向量只包含float类型的数字。
  • 整形的向量可以包含各种类型的整形数,例如char,short,unsigned long long。也就是说,__m256i可以包含32个char,16个short类型,8个int类型,4个long类型。这些整形数可以是有符号类型也可以是无符号类型。

函数命名约定

_mm<bit_width>_<name>_<data_type>

  • <bit_width> 表明了向量的位长度,对于128位的向量,这个参数为空,对于256位的向量,这个参数为256。
  • <name>描述了内联函数的算术操作。
  • <data_type> 标识函数主参数的数据类型。

-ps 包含float类型的向量
pd 包含double类型的向量
epi8/epi16/epi32/epi64 包含8位/16位/32位/64位的有符号整数
epu8/epu16/epu32/epu64 包含8位/16位/32位/64位的无符号整数
si128/si256 未指定的128位或者256位向量
m128/m128i/m128d/m256/m256i/m256d 当输入向量类型与返回向量的类型不同时,标识输入向量类型

初始化函数

用标量值初始化

数据类型 描述
_mm256_setzero_ps/pd 返回一个全0的float类型的向量
_mm256_setzero_si256 返回一个全0的整形向量
_mm256_set1_ps/pd 用一个float类型的数填充向量
_mm256_set1_epi8/epi16/epi32/epi64x 用整形数填充向量
_mm256_set_ps/pd 用8个float或者4个double类型数字初始化向量
_mm256_set_epi8/epi16/epi32/epi64x 用一个整形数初始化向量
_mm256_set_m128/m128d/m128i 用2个128位的向量初始化一个256位向量
_mm256_setr_ps/pd 用8个float或者4个double的转置顺序初始化向量
_mm256_setr_epi8/epi16/epi32/epi64x 用若干个整形数的转置顺序初始化向量

从内存中加载数据

数据类型 描述
_mm256_load_ps/pd 从对齐的内存地址加载浮点向量
_mm256_load_si256 从对齐的内存地址加载整形向量
_mm256_loadu_ps/pd 从未对齐的内存地址加载浮点向量
_mm256_loadu_si256 从未对齐的内存地址加载整形向量
_mm_maskload_ps/pd 根据掩码加载128位浮点向量的部分
_mm256_maskload_ps/pd 根据掩码加载256位浮点向量的部分
(2)_mm_maskload_epi32/64 根据掩码加载128位整形向量的部分
(2)_mm256_maskload_epi32/64 根据掩码加载256位整形向量的部分

最后2个函数前面有一个(2),代表这两个函数只在AVX2中支持。

算术本质

加减法

数据类型 描述
_mm256_add_ps/pd 对两个浮点向量做加法
_mm256_sub_ps/pd 对两个浮点向量做减法
(2)_mm256_add_epi8/16/32/64 对两个整形向量做加法
(2)_mm256_sub_epi8/16/32/64 对两个整形向量做减法
(2)_mm256_adds_epi8/16 (2)_mm256_adds_epu8/16 两个整数向量相加且考虑内存饱和问题
(2)_mm256_subs_epi8/16 (2)_mm256_subs_epu8/16 两个整数向量相减且考虑内存饱和问题
_mm256_hadd_ps/pd 水平方向上对两个float类型向量做加法
_mm256_hsub_ps/pd 垂直方向上最两个float类型向量做减法
(2)_mm256_hadd_epi16/32 水平方向上对两个整形向量做加法
(2)_mm256_hsub_epi16/32 水平方向上最两个整形向量做减法
(2)_mm256_hadds_epi16 对两个包含short类型的向量做加法且考虑内存饱和的问题
(2)_mm256_hsubs_epi16 对两个包含short类型的向量做减法且考虑内存饱和的问题
_mm256_addsub_ps/pd 加上和减去两个float类型的向量

将饱和度考虑在内的函数将结果钳制到可以存储的最小/最大值。没有饱和的函数在饱和发生时忽略内存问题。

而在水平方向上做加减法的意思如下图:
在这里插入图片描述最后一个指令:_mm256_addsub_ps/pd 在偶数位置减去,奇数位置加上,获最后得目标向量。

乘除法

数据类型 描述
_mm256_mul_ps/pd 对两个float类型的向量进行相乘
(2)_mm256_mul_epi32 (2)_mm256_mul_epu32 将包含32位整数的向量的最低四个元素相乘
(2)_mm256_mullo_epi16/32 Multiply integers and store low halves
(2)_mm256_mulhi_epi16 (2)_mm256_mulhi_epu16 Multiply integers and store high halves
(2)_mm256_mulhrs_epi16 Multiply 16-bit elements to form 32-bit elements
_mm256_div_ps/pd 对两个float类型的向量进行想除

在这里插入图片描述在这里插入图片描述

融合乘法和加法

数据类型 描述
(2)_mm_fmadd_ps/pd/ (2)_mm256_fmadd_ps/pd 将两个向量相乘,再将积加上第三个。(res=a*b+c)
(2)_mm_fmsub_ps/pd/ (2)_mm256_fmsub_ps/pd 将两个向量相乘,然后从乘积中减去一个向量。(res=a*b-c)
(2)_mm_fmadd_ss/sd 将向量中最低的元素相乘并相加(res[0]=a[0]*b[0]+c[0])
(2)_mm_fmsub_ss/sd 将向量中最低的元素相乘并相减(res[0]=a[0]*b[0]-c[0])
(2)_mm_fnmadd_ps/pd (2)_mm256_fnmadd_ps/pd 将两个向量相乘,并将负积加到第三个。(res = -(a * b) + c)
(2)_mm_fnmsub_ps/pd/ (2)_mm256_fnmsub_ps/pd 将两个向量相乘,并将负积加到第三个 (res = -(a * b) – c)
(2)_mm_fnmadd_ss/sd 将两个向量的低位相乘,并将负积加到第三个向量的低位。(res[0] = -(a[0] * b[0]) + c[0])
(2)_mm_fnmsub_ss/sd 将最低的元素相乘,并从求反的积中减去第三个向量的最低元素。(res[0] = -(a[0] * b[0]) – c[0])
(2)_mm_fmaddsub_ps/pd/ (2)_mm256_fmaddsub_ps/pd 将两个矢量相乘,然后从乘积中交替加上和减去(res=a*b+/-c)
(2)_mm_fmsubadd_ps/pd/ (2)_mmf256_fmsubadd_ps/pd 将两个向量相乘,然后从乘积中交替地进行减法和加法(res=a*b-/+c)(奇数次方,偶数次方)

排列和洗牌

排列

数据类型 描述
_mm_permute_ps/pd _mm256_permute_ps/pd 根据8位控制值从输入向量中选择元素
(2)_mm256_permute4x64_pd/ (2)_mm256_permute4x64_epi64 根据8位控制值从输入向量中选择64位元素
_mm256_permute2f128_ps/pd 基于8位控制值从两个输入向量中选择128位块
_mm256_permute2f128_si256 基于8位控制值从两个输入向量中选择128位块
_mm_permutevar_ps/pd _mm256_permutevar_ps/pd 根据整数向量中的位从输入向量中选择元素
(2)_mm256_permutevar8x32_ps (2)_mm256_permutevar8x32_epi32 使用整数向量中的索引选择32位元素(浮点和整数)

在这里插入图片描述

Shuffle

数据类型 描述
_mm256_shuffle_ps/pd 根据8位值选择浮点元素
_mm256_shuffle_epi8/ _mm256_shuffle_epi32 根据8位值选择整数元素
(2)_mm256_shufflelo_epi16/ (2)_mm256_shufflehi_epi16 基于8位控制值从两个输入向量中选择128位块

对于_mm256_shuffle_pd,只使用控制值的高4位。如果输入向量包含int或float,则使用所有控制位。对于_mm256_shuffle_ps,前两对位从第一个矢量中选择元素,第二对位从第二个矢量中选择元素。
在这里插入图片描述

参考博客

https://blog.triplez.cn/avx-avx2-learning-notes/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139076.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 有趣的故事

    有趣的故事

    2021年6月12日
    90
  • 每天一道算法_1_放苹果「建议收藏」

    Description把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。Input第一行是测试数据的数目t(0 Output对输入的每组数据M和N,用一行输出相应的K。Sample Input17 3Sample Output8 解析: 设f(m,n) 为m个

    2022年3月10日
    44
  • 6种不同画法画平行线_9.2 平行线和它的画法(练习)-2019-2020学年七年级数学下册同步精品课堂(青岛版)…[通俗易懂]

    6种不同画法画平行线_9.2 平行线和它的画法(练习)-2019-2020学年七年级数学下册同步精品课堂(青岛版)…[通俗易懂]资料简介:第九章平行线9.2平行线和它的画法精选练习答案一.选择题(共4小题)1.(2018春•沧州期中)在同一平面内,不重合的两条直线的位置关系是(  )A.平行B.相交C.平行或相交D.平行、相交或垂直【答案】C【详解】解:在同一平面内,不重合的两条直线只有两种位置关系,是平行或相交,所以在同一平面内,不重合的两条直线的位置关系是:平行或相交.故选:C.2.(2019春•铁西区校级月考)下列…

    2026年1月31日
    5
  • mysql修改用户密码的方法及命令

    mysql修改用户密码的方法及命令方法1:用SETPASSWORD命令 首先登录MySQL。 格式:mysql&gt;setpasswordfor用户名@localhost=password(‘新密码’); 例子:mysql&gt;setpasswordforroot@localhost=password(‘123456’); 方法2:用mysqladmin 格式:mysqladmin-u用户…

    2022年6月29日
    42
  • 单片机好学还是plc好学_单片机出路

    单片机好学还是plc好学_单片机出路相信很多学电气工程专业的都会学习PLC,我当初也是电气工程专业,主要学的三菱PLC,后面也玩了下西门子的。当时觉得还挺神奇,也对编程比较感兴趣,不过学校学得太简单了,基本让你编个梯形图控制电机就算是毕业了。后来我就转去做单片机开发了,感觉比PLC更好玩,因为成本低,灵活性也高,可玩性自然也更高。最近我们无际单片机编程也有几个学员是做PLC转行过来学单片机的。我没从事过PLC的工作,根据他们描述,PLC的工资其实也还行,基本也能过万,但是就是出差太频繁,一年300天在外面出差。如果是单身寡

    2022年8月31日
    4
  • android倒计时功能的实现(CountDownTimer)[通俗易懂]

    android倒计时功能的实现(CountDownTimer)[通俗易懂]在逛论坛的时候,看到一个网友提问,说到了CountDownTimer这个类,从名字上面大家就可以看出来,记录下载时间。将后台线程的创建和Handler队列封装成一个方便的类调用。    查看了一下官方文档,这个类及其简单,只有四个方法,上面都涉及到了onTick,onFinsh、cancel和start。其中前面两个是抽象方法,所以要重写一下。         下面是官方给的一个小例子:ne

    2026年1月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号