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

Ale*_*sky 5 c++ optimization vectorization intrinsics avx

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

Z b*_*son 5

请参阅向量类库手册中的“指令集和 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
Run Code Online (Sandbox Code Playgroud)

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

以下是我关于 CPU 调度程序的一些(但不是全部)问题和解答的摘要。