如何根据主机处理器/操作系统创建可在SSE,AVX和AVX2代码路径之间动态切换的库?我正在使用Agner Fog的VCL(矢量类库)并使用GCC for Linux进行编译。使用Agner的矢量类库编译多架构代码
回答
汇编指令cpuid
可以在运行时为您提供此信息。有人已经基于此创建了一个图书馆到what you need。
您可以创建一个函数调度表,并根据使用此代码的查询结果填充正确的代码路径函数。
UPDATE:(答案在评论质疑)
要在第一时间创建不同的代码路径,则需要分别编制不同的代码路径,然后将它们链接在一起。对于每一个,您都可以在编译行中指定使用各种-march
开关所需的架构。
问题是我不能(很简单地)创建不同的代码路径,因为VCL使用内部函数(不是内联汇编),编译器会将其转换为编译器参数中指定的任何指令集。我想我应该提到我正在使用GCC。 –
查看更新的答案 – Smeeheey
如何为编译器的每次调用调整函数名称? –
请参见“指令集和CPU调度”部分in the manual to the Vector Class Library。在这一节中写入昂纳
文件 dispatch_example.cpp示出了如何使一个CPU调度 ,其选择适当的代码版本的示例。
阅读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调度程序的一些问题和答案的总结,但不是全部。
'dispatch_example.cpp'调用在'instrset.h'中声明并在'instrset_detect.cpp'中定义的'instrset_detect'。 –
对不起,没关系 –
- 1. 使用Accelerate框架编码矢量
- 2. 编译我的C++代码ARM架构
- 3. 编译使用OpenCV库的SSE代码
- 4. 用于arm架构的编译库
- 5. C++结构/矢量编译问题
- 6. C++矢量迭代码不编译,当矢量作为参考给const
- 7. PowerPC架构的交叉编译Boost库
- 8. SIMD与矢量架构
- 9. 与G ++编译,使用矢量和阵列库
- 10. 使用多个编译器编译C代码
- 11. 为ARM9架构交叉编译Libzdb库
- 12. 创建构建框架以支持编译支持多种平台的代码
- 13. C源代码不会编译ARM架构
- 14. C++编译向量误差,使用矢量时::的push_back()方法
- 15. 使用矢量类
- 16. 可以使用宝石代码使用macrubyc编译的代码
- 17. 反编译汇编代码有多难?
- 18. 迭代多的std ::矢量
- 19. 如何使用nvcc编译的Cuda共享库来编译OpenCV代码?
- 20. 使用PyInstaller构建Cython编译的python代码
- 21. 使用自行设计的C编译器构建代码
- 22. 用C++编译器编译c代码
- 23. 如何用ML编译器编译类别代码?
- 24. GCC - 不编译未使用的代码
- 25. 使用反编译的java代码
- 26. 使用从源代码编译的SharpDX?
- 27. 使用g ++编译meep的C++代码
- 28. 如何编译使用getsubopt()的代码?
- 29. 编译架构错误
- 30. 为ARM架构编译Ada
听起来像是一个makefile解决方案。您在构建时了解主处理器/操作系统。运行时无需这样做。 – duffymo
对于那些阅读这个问题但不限于VCL和GCC的人来说,英特尔编译器有一系列“-axcode”编译标志,它们可以生成多个针对多个指令集体系结构的代码路径(例如,针对SSE ,AVX和AVX-512)在相同的库/可执行文件中,并在运行时自动(不可见)地在它们之间进行分派。看看这个页面的底部:https://software.intel.com/en-us/blogs/2016/01/13/compiling-for-the-intel-xeon-phi-processor-x200-and-the- intel-avx-512-isa – zam