SSE/AVX SIMD编程

本文深入探讨了SIMD技术及其在Intel架构中的应用,包括AVX、AVX2和AVX512指令集的功能与使用。覆盖了函数命名规则、数据加载方式、整型运算特点、浮点乘法优化及向量运算技巧。同时,对比了SSE、AVX、AVX2和AVX512的发展历程与特性。

SIMD函数的Intel官网

AVX和AVX2指令的介绍

我调用的是函数,不是汇编指令(special C functions called intrinsic functions

每个函数实际调用的可能不止1个指令,例如_mm256_fmadd_ps后面实际调用了3个函数

函数命名规则:_mm<bit_width>_<name>_<data_type> 

<bit_width>是返回值位长度;<name>是功能;<data_type>是输入参数类型;

只需要 #include <immintrin.h> 即可,不需要链接任何库,该头文件包含其他头文件会把函数映射到指令上;

初始化函数,是按Little-endian来的,{}里第一个数其实在内存里被放到最后;

_m256_load_*把数据从内存加载到__mm256变量里,要求内存里的数据必须按32位对齐,否则会报段错误;用 _m256_loadu_*来加载不一定对齐的数据;

mm256_maskload_*可用来对付末尾不足256位的数据,比如最后还剩3个float(8个float才满),则mask住的在结果里置0;

整型的计算有adds版本:_mm256_adds_epi8,处理“saturation”,"饱和"问题,即结果超出范围后自动锁定在最大or最小值上;不用带s的会直接返回越界后的数值;

水平相加函数:

乘法,因为位数会增一倍,所以一种函数是只乘一半数目,一种函数是都乘但是只保留低位在结果中;

减少浮点乘法的精度损失:instead of returning round(round(a * b) + c), they return round(a * b + c)

_mm256_permute_ps:把1个256位的8个float打散放到1个256位的8个float结果中;

_mm256_shuffle_ps   :把2个256位的一共16个float打散挑8个放到1个256位的8个float结果中;

向量reduce的例子

(我们Conv-DSSM的3个向量加和,根本不需要reduce的!我们只用了_mm256_add_ps做3个向量加和和_mm256_max_ps做词组向量max-pooling

reduce函数是AVX512才支持的!AVX2不支持!

SSE、AVX、AVX2、AVX512的区别:

SSE:       1999年,支持128位浮点数(32, 64-bit)和整数(8, 16, 32, 64-bit);迭代多个版本(SSE, SSE2, SSE3, SSSE3, SSE4)

AVX:       2011年, 支持256位浮点数(32, 64-bit);不支持整数;

AVX2:     2013年,支持256位浮点数和整数;

AVX512: 2016年,支持512位浮点数和整数;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值