我在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.h和hhttps://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/