简介
Intel的CPU和ARM的CPU都有SIMD指令,可以完成CPU 指令级的并行化。这里边主要涉及CPU的汇编的知识和一些寄存器的知识。在一些耗时的SLAM优化迭代的场合,经常出现这样的指令的优化。SSE是Intel x86架构CPU的SIMD指令的简称,NEON是ARM CPU的SIMD指令的简称。
由于项目的需要,我以前的时候用过一段SSE指令,后来一段时间没有在接触过,最近在玩飞机,我们在DJI M100上加了ARM架构的TK1板,在移植slam的代码的时候,一些SSE的代码需要转换为NEON指令。因此这里做了一些两种SIMD指令的转化和比较。
寄存器的基础知识
一般computer中存在内存,内存就像仓库,我们不常用的东西分类放到仓库里边去。等到用的时候就会拿出来放在手边,手边的一些柜子书桌就是CPU中的寄存器。寄存器的位数和指令的位宽是一样的。我们说128位的指令位宽,那么对应的寄存器的位数就是128位,而CPU每次可以计算的数据的宽度最大也是128位。因为我们常用的数据达不到这样的宽度,这样每个指令周期就可以执行多个数据的计算。这就是所谓向量化计算。
汇编指令基础
我们的c语言中的加法减法(各种运算 加减乘除 与或非 等等)都有对应的指令,可以很容易转换,但是在赋值等操作中涉及load和store内存的操作,这是c语言中看不见的。
浮点计算 vs 整数计算
为什么要分开讲呢?因为在指令集中也是分开的,另外,由于浮点数占4个字节或者8个字节,而整数却可以分别占1,2,4个字节按照应用场合不同使用的不同,因此向量化加速也不同。因此一个指令最多完成4个浮点数计算