Ale*_*sky 5 c++ optimization vectorization intrinsics avx
如何根据主机处理器/操作系统创建一个可在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
Run Code Online (Sandbox Code Playgroud)
文件instrset_detect.cpp。您还应该阅读其源代码。这就是所谓的CPUID。
以下是我关于 CPU 调度程序的一些(但不是全部)问题和解答的摘要。