如何在启用 SSE 的情况下编译 linux 内核?
How to compile a linux kernel with SSE enabled?
我处于以下情况:
- 我正在向 Linux 内核添加一个基于浮点数的算法。我知道我不应该那样做,但我想试一试,看看它能有多糟糕。
kernel_fpu_begin/kernel_fpu_end
用于每个浮点计算块。
- 当我运行
make
编译内核代码时出现这个错误:SSE register return with SSE disabled
,对应的行是input[3] = (float)util / (float)max;
这是我的问题:
- 我在 Makefile 中没有找到
-mno-sse -mno-sse2
,我该怎么做才能启用 SSE?
- 当我声明一些浮点变量时,例如
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,而您需要调用者在没有编译的情况下编译。
我处于以下情况:
- 我正在向 Linux 内核添加一个基于浮点数的算法。我知道我不应该那样做,但我想试一试,看看它能有多糟糕。
kernel_fpu_begin/kernel_fpu_end
用于每个浮点计算块。- 当我运行
make
编译内核代码时出现这个错误:SSE register return with SSE disabled
,对应的行是input[3] = (float)util / (float)max;
这是我的问题:
- 我在 Makefile 中没有找到
-mno-sse -mno-sse2
,我该怎么做才能启用 SSE? - 当我声明一些浮点变量时,例如
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,而您需要调用者在没有编译的情况下编译。