SSE指令

SSE是一种SIMD技术(Single Instruction Multiple Data,单指令多数据),目前Intel处理器支持的SIMD技术包括MMX、SSE、AVX。我的项目中只用到了SSE和AVX,因此只讨论这两种指令。

SSE(Stream SIMD Extentions,数据流单指令多数据扩展)是英特尔继MMX(Multi Media eXtension,多媒体扩展指令集)之后推出的新一代CPU指令集。MMX提供了8个64bit的寄存器进行SIMD操作,SSE系列提供了8个128bit的寄存器进行SIMD操作。而最新的AVX指令则支持256bit的SIMD操作。在对128bit和256bit数据进行分组加解密时,使用指令集可以明显加快运算速率。

在Visual Studio中使用SSE指令时,需引入头文件:

#include<mmintrin.h>   //mmx
#include<xmmintrin.h>  //sse
#include<emmintrin.h>  //sse2
#include<pmmintrin.h>  //sse3

SSE指令通常由三部分组成:

  1. 前缀_mm,表示该函数属于SSE指令集;
  2. 指令的操作类型,例如:load、set、add、xor等;
  3. 字母p或s,其中p表示该指令对寄存器中的每个元素进行计算,s表示该指令仅对寄存器中的一个元素进行计算。

_pixx操作所有xx位的有符号整数,寄存器为64位;
_epixx操作所有xx位的有符号整数,寄存器为128位;
_epuxx操作所有xx位的无符号整数。

SSE中的数据类型:

  1. _m128 单精度浮点数
  2. _m128d 双精度浮点数
  3. _m128i 整型 (项目中经常用到,它是一个union定义的共用体)

SSE中常用的指令:

  1. _mm_setr_epi8(a) 表示将_m128i类型的数据a设置为16个8bit的整数;
  2. _mm_loadu_si128(a) 表示将一个_m128i类型的数据a加载至SSE寄存器中;
    eg: _mm_loadu_si128((__m128i*)key)表示将key强制转为_m128i类型后放在寄存器中等待使用。
  3. _mm_srli_epi16(a,x) 表示将_m128i类型的数据a看作8个16bit的数据,对它们分别逻辑右移x位,高位补零;
  4. _mm_and_si128(a,b) 表示将_m128i类型的数据a和b进行与运算;
  5. _mm_xor_si128(a,b) 表示将_m128i类型的数据a和b进行异或运算;
  6. _mm_shuffle_epi8(a,b) 暂时没看懂这个函数要干嘛
  7. _mm_storeu_si128(a,b) 表示将_m128i类型的数据b存储到a所指的变量中。

使用SSE指令一般包括以下几个步骤:

  1. 使用load/set函数将数据从内存加载到SSE寄存器;
  2. 使用SSE指令完成相关计算;
  3. 使用store函数将数据从SSE寄存器保存到内存。

参考资料:
1.https://blog.csdn.net/jgj123321/article/details/95633431
2.https://blog.csdn.net/sinat_41612591/article/details/84869971

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值