SIMD
https://software.intel.com/en-us/articles/intel-sdm
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
https://acl.inf.ethz.ch/teaching/fastcode/2021/
指令名称里面有许多缩写,根据缩写可以更快地找到自己想要的指令:
types:
- pd(packed double precision)
- ps(packed single precision)
- epi32(packed 32bit integer)
- si128(128bit integer)
- ss/sd(scalar single/doubble precision float)
- 只处理low memory的单个元素
- single slot.
operations:
- cmp/add/sub/and/or: 基本操作
- madd: multiply + add
- movemask:将多个数据的最高位放在一起当做mask使用
- loadu/storeu: 非对齐方式的载入和存储
- load/store: 对齐方式的载入和存储
使用SIMD大约几种方式:
- 使用vectorized库
- 靠编译器进行自动优化
- intrinsics 类似函数调用
- write assembly 似乎没有什么必要
使用intrinsics的几个头文件
- SSE: xmmintrin.h
- SSE2: emmintrin.h
- SSE3: pmmintrin.h
- SSSE3: tmmintrin.h
- SSE4: smmintrin.h & nmmintrin.h
intrinsics指令分为这么几类:
- native inst: 对应一条汇编
- _mm_load_ps
- _mm_add_ps
- _mm_mul_ps
- multi insts: 对应多条汇编
- _mm_set_ps
- _mm_set1_ps
- 宏和辅助函数
- _MM_TRANSPOSE4_PS()
- _MM_SHUFFLE()