内核中使用向量指令

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() 这种形式定义上下文开始和结束的位置,内核中这样的代码就不太好看,维护难度上升。

总之,内核中需要使用浮点和向量场景比较少,保存恢复的代价比较大,收益不高。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值