使用 GCC 为 Linux 设备驱动程序编译 Intel AVX 内在函数

ele*_*tro 2 gcc intel linux-device-driver linux-kernel avx

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

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

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

谢谢。

amd*_*mdn 5

使用这些标题

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

  • 包括 <x86intrin.h>

使用这个标志

-march=corei7-avx
Run Code Online (Sandbox Code Playgroud)

您应该使用 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

使用 AVX 的设备驱动程序示例是https://elixir.bootlin.com/linux/latest/source/lib/raid6/avx2.c。请注意,他们选择使用内联汇编而不是内在函数,我看不出内在函数在针对内核的代码中不起作用的原因。

您需要在使用它们之前保存 AVX 寄存器并在完成后恢复它们。参见Agner Fog 的 Calling Conventions 文档,我引用了相关段落:

Linux下的设备驱动

Linux 系统使用浮点寄存器和向量寄存器的延迟保存。这意味着这些寄存器不会在每次任务切换时保存和恢复。相反,它们在任务切换后的第一次访问时被保存/恢复。如果只有一个线程使用这些寄存器,则此方法可节省时间。内核模式不支持延迟保存方案。任何尝试不正确使用这些寄存器的设备驱动程序都会导致异常,这可能会导致系统崩溃。需要使用向量寄存器的设备驱动程序必须首先通过调用函数kernel_fpu_begin() 来保存这些寄存器,并通过调用kernel_fpu_end() 来恢复寄存器在返回或睡觉之前。这些功能还可以防止设备驱动程序的抢先中断,否则可能会弄乱寄存器。 kernel_fpu_begin()保存所有可用的浮点寄存器和向量寄存器。

您会发现Intel Intrinsics Guide是必不可少的。

更多关于 gcc 标志的信息请看这里Intel Core i7 AVX GCC Compiler Tuning Results


小智 1

当使用“x86intrin.h”为 Linux 内核构建时,通过如下定义来阻止_mm_malloc()和的定义:_mm_free()_MM_MALLOC_H_INCLUDED

#define _MM_MALLOC_H_INCLUDED
#include <x86intrin.h>
Run Code Online (Sandbox Code Playgroud)

内存分配函数将不可用,但它们无论如何也不会在内核中工作。其他内在函数将可用。


归档时间:

查看次数:

1055 次

最近记录:

5 年,8 月 前