使用 Agner 的 Vector Class 库编译多架构代码
Compile multi-architecture code using Agner's Vector Class Library
如何创建一个可根据主机 processor/OS 在 SSE、AVX 和 AVX2 代码路径之间动态切换的库?我正在使用 Agner Fog 的 VCL(Vector Class 库)并使用 GCC 为 Linux.
编译
汇编指令cpuid
可以在运行时为您提供这些信息。有人基于此创建了一个库,仅 what you need.
您可以创建一个函数分派 table,并根据使用此代码查询的结果用正确的代码路径函数填充它。
更新:(在评论中回答问题)
首先要创建不同的代码路径,您需要分别编译不同的代码路径,然后link将它们一起编译。对于每一个,您都可以通过在编译行中使用 -march
开关的各种值来指定所需的体系结构。
参见 "Instruction sets and CPU dispatching" in the manual to the Vector Class Library 部分。在该部分中,Agner 写道
The file
dispatch_example.cpp shows an example of how to make a CPU dispatcher
that selects the appropriate code version.
阅读 the source code 到 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.
Here 是我对 CPU 调度员的部分(但不是全部)问题和答案的总结。
文件 https://github.com/vectorclass/version2/blob/master/dispatch_example2.cpp 展示了如何自动分派到不同的代码版本,每个版本都有一个命名空间。这适用于所有 x86 平台。
如何创建一个可根据主机 processor/OS 在 SSE、AVX 和 AVX2 代码路径之间动态切换的库?我正在使用 Agner Fog 的 VCL(Vector Class 库)并使用 GCC 为 Linux.
编译汇编指令cpuid
可以在运行时为您提供这些信息。有人基于此创建了一个库,仅 what you need.
您可以创建一个函数分派 table,并根据使用此代码查询的结果用正确的代码路径函数填充它。
更新:(在评论中回答问题)
首先要创建不同的代码路径,您需要分别编译不同的代码路径,然后link将它们一起编译。对于每一个,您都可以通过在编译行中使用 -march
开关的各种值来指定所需的体系结构。
参见 "Instruction sets and CPU dispatching" in the manual to the Vector Class Library 部分。在该部分中,Agner 写道
The file dispatch_example.cpp shows an example of how to make a CPU dispatcher that selects the appropriate code version.
阅读 the source code 到 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.
Here 是我对 CPU 调度员的部分(但不是全部)问题和答案的总结。
文件 https://github.com/vectorclass/version2/blob/master/dispatch_example2.cpp 展示了如何自动分派到不同的代码版本,每个版本都有一个命名空间。这适用于所有 x86 平台。