ele*_*tro 2 gcc intel linux-device-driver linux-kernel avx
我在 corei7 上的 ubuntu 上运行 gcc 版本 4.8.2。
从谷歌搜索中找到了有关 AVX 内在函数的信息,但我不确定这组内在函数是否可以用于 Linux 设备驱动程序并对其进行编译。
如果可以,这里的任何人都可以告诉我什么是 makefile 的正确设置以及在 c 源中包含哪些头文件以使用 gcc 编译这个 avx?
谢谢。
使用这些标题
使用这个标志
-march=corei7-avx
Run Code Online (Sandbox Code Playgroud)
您应该使用 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
使用 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 次 |
| 最近记录: |