我处于以下情况:
- 我正在向 Linux 内核添加基于浮点的算法。我知道我不应该那样做,但我想试一试,看看它有多糟糕。
kernel_fpu_begin/kernel_fpu_end
用于每个浮点计算块。- 当我运行
make
编译内核代码时,出现此错误:SSE register return with SSE disabled
,相应的行input[3] = (float)util / (float)max;
以下是我的问题:
- 我在生成文件中找不到
-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。
显然,该函数无法按值返回float
,因为标准调用约定以 XMM0 返回,并且您需要在没有 XMM0 的情况下编译调用方。