Intrinsics函数总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.1400000000000001, 3.1400000000000001, 3.1400000000000001, 3.1400000000000001}

if mask=32(0010 0000) movValue={0, 1, 2, 3, 4, 3.1400000000000001, 6, 7}
英特尔Intrinsic函数总结
对INTEL Intrinsic函数的理解
• Intrinsic函数:
• INTEL的Intrinsic函数实际上是SIMD操作的接口,使向量化操作更加抽象,从而为程序优化提 供了方便。(整个过程实际上就是所谓的手动向量化)
Intrinsic函数
SIMD指令
对INTEL Intrinsic函数的理解
INTEL Intrinsic函数的优点:
1.是一种纯C语言,具有良好的交互接口 2.合理的规避了汇编,提高了手动向量化的实现效率 3.实现向量化,实现更加细粒度的并行化操作
Intrinsic函数功能:通过函数接口间接实现SIMD过程
应用范围:有一定数据量,但是数据量并不是特别大的情况下(GPU或者CPU并行开销没办法 得到很好的隐藏),对数据做单指令多数据处理(指令集并行)
Intrinsic函数基本命名规则
• intel提供了多种寄存器和指令来支持单指令多数据(simd)操作,按时间先后顺序包括 MMX系列(支持64位寄存器),SSE系列(支持128位寄存器),AVX系列(支持256位寄存 器)和AVX-512系列(支持512位寄存器)
前缀:(一般情况下)_mm,表 示是SSE指令集对应的Intrinsic函 数_mm256和_mm512分别表示 AVX,AVX-512指令集的Intrinsic函
7bit状态
• 操作数 0元素
3元素
7元素
路径1
路径2
路径1
路径2
路径1
路径2
常用的AVX Intrinsic函数举例
• 寄存器初始化函数(每个元素的值相同):
功能基本描述: 将寄存器dst塞满 双精度操作数a
常用的AVX Intrinsic函数举例
• _mm256_set1_pd 测试:
给value充值(充了四个 3.14)
常用的AVX Intrinsic函数举例
• _mm256_i32gather_pd 测试:
• 输出: • •

备注:scale:每步偏移的字节数 vindex:每个元素代表每次移动的步数 ipt:内存区域源指针 (内存的物理地址=基地址ipt+(scale*vindex)字节数)
常用的AVX Intrinsic函数举例
数前缀
分支(可 选)
指令的操作
后缀:操作的对象的数据类型
ps表示 操作所有的单精度浮点数 pd表示操作所有的双精度浮点数 epixx表示操作所有的xx位有符号整数
参数:操作数均为向量,如果 函数名中存在mask那么参数中 也会存在mask,mask的状态决
定了指令的执行路径
后缀 pd ps epi+N pi+N
• _mm256_store_pd 测试:
• 输出: 寄存器iptR
内存opt
常用的AVX Intrinsic函数举例
• 寄存器数据加载函数:
功能基本描述: 将mem_addr指向 的数据加载至dst,数据加载长度
为512位
常用的AVX Intrinsic函数举例
• _mm512_load_pd测试:
指令集 MMX SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2 AVX512
头文件 #include "mmintrin.h" #include "xmmintrin.h" #include "emmintrin.h" #include "pmmintrin.h" #include "tmmintrin.h" #include "smmintrin.h" #include "nmmintrin.h" #include "immintrin.h" #include "immintrin.h" #include "immintrin.h"
将寄存器value的值载入 opt指向的内存中
常用的AVX Intrinsic函数举例
• 寄存器初始化函数(每个元素的值可以不同):
功能基本描述: 初始化寄存器, 寄存器中每个操作数可以不同
常用的AVX Intrinsic函数举例
• _mm_set_epi32 测试:
• 输出:
• 备注:_mm_set_epi32 的输入序列顺序和输出顺序相反
• _mm512_abs_pd 测试:
• 输出: • 备注:求向量iptR中所有元素的绝对值
常用的AVX Intrinsic函数举例
• 向量元素移动指令:
功能基本描述: 将向量a或者向量 src的元素传给寄存器dst,如果
mask的第N位为1那么就把a中的 第N个元素传输到dst,如果为0
就将src中的元素传输到dst
常用的AVX Intrinsic函数举例
• Test_mm512_mask_mov_pd测试:
• 输出:
常用的AVX Intrinsic函数举例
寄存器数据存入内存:
功能基本描述: 将寄存器a中的数 据传入mem_addr指向的内存空

不同cpu架构对此操作的性能 对比
常用的AVX Intrinsic函数举例
• 举例 •
对MASK类型的理解
分别由mask寄存器以及寄 存器宽度构成
红圈处便是mask在此函数中的功能体现, 此指令根据mask寄存器中的每一bit状态, 对向量寄存器中的元素执行不同的路径
对MASK类型的理解
• 带MASK的指令执行模型:
• MASK
0bit状态 1bit状态 2bit状态 3bit状态

将mask的值充满-2147483648(32bit 10000.....0000)的是为了把所有value元素载入内存
常用的AVX Intrinsic函数举例
• 离散数据收集指令:
功能基本描述: 通过寄存器 vindex给出的索引乘以scale与基 地址 base_addr计算出内存位置
从而将其载入寄存器dst
对INTEL Intrinsic函数的理解
• 简单向量加举例:
定义寄存器变量
数组长度
Intrinsic函数的查询方法
• 1.Intel Intrinsics Guide:
• 网址: https:///sites/landingpage/IntrinsicsGuide/# • •
这里可以输入函数名 查询
按函数功能分类
按向量指令类型分类
Intrinsic函数的查询方法
• 2.英特尔开发人员专区:
• 网址:https:///zh-cn/node/683792
这里可以输入函数名 查询
Intrinsic函数分类
不同的指令集对应的Intrinsic函数特征

m2=_mm512_load_pd(ipt_2);//loading from memory

movValue=_mm512_mask_mov_pd(m1,mask,m2);
• 输出: if mask=-127 (1000 0001) movValue={3.1400000000000001, 1, 2, 3, 4, 5, 6, 3.1400000000000001}
于线程变量的归约)
常见的后缀说明
说明 参数中寄存器(操作对象)的所有元素为双精度 参数中寄存器(操作对象)的所有元素为单精度 参数中寄存器(操作对象)的所有元素是宽度为N的有符号整数 意义和epi+N 类似 只是参数中寄存器(操作对象)的宽度为64位
• 举例:
参数类型解释
256:操作对象所在的寄存器 宽度
d:寄存器存放的数据类型
• 向量相减:
功能基本描述: 向量a-向量b并塞 入dst
常用的AVX Intrinsic函数举例
• _mm256_sub_pd 测试:
• 输出:
常用的AVX Intrinsic函数举例
• 求向量绝对值:
功能基本描述: 计算向量v2绝对 值,并赋值给dst
常用的AVX Intrinsic函数举例

if mask=1(0000 0001)
movValue={3.1400000000000001, 1, 2, 3, 4, 5, 6, 7}

if mask=-1(1111 1111)
mov Value={3.1400000000000001, 3.1400000000000001, 3.1400000000000001, 3.1400000000000001,
• 输出:
内存ipt
寄存器iptR
常用的AVX Intrinsic函数举例
• 紧缩加法:
功能基本描述: 将向量a中的所有 元素累加之后形成标量传输给dst
常用的AVX Intrinsቤተ መጻሕፍቲ ባይዱc函数举例
• _mm512_reduce_add_pd测:
• 输出:
iptR为寄存器的值 value为寄存器元素累加后的值(类似
函数前缀(典型) _mm _mm _mm _mm _mm _mm _mm
_mm256 _mm256 _mm512
函数举例 _mm_add_pi16 (__m64 a, __m64 b) _mm_add_ps (__m128 a, __m128 b) _mm_add_epi16 (__m128i a, __m128i b) _mm_addsub_pd (__m128d a, __m128d b) _mm_abs_pi16 (__m64 a) _mm_ceil_ps (__m128 a) _mm_cmpgt_epi64 (__m128i a, __m128i b) _mm256_and_ps (__m256 a, __m256 b) _mm256_abs_epi16 (__m256i a) _mm512_set1_epi32 (int a)
常用的AVX Intrinsic函数举例
• Test_mm512_mask_mov_pd测试:
• 输入参数:ipt_1={0,1,2,3,4,5,6,7} ,ipt_2={3.14,3.14,3.14,3.14,3.14,3.14,3.14,3.14},mask=-127(1000 0001)
• 过程: m1=_mm512_load_pd(ipt_1);//loading from memory
相关文档
最新文档