使用 Agner 的向量类库编译多架构代码
Compile multi-architecture code using Agner's Vector Class Library
如何创建一个库,根据主机处理器/操作系统在 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 平台。
相关文章:
- 如何修复sfml c++代码编译错误
- 尝试用java代码编译和运行c++代码
- 此代码编译良好,但文件未创建?请指出错误
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 代码编译没有任何输出,入门程序
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 代码编译但不起作用!cmd窗口只是理想和理想,但什么也没发生
- 无法使用 g++ 使用C++代码编译 C 库
- 如何在Ubuntu中使用Visual Studio代码编译C++代码
- 推力+提升代码编译错误
- C++代码编译,但在 Zorin OS 上运行时显示错误
- 如何在使用模板时将 CPP 代码编译到库文件中
- 是否可以将Visual Studio 2017将C 代码编译到EXE以外的文件类型中
- 使用 Visual Studio for C++ 代码编译错误
- 使用 Android Studio 使用本机代码编译 apk 时,如何在链接处删除 libgnustl_static.
- 使用 Emscripten 将 OpenCV 代码编译C++ Javascript
- 将C 代码编译到独立应用程序.App
- 为什么此代码编译 (C++11) 而没有类型不匹配错误
- 重用编译器前端的结果,以加快多个配置/平台的C++代码编译
- 如何将C++11代码编译为网络汇编