Skip to content

Latest commit

 

History

History
50 lines (41 loc) · 1.26 KB

simd.org

File metadata and controls

50 lines (41 loc) · 1.26 KB

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()