Intel 内部指令---AVX编程基础
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中支持。
五、算术本质
5.1、加减法
数据类型 | 描述 |
---|---|
_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
在偶数位置减去,奇数位置加上,获最后得目标向量。
5.2、乘除法
数据类型 | 描述 |
---|---|
_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类型的向量进行想除 |
5.3、融合乘法和加法
数据类型 | 描述 |
---|---|
(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)(奇数次方,偶数次方) |
六、排列和洗牌
6.1、排列
数据类型 | 描述 |
---|---|
_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位元素(浮点和整数) |
6.2、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://blog.csdn.net/just_sort/article/details/94393506
Intel 内部指令---AVX编程基础相关推荐
- Vue基础学习(一)------内部指令
一.v-if v-else v-show 指令 1.v-if v-if:是vue 的一个内部指令,指令用在我们的html中,用来判断是否加载html的DOM 现在举个栗子,判断用户的登录操作 ...
- 操作系统内核Hack:(二)底层编程基础
操作系统内核Hack:(二)底层编程基础 在<操作系统内核Hack:(一)实验环境搭建>中,我们看到了一个迷你操作系统引导程序.尽管只有不到二十行,然而要完全看懂还是需要不少底层软硬件知识 ...
- Day08 - 面向对象编程基础
面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法. 把一组数 ...
- Python学习教程(Python学习路线):Day08-面向对象编程基础
Python学习教程(Python学习路线):面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程&qu ...
- python网络编程证书_《Python网络编程基础》笔记
python网络编程基础 ================== Author: lujun9972 Date: 2013-03-08 22:29:20 CST Table of Contents == ...
- [内核编程] 内核环境及其特殊性,驱动编程基础篇
[内核编程] 内核环境及其特殊性,驱动编程基础篇 在学习汉江独钓一书后,打算总结一下内核编程应该注意的事项,以及有关的一些基础知识.第一次接触内核编程,还真是很生疏,很多东西不能一下马上消化.这里做 ...
- 区块链教程(三):Solidity编程基础
注:本教程为技术教程,不谈论且不涉及炒作任何数字货币 区块连教程(一):前置知识-linux补充 区块链教程(二):基础概念介绍 区块链教程(三):Solidity编程基础 区块链教程(四):搭建私链 ...
- 2023年的深度学习入门指南(10) - CUDA编程基础
2023年的深度学习入门指南(10) - CUDA编程基础 上一篇我们走马观花地看了下SIMD和GPGPU的编程.不过线条太粗了,在开发大模型时遇到问题了肯定还会晕. 所以我们还是需要深入到CUDA中 ...
- python编程财务_Python笔记 财务小白的 day3 python编程基础(1)
[本文的我,是一个文科财务工作者.在单位信息化全靠人做的年代,确实工作压力大也忙不过来.9102年的我,深感不学习点新知识迟早要被淘汰.所以今天开始记录自己的python小白笔记,各位见笑.] 编程基 ...
最新文章
- 编译cegcc 0.59.1
- 普通行列转换(交叉表,横表变列表)
- php pdo 怎么循环,php – 在循环内绑定PDO语句的参数
- UVa10129(还没ac)各种re,o(╥﹏╥)o
- 【转】小白级的CocoaPods安装和使用教程
- 自定义构建基于.net core 的基础镜像
- java dom4j 写xml文件_Java实现——Dom4j读写XML文件
- 数据库,SQL,万恶之源?
- mysql之家_MySQL
- 经典的Java算法面试题
- easyx游戏编程:魔塔(c++语言开发)源码
- ZPL指令打印标签时出现白色窄条的坑
- 接口自动化-Cookie、Session、Token鉴定解决方案
- 人工智能辅助服装设计 | Mixlab论文带读
- QQ个性装扮气泡免费使用
- Cobalt Strike 的 Profile 文件解析
- 小程序码之拉新推广需求实现
- https之证书验证
- 什么是TTO热转印色带?
- QT Connect/Disconnect