Intel Intrinsic SSE

指令介绍: SSE是由英特尔公司推出的基于CPU的指令运算集,Pentium III之后的CPU基本都支持SSE指令。该指令集可以一次性控制128位内存中的数,并对其进行各种运算,例如加减乘除、与或、大于小于、移位等,它的操作对象是__m128i的数据类型,即内存中的128位数据。针对不同的应用场景,可以将数据分按为8位、16位、32位、64位进行运算,比如指令

__m128i _mm_add_epi8 (__m128i a, __m128i b)

作用是将128位中每8bit存储的信息相加存储到一个新的8bit中

__m128i _mm_add_epi16 (__m128i a, __m128i b)

作用是将128位中每16bit存储的信息相加存储到一个新的16bit中,以此类推

应用场景: 对于视频图像处理、编解码等方面,举个简单的例子,给定一个长H宽W的图像像素信息,做插值运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void interpolation(int *pixel, int pix_stride, int *dst, int dst_stride){
__m128i coeff = _mm_set_epi32(-5, 13, 13, -5); //设置插值系数
for(int i = 0; i < H; i++){
for(int j = 0; j < W; j += 4){
//首先从数组中读取像素到变量,该指令为读取无边界的内存数据
__m128i src = _mm_loadu_si128((__m128i *)(pixel + j));
//像素值与系数相乘得到结果,存在32位里
__m128i D = _mm_mullo_epi32(src, coeff);
//将运算结果存到对应数组中
_mm_loadu_si128((__m128i*)(dst + j));
}
pixel += pix_stride; //指针更新到下一行的首地址
dst += dst_stride; //指针更新到下一行的首地址
}
}

下面给出INTEL指令参考文档网址,https://software.intel.com/sites/landingpage/IntrinsicsGuide/ ,需要用到哪个指令到上面搜指令的用法即可,覆盖了大多数基础的运算以及一些高级的运算,熟练运用后可以大幅提升工程的效率。

Intel Intrinsic AVX

指令介绍:AVX是英特尔公司既SSE之后推出的下一代指令集,一次可以处理内存256位数,基本包含了SSE中的各个指令运算功能,最新的指令集达到了一次性处理512位的超高效运算能力,但是大部分CPU不支持AVX-512版本,所以使用AVX-512编程尚未普及,但酷睿系列的CPU之后,基本都支持AVX编程,所以AVX和SSE目前都得到了广泛的应用。

NASM

NASM是一个x86的汇编器,语法简洁易懂(? 相对来说),同时支持MMX,SSE,SSE2,SSE4,AVX2等,它编写的汇编指令经编译后会转成通用的汇编指令。比如说我查看一个用NASM编写的代码,语法查不到,可以用VS先编译调试打断点,然后进入反汇编,这个时候显示出来的就是通用的asm汇编指令,可以在网上查到相应的指令作用,再代入理解代码会容易很多。

如何在NASM代码中调用SSE,AVX呢,见下图。向导使用指南 点击指令查看详情 点击下载NASM中文手册 ·