4

我无法在内核中找到很多SIMD指令(如SSE/AVX)的使用(除了用于加速RAID6的奇偶校验计算的地方)。为什么SIMD指令不在内核中使用?

Q1)任何具体原因或只是缺少用例? Q2)如果我想使用SIMD指令,比如设备驱动程序,那么今天需要做什么? Q3)将ISPC这样的框架纳入内核(仅用于实验)有多难?

回答

5

保存/恢复FPU(包括SIMD向量寄存器)状态比仅整数GP寄存器状态更加昂贵。在大多数情况下,这根本不值得花费。

在Linux内核代码中,您所要做的就是在您的代码周围调用kernel_fpu_begin()/kernel_fpu_end()。这是RAID驱动程序的功能。http://yarchive.net/comp/linux/kernel_fp.html


x86没有任何面向未来的方式来保存/恢复一个或几个向量寄存器。 (除了使用传统SSE指令手动保存/恢复xmm寄存器,如果用户空间的任何ymm/zmm寄存器的上半部分脏),可能导致SSE/AVX transition stalls on Intel CPUs

SSE工作的原因是,当英特尔想要引入AVX时,一些Windows驱动程序已经这样做了,所以他们发明了转换惩罚性的东西,而不是传统的SSE指令将ymm寄存器的上128b清零。 (有关该设计决策的更多详细信息,请参阅this)。因此,基本上,我们可以将Windows二进制驱动程序归咎于SSE/AVX转换惩罚混乱。

有关非x86体系结构的IDK,以及现有的SIMD指令集是否具有面向未来的保存/恢复寄存器的方法,该寄存器将继续适用于更长的向量。如果扩展继续使用多个32位FP寄存器作为单个更宽的寄存器,则ARM32可能会继续。 (例如,q2s8s11组成)。因此,如果256b NEON扩展只允许使用2个q寄存器作为一个256b寄存器,那么保存/恢复一对q寄存器应该是面向未来的。或者如果新的更宽的向量是分开的,并且不扩展现有的寄存器。

+0

相关:[memcpy在linux中移动128位](https://stackoverflow.com/a/34011852/224132)。我的回答也提到'kernel_fpu_end()'实际上在Linux 3.7和更高版本中对FPU状态进行了“热切”恢复,所以不要在小块工作中使用多个开始/结束调用。 –

相关问题