linux内核不提倡使用浮点更不提倡使用向量,但是不可否认的是在处理大量数据的场景下,向量指令SIMD会比普通指令更快,SIMD的寄存器宽度可以是128bit或者256bit,处理宽度是普通指令的2-4倍,所有有些就会使用向量指令来做一些场景下的优化。但是目前在内核中向量指令仍然不是主流,目前看只有在加解密方向上有一些应用,那么向量指令肯定会带来一些负面的影响所以才遇到阻力。
向量指令是什么?
和向量对应的是标量,标量也就是我们常说的int/long这些单个数值的运算,而向量指令的基本操作对象有序排列的一组数,可以简单理解为数组。向量一般的名词有SIMD(Single Instruction, Multiple Data):单指令多数据流,即一个指令周期可以对多个数进行运算
哪些场景下需要使用向量指令?
大量的数学运算,现在的机器学习,AI,图像处理,海量的数据库操作这些场景下需要向量指令,但是内核更偏重于控制面,像网络数据流方面内核的作用也不是处理数据而是元数据,加解密功能需要处理大量的IO数据,内核中的memcpy,memset在操作例如1K或更大的数据量时使用向量指令可能会收益。总体而言,内核需要使用向量指令的不多,上游对此没有特别的需求。
向量指令有哪些限制
1.向量指令有单独的寄存器,在使用时和任务切换时都需要进行FPU的保存和恢复,一般向量指令长度有128bit/256bit,32个向量指令寄存器,所以向量上下文的切换代价也很昂贵。而且芯片厂商也没有计划推出快速保存向量上下文的指令。内核中使用向量的话就会增加上下文切换的代价并且还很大,而应用层可以选择使用向量指令,在任务切换时只需要根据当前是否使用向量指令设置标志,从而选择性保存恢复向量上下文。
2.并不是所有的机器都带向量扩展部件,所以一旦使用向量指令需要使用 kernel_fpu_begin() / kernel_fpu_end() 这种形式定义上下文开始和结束的位置,内核中这样的代码就不太好看,维护难度上升。
总之,内核中需要使用浮点和向量场景比较少,保存恢复的代价比较大,收益不高。