使用 Agner 的向量类库编译多架构代码

Compile multi-architecture code using Agner's Vector Class Library

本文关键字:代码 编译 类库 Agner 向量 使用      更新时间:2023-10-16

如何创建一个库,根据主机处理器/操作系统在 SSE、AVX 和 AVX2 代码路径之间动态切换?我正在使用Agner Fog的VCL(矢量类库)并使用GCC for Linux进行编译。

请参阅手册中的"指令集和 CPU 调度"部分到矢量类库。在这一节中,阿格纳写道

该文件 dispatch_example.cpp显示了如何制作 CPU 调度程序的示例 选择适当的代码版本。

阅读源代码以distpatch_example.cpp .在文件的开头,您应该会看到注释

# Compile dispatch_example.cpp five times for different instruction sets:
| g++ -O3 -msse2    -c dispatch_example.cpp -od2.o
| g++ -O3 -msse4.1  -c dispatch_example.cpp -od5.o
| g++ -O3 -mavx     -c dispatch_example.cpp -od7.o
| g++ -O3 -mavx2    -c dispatch_example.cpp -od8.o
| g++ -O3 -mavx512f -c dispatch_example.cpp -od9.o
| g++ -O3 -msse2 -otest instrset_detect.cpp d2.o d5.o d7.o d8.o d9.o
| ./test

该文件instrset_detect.cpp 。 您还应该阅读源代码。这就是所谓的CPUID。

以下是我对 CPU 调度程序的一些(但不是全部)问题和答案的总结。

汇编指令cpuid可以在运行时为您提供此信息。有人基于此创建了一个库,以满足您的需求。

您可以创建一个函数调度表,并根据使用此代码的查询结果使用正确的代码路径函数填充该表。

更新:(回答评论中的问题)

要首先创建不同的代码路径,

您需要分别编译不同的代码路径,然后将它们链接在一起。对于每个选项,通过在编译行中使用 -march 开关的各种值来指定所需的体系结构。

文件 https://github.com/vectorclass/version2/blob/master/dispatch_example2.cpp 显示了如何自动调度到不同的代码版本中,每个版本都有一个命名空间。这适用于所有 x86 平台。