我在内核中找不到太多 SIMD 指令(如 SSE/AVX)的使用(除了一处用于加速 RAID6 奇偶校验计算的地方)。
Q1)有什么具体原因或者只是缺乏用例吗?
Q2) 如果我想在设备驱动程序中使用 SIMD 指令,今天需要做什么?
Q3)将像 ISPC 这样的框架合并到内核中(仅用于实验)有多难?
保存/恢复 FPU(包括 SIMD 矢量寄存器)状态比仅整数 GP 寄存器状态更昂贵。在大多数情况下,这是不值得的。
在Linux内核代码中,你所要做的就是调用kernel_fpu_begin()
/ kernel_fpu_end()
围绕你的代码。这就是 RAID 驱动程序的作用。 See http://yarchive.net/comp/linux/kernel_fp.html.
x86 没有任何面向未来的方法来保存/恢复一个或几个向量寄存器。 (除了手动保存/恢复xmm
使用旧版 SSE 指令进行注册,可能会导致SSE/AVX 转换在 Intel CPU 上停止如果用户空间的任何 ymm/zmm 寄存器的上半部分脏了)。
传统 SSE 起作用的原因是,当 Intel 想引入 AVX 时,一些 Windows 驱动程序已经在这样做了,因此他们发明了转换惩罚的东西,而不是让传统 SSE 指令将 ymm 寄存器的高 128b 清零。 (看this有关该设计决策的更多详细信息。)因此,基本上我们可以将 SSE/AVX 转换惩罚混乱归咎于 Windows 纯二进制驱动程序。
IDK 关于非 x86 架构,以及现有 SIMD 指令集是否具有面向未来的方法来保存/恢复将继续适用于更长向量的寄存器。如果扩展继续使用多个 32 位 FP 寄存器作为单个更宽寄存器的模式,ARM32 可能会这样做。 (例如。q2
由...组成s8
通过s11
.)所以保存/恢复一对q
寄存器应该是面向未来的,如果 256b NEON 扩展只是让您使用 2q
注册为一个 256b 寄存器。或者,如果新的更宽向量是分开的,并且不扩展现有寄存器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)