如何在启用 SSE 的情况下编译 linux 内核?

How to compile a linux kernel with SSE enabled?

我处于以下情况:

  1. 我正在向 Linux 内核添加一个基于浮点数的算法。我知道我不应该那样做,但我想试一试,看看它能有多糟糕。
  2. kernel_fpu_begin/kernel_fpu_end用于每个浮点计算块。
  3. 当我运行make编译内核代码时出现这个错误:SSE register return with SSE disabled,对应的行是input[3] = (float)util / (float)max;

这是我的问题:

  1. 我在 Makefile 中没有找到 -mno-sse -mno-sse2,我该怎么做才能启用 SSE?
  2. 当我声明一些浮点变量时,例如float x[10],我应该使用kernel_fpu_begin/kernel_fpu_end吗?

谢谢!

您需要阻止编译器使用 SSE,例如在 kernel_fpu_begin 之前或 end 之后复制一个 16 字节的结构。因此,您不能只在使用 -msse2.

编译的文件中的函数内部使用块

您可以将 FP 代码放在一个单独的函数中,并在该函数上使用 __attribute__((target("sse2")))"avx",以在没有命令行选项的情况下启用它,特别是针对 x86。

显然该函数不能 return 按值 float 因为 XMM0 中的标准调用约定 returns,而您需要调用者在没有编译的情况下编译。