gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:55:00 25 4
gpt4 key购买 nike

我在内核中找不到大量使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com