gcc - 使用GCC编译用于Linux设备驱动程序的Intel AVX内置指令

标签 gcc linux-kernel linux-device-driver intel avx

我在corei7的ubuntu上运行gcc版本4.8.2。

从Google搜索中找到有关AVX内在函数的信息,但是我不确定这组内在函数是否可以用于Linux设备驱动程序并进行编译。

如果可以的话,这里的任何人都可以告诉我,makefile的正确设置是什么,以及要使用gcc编译此avx的c源文件中应包含哪些头文件?

谢谢。

最佳答案

使用这些标题

包括<asm/i387.h> / *用于kernel_fpu_begin()和kernel_fpu_end()* /

包括


使用这个标志

-march=corei7-avx

您应该通过使用CPUID指令确保CPU支持AVX。 https://elixir.bootlin.com/linux/latest/source/lib/raid6/x86.hhhttps://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/cpufeature.h的示例
https://elixir.bootlin.com/linux/latest/source/lib/raid6/avx2.c是使用AVX的设备驱动程序的一个示例。请注意,他们选择使用内联汇编程序而不是内部函数,我看不出内部函数在用于内核的代码中不起作用的原因。
您将需要在使用前保存AVX寄存器,并在完成后还原它们。参见Agner Fog's Calling Conventions document,引用相关段落:

Linux下的设备驱动程序
Linux系统使用浮点寄存器和向量的惰性保存
寄存器。这意味着这些寄存器不会保存和恢复
在每个任务开关上。相反,它们会在第一个保存/恢复
任务切换后访问。
如果不超过一个线程使用这些方法,此方法可以节省时间
寄存器。内核模式不支持惰性保存方案。任何
尝试不当使用这些寄存器的设备驱动程序将
导致可能会使系统崩溃的异常。一个装置
需要使用向量寄存器的驱动程序必须首先保存这些
通过调用函数kernel_fpu_begin()进行注册并还原
通过在返回之前调用kernel_fpu_end()来注册寄存器,或者
睡眠。这些功能还可以防止抢先中断
设备驱动程序,否则可能会破坏寄存器。
kernel_fpu_begin()保存所有浮点寄存器和向量寄存器(如果可用)。

您会发现Intel Intrinsics Guide必不可少。
有关gcc标志的更多信息,请参见Intel Core i7 AVX GCC Compiler Tuning Results

关于gcc - 使用GCC编译用于Linux设备驱动程序的Intel AVX内置指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29240450/

相关文章:

c++ - 在 GNU 的 C++ 代码中使用 C 头文件。包含内联程序集 : impossible constraint in 'asm' 的错误

c - 使用 3.X linux 内核的 C 中的 Netlink 套接字

linux - Linux内核模块的Makefile?

linux - 2.6 内核中的 EXPORT_SYMTAB

usb - 如何开始为 Linux 编写设备驱动程序?

c - gcc gdb building - "lvalue required as increment operand"on *((void **)__o->next_free)++ = ((void *)datum);

c - GCC 不再实现 <varargs.h>

c++ - 确定真/假

linux - Systemtap 不显示内核函数中的所有局部变量

linux - 内存充足的 Oom-killer(内存不足)(?!) - inotify