Linux内核中是否使用扩展指令集(SSE、MMX)?

Linux内核中是否使用扩展指令集(SSE、MMX)?,linux,cpu,assembly,Linux,Cpu,Assembly,嗯,它们带来(至少应该带来)性能的巨大提高,不是吗 所以,我还没有看到任何Linux内核的源代码,但我想问一下:它们是否以某种方式被使用了?(在这种情况下–对于没有此类指令的系统,必须有一些特殊的“代码上限”?SSE和MMX指令集在音频/视频和游戏工作之外的价值有限。您可能会在内核的黑暗角落找到一些明确的用途,但我不会指望它。一般情况下的答案是“不,它们没有被使用”,大多数非内核/用户空间应用程序也没有使用它们 内核有时会选择性地使用特定于某些CPU的某些x86指令(例如,在某些AMD或Inte

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


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

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

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

马克回答后,我就去寻找。我唯一能轻易识别它们的地方是在(它也支持AltiVec,这是PowerPC SIMD指令集)


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

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

  • 软件RAID
  • 加密(可能)

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

在内核代码中使用向量寄存器和浮点寄存器有严格的限制。请参阅第6.3章“不同C++编译器和操作系统的调用约定”。p> “cpu simd指令使用FPU”

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

据我所知,大多数指令都是围绕矩阵数学、DSP、图形编码/解码,等等。你希望内核中会有多少这样的内容?@Damien_the_unsiever:你可以使用SSE指令在一个位字段中搜索一个非零或非一个条目128b,而不是32或64。我敢肯定,在内核中有很多应用,至少会有一点点的加速,除了保存/恢复向量regs是昂贵的这一事实。但这只是内核中显式使用SIMD指令的地方。如果我自己编译内核,有什么理由不应该使用
-ftree vectorize
-msse*
选项来告诉gcc在它认为合适的地方使用SIMD吗?@us2012如果没有其他原因,那可能是一个非常糟糕的主意,您可能会意外地删除用户空间SIMD寄存器值(或者用户空间可能删除内核代码留下的值)。混淆内核编译标志通常是一个坏主意,它往往会破坏一些东西,要么出现模糊的GCC错误,要么打破低级假设。除非您正在进行研究,否则编译标志的选择最好留给内核开发人员。你不想玩他们只是想挤出更多的性能,你的系统。谢谢!我完全忘了收银机。这是有道理的。@us2012这里有一个建议将其用于[memcpy]()。通常,这只适用于复制大量数据,但在这些情况下会提高性能。另一方面,nVidia赞助了一项在他们的GPU上进行(内核内)加密的研究,该研究显示了一些有希望的结果,但它是完全专有的,永远不会以目前的形式进入主线。内核开发人员这样描述它,因为Linux同时保存/恢复向量和FPU寄存器状态。向量寄存器只是与FPU寄存器集中在一起。SSE代码将阻塞一些SSE寄存器(xmm0-xmm15)。这是不可避免的。