X86平台下的SIMD运算

SSE的全称是 Sreaming SIMD Extensions, 它是一组Intel CPU指令,用于像信号处理、科学计算或者3D图形计算一样的应用。

1
2
3
4
#include <mmintrin.h>    //MMX  64bits
#include <xmmintrin.h> //SSE 128bits
#include <emmintrin.h> //SSE2
#include <immintrin.h> //AVX 256bits
  • immintrin.h: (Intel(R) AVX compiler intrinsics 256bit)
  • emmintrin.h: Principal header file for Intel(R) Pentium(R) 4 processor SSE2 intrinsics

XMM、SSE、AVX关系??

  • MMX是由英特尔开发的一种SIMD多媒体指令集,共有57条指令。
  • SSE(Sreaming SIMD Extensions)是继MMX的扩充指令集。SSE 指令集提供了 70 条新指令。
  • AVX(Advanced Vector Extensions) 是Intel的SSE延伸架构,如IA16至IA32般的把暂存器XMM 128bit提升至YMM 256bit,以增加一倍的运算效率。

数据类型

关键字说明备注
__m6464位紧缩整数(MMX)一个MMX寄存器,表示封装了8个8bit,4个16bit,2个32bit,1个64bit的整数
__m128128位紧缩单精度(SSE)封装4个32bit的单精度浮点数
__m128d128位紧缩双精度(SSE2)封装2个64bit的双精度浮点数
__m128i128位紧缩整数(SSE2)
__m256256位紧缩单精度(AVX)
__m256d256位紧缩双精度(AVX)
__m256i256位紧缩整数(AVX)

: 紧缩整数包括了8位、16位、32位、64位的带符号和无符号整数。

SSE指令集

  • 数据传输:Data movement instructions
  • 算术运算:Arithmetic instructions
  • 倒数运算:Reciprocal instructions
  • 比较运算:Comparison instructions
  • 数据转换:Conversion instructions
  • 逻辑运算:Logical instructions
  • 整数运算:Additional SIMD integer instructions (SSE Primer)
  • 字节乱排:Shuffle instructions
  • 状态管理:State Management instructions
  • 缓存控制:Cacheability Control instructions

指令函数

Intel intrinsic

操作码汇总表中的指令列

  • mm — An MMX register. The 64-bit MMX registers are: MM0 through MM7.
  • xmm — An XMM register. The 128-bit XMM registers are: XMM0 through XMM7; XMM8 through XMM15 are
    available using REX.R in 64-bit mode.
  • ymm — A YMM register. The 256-bit YMM registers are: YMM0 through YMM7; YMM8 through YMM15 are
    available in 64-bit mode.

参考

  • SSE2 Intrinsics各函数介绍
  • GCC中SIMD指令的应用方法
  • mmintrin.h与MMX指令集 Intrinsics函数
  • SIMD指令初学
  • SSE指令集学习:Compiler Intrinsic
  • 深入浅出指令编码之四:指令核心
  • An evaluation of the automatic generation of parallel X86 SIMD
  • Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual