我在corei7上的ubuntu上运行gcc版本4.8.2。
从谷歌搜索找到AVX内在函数,但我不确定是否可以为Linux设备驱动程序使用和编译这组内在函数。
如果可以的话,这里的任何人都可以告诉我什么是makefile的正确设置以及在c源中包含哪些头文件以使用gcc编译这个avx?
感谢。
答案 0 :(得分:4)
使用这些标题
使用此标志
-march=corei7-avx
您应该使用CPUID指令确保CPU支持AVX。如何执行此操作的示例包括http://lxr.free-electrons.com/source/lib/raid6/x86.h和http://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