我在内核中找不到很多SIMD指令(比如SSE/AVX)的使用(除了一个地方用来加速RAID6的奇偶计算)。
( Q1)这种情况的具体原因,或者仅仅是用例的缺乏?
( Q2)如果我想使用SIMD指令,比如设备驱动程序,今天需要做什么?
( Q3)将像ISPC这样的框架整合到内核中有多难(仅仅是为了实验)?
发布于 2017-10-11 00:15:00
保存/恢复FPU (包括SIMD矢量寄存器)状态比单纯的整数GP寄存器状态更昂贵。在大多数情况下,这是不值得的。
在Linux内核代码中,您所要做的就是围绕代码调用kernel_fpu_begin()
/ 。这就是RAID驱动程序所做的。见fp.html。
x86没有任何未来的方法来保存/恢复一个或两个向量寄存器。(除了使用遗留的SSE指令手动保存/恢复xmm
寄存器外,如果用户空间具有任何ymm/zmm寄存器的上半部分,则可能导致SSE/AVX transition stalls on Intel CPUs )。
遗留SSE工作的原因是,一些Windows驱动程序已经在做这件事,而英特尔想要引入AVX,所以他们发明了这种过渡惩罚的东西,而不是让遗留的SSE指令在ymm寄存器的上面128 B为零。(有关该设计决策的更多细节,请参见this。)因此,基本上我们可以将SSE/AVX转换的罪魁祸首归咎于Windows二进制驱动程序。
关于非x86体系结构的IDK,以及现有SIMD指令集是否有一种保存/恢复寄存器的方法,该寄存器将继续工作在较长的向量上。如果扩展继续使用多个32位FP寄存器作为单个更宽寄存器的模式,ARM32可能会这样做.(例如q2
是通过s11
由s8
组成的。)因此,如果256 b霓虹灯扩展只允许您使用两个q
寄存器作为256 b寄存器,那么保存/恢复一对q
寄存器应该是未来的证明。或者,如果新的更宽的向量是分开的,并且不扩展现有寄存器。
https://stackoverflow.com/questions/46677676
复制相似问题