我在内核中找不到大量使用 SIMD 指令(如 SSE/AVX)的地方(除了一个用于加速 RAID6 奇偶校验计算的地方)。
Q1) 任何具体原因或只是缺乏用例?
Q2) 如果我想使用 SIMD 指令,比如设备驱动程序,今天需要做什么?
Q3) 将像 ISPC 这样的框架合并到内核中(仅用于实验)有多难?
最佳答案
保存/恢复 FPU(包括 SIMD 矢量寄存器)状态比整数 GP 寄存器状态更昂贵。在大多数情况下,这根本不值得付出代价。
在 Linux 内核代码中,你所要做的就是调用 kernel_fpu_begin()
/kernel_fpu_end()
围绕你的代码。这就是 RAID 驱动程序所做的。 见 http://yarchive.net/comp/linux/kernel_fp.html .
x86 没有任何面向 future 的方法来保存/恢复一个或几个向量寄存器。 (除了使用传统 SSE 指令手动保存/恢复 xmm
寄存器,如果用户空间有任何 ymm/zmm 寄存器的上半部分脏,则可能导致 SSE/AVX transition stalls on Intel CPUs)。
传统 SSE 起作用的原因是一些 Windows 驱动程序在英特尔想要引入 AVX 时已经这样做了,所以他们发明了转换惩罚的东西,而不是让传统 SSE 指令将 ymm 寄存器的上 128b 置零。 (有关该设计决策的更多详细信息,请参阅 this。)所以基本上我们可以将 SSE/AVX 转换惩罚困惑归咎于 Windows 仅二进制驱动程序。
IDK 关于非 x86 架构,以及现有的 SIMD 指令集是否有一种面向 future 的方法来保存/恢复将继续为更长向量工作的寄存器。如果扩展继续使用多个 32 位 FP 寄存器作为单个更宽寄存器的模式,则 ARM32 可能会。 (例如 q2
由 s8
到 s11
组成。)所以保存/恢复一对 q
寄存器应该是面向 future 的,如果 256b NEON 扩展只是让您使用 2 q
注册为一个 256b 寄存器。或者如果新的更宽的向量是分开的,并且不扩展现有的寄存器。
关于linux-kernel - 为什么内核中不使用 SIMD 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46677676/