linux-kernel - 为什么内核中不使用 SIMD 指令?

标签 linux-kernel operating-system linux-device-driver simd ispc

我在内核中找不到大量使用 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 可能会。 (例如 q2s8s11 组成。)所以保存/恢复一对 q寄存器应该是面向 future 的,如果 256b NEON 扩展只是让您使用 2 q注册为一个 256b 寄存器。或者如果新的更宽的向量是分开的,并且不扩展现有的寄存器。

关于linux-kernel - 为什么内核中不使用 SIMD 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46677676/

相关文章:

linux - uevents如何在内核中被触发

c - 为 ext2 文件系统添加挂载选项

linux-device-driver - 基于 ARM 的嵌入式 Linux 上的 GPIO IRQ

c - 我在 Windows 上用 C 语言做了高分辨率计时?这样对吗?

c++ - 使用系统调用处理退出状态

c - 以太网 Controller 中的硬件 Rx/Tx 队列是什么

linux - 进程在执行系统调用时切换会发生什么?

linux - Linux 内核 4.x 中的 CAN j1939 支持

c - Linux 内核中的工作队列实现

c# - Java 或 C# 的线程是基于用户空间线程还是内核空间线程?