【问题标题】:Are extended instruction sets (SSE, MMX) used in Linux kernel?Linux 内核中是否使用了扩展指令集(SSE、MMX)?
【发布时间】:2011-06-03 13:19:41
【问题描述】:

嗯,它们带来了(至少应该带来)性能的巨大提升,不是吗?

所以,我还没有看到任何 Linux 内核源代码,但很想问一下:它们是否以某种方式使用过? (在这种情况下——对于没有此类指令的系统,一定有一些特殊的“代码上限”?)

【问题讨论】:

  • 据我了解,这些指令中的大部分都是针对矩阵数学、DSP、图形编码/解码等的。您预计内核中会发生多少?
  • @Damien_The_Unbeliever:您可以使用 SSE 指令一次在位域中搜索非零或非一条目 128b,而不是 32 或 64。我相信有很多用途除了保存/恢复向量 regs 的成本很高之外,它在内核中至少会有一个小的加速。

标签: linux cpu assembly


【解决方案1】:

SSE 和 MMX 指令集在音频/视频和游戏工作之外的价值有限。您可能会在内核的黑暗角落找到一些明确的用途,但我不会指望它。一般情况下的答案是“不,它们没有被使用”,它们也没有在大多数非内核/用户空间应用程序中使用。

内核有时会选择使用特定于某些 CPU 的某些 x86 指令(例如,存在于某些 AMD 或 Intel 型号上,但不是全部,反之亦然),例如 syscall,但这些与 SIMD 不同您所指的指令集,并且不属于更广泛的类似主题的扩展集。

在马克回答之后,我去寻找。我唯一可以轻松识别它们正在使用的地方是the RAID 6 library(它还支持 AltiVec,它是 PowerPC SIMD 指令集)。

(小心地寻找树,有很多地方内核“知道” SSE/MMX 以支持用户空间应用程序,但实际上并没有使用它。还有一些不幸的变量名案例与 SSE 完全无关,例如在 SCTP 实现中。)

【讨论】:

  • 但这只是内核中显式使用 SIMD 指令的地方。如果我自己编译内核,有什么理由不使用-ftree-vectorize-msse* 选项告诉gcc 在它认为合适的地方使用SIMD?
  • @us2012 如果没有其他原因,内核不是为它设计的,那么这可能是一个非常糟糕的主意,并且您可能会意外破坏用户空间 SIMD 寄存器值(或者用户空间可能会破坏内核代码留下的值)。弄乱内核编译标志通常是一个坏主意,它往往会破坏事情,要么通过出现模糊的 GCC 错误,要么破坏低级假设。除非您正在进行研究,否则编译标志的选择最好留给内核开发人员。你不想和他们一起玩,只是想从你的系统中榨取更多的性能。
  • 谢谢!我完全忘记了寄存器。这是有道理的。
  • @us2012 这是将其用于 [memcpy] (phoronix.com/scan.php?page=news_item&px=OTgwMQ) 的建议。通常,这仅适用于复制大量数据,但在这些情况下可以提高性能。在相关的说明中,nVidia 赞助了在其 GPU 上进行(内核内)加密的研究,该研究显示了一些有希望的结果,但它是完全专有的,并且永远不会以目前的形式进入主线。尽管如此,它还是展示了可能性。
【解决方案2】:

在内核代码中使用向量寄存器和浮点寄存器有严格的限制。参见例如第 6.3 章“不同 C++ 编译器和操作系统的调用约定”。 http://www.agner.org/optimize/#manuals

【讨论】:

    【解决方案3】:

    它们在内核中用于一些事情,例如

    • 软件 RAID
    • 加密(可能)

    但是,我相信它总是首先检查他们的存在。

    【讨论】:

      【解决方案4】:

      "cpu simd 指令使用 FPU"

      呃,不,不是我理解的那样。它们在一定程度上是 FPU 指令的现代且(更)有效的替代品,但 SIMD 指令集的很大一部分处理整数运算。 我从来没有认真看过它,但我想(好吧,希望)最近的 gcc 版本生成的 SIMD 代码不会破坏任何寄存器或状态。

      【讨论】:

      • 内核开发人员这样描述它,因为 Linux 将向量和 FPU 寄存器状态一起保存/恢复。矢量 regs 只是与 FPU regs 混为一谈。 SSE 代码破坏一些 SSE 寄存器 (xmm0-xmm15)。这是不可避免的。
      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多