使用GCC为Linux设备驱动程序编译Intel AVX instrinsics

时间:2015-03-24 18:42:01

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

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

从谷歌搜索找到AVX内在函数,但我不确定是否可以为Linux设备驱动程序使用和编译这组内在函数。

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

感谢。

1 个答案:

答案 0 :(得分:4)

使用这些标题

  • #include< asm/i387.h> / *表示kernel_fpu_begin()和kernel_fpu_end()* /
  • #include< x86intrin.h>

使用此标志

-march=corei7-avx

您应该使用CPUID指令确保CPU支持AVX。如何执行此操作的示例包括http://lxr.free-electrons.com/source/lib/raid6/x86.hhttp://lxr.free-electrons.com/source/arch/x86/include/asm/cpufeature.h

使用AVX的设备驱动程序的示例是http://lxr.free-electrons.com/source/lib/raid6/avx2.c。请注意,他们选择使用内联汇编而不是内在函数,我没有看到为什么内在函数不适用于内核的代码。

您需要在使用之前保存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