visual-studio - AVX512 和 MSVC 预处理器符号
问题描述
根据此链接,AVX512( MSVC 2017)没有预定义的预处理器符号
我正在尝试构建在(你猜对了)窗口上使用特征库的thundersvm。Eigen 和 Thundersvm 都使用 cmake 并取决于编译器前处理器符号,Eigen 是否使用 avx512 指令编译。
似乎 using/arch:AVX512
不会触发 MSVC 中的任何错误,但没有定义__AVX512F__
Eigen 需要的符号。我也尝试包含-D__AVX512F__=ON
在 cmake 参数中,但仍然没有运气。
由于 AVX512 没有预定义的预处理器符号,有没有办法强制 Eigen 用 avx512 编译?
更新
根据 chtz 的评论,我检查了 Eigen 的默认分支,并使用 arch:AVX512 重新编译了thundersvm,并使用了这个 cmake 参数(可能并非全部都需要):
-DUSE_CUDA=OFF -DUSE_EIGEN=ON -DBUILD_SHARED_LIBS=OFF -DEIGEN_ENABLE_AVX512=ON -D__AVX512F__=ON -DEIGEN_VECTORIZE_AVX512=ON -DEIGEN_VECTORIZE_AVX2=ON -DEIGEN_VECTORIZE_AVX=ON -DEIGEN_VECTORIZE_FMA=ON
-mix
比较补丁前后英特尔 SDE 工具的指令组合,我可以清楚地看到使用了 AVX 指令(SDE 抱怨它vbroadcastss zmm0, xmm0
在为 skl cpu 运行时无法识别指令,但在 skx 上工作正常)。问题是 MSVC 使用 AVX 的标量版本并且运行时没有改进(总指令数也是相同的),类似于这篇文章
我需要定义其他标志以便 MSVC 生成非标量指令吗?(我想我也会试试 gcc)
解决方案
MSVC 对 AVX-512 的支持很差,不同子集之间没有区别。没有安全的方法可以在 MSVC 上生成 AVX512F 代码,而无需编写 AVX512DQ 指令。
AVX-512 的最佳编译器是 gcc 和 clang。如果您喜欢 IDE,可以使用 Visual Studio 的 Clang 插件。gcc 和 clang 编译器具有预处理器符号,如__AVX512F__
,__AVX512VL__
等。
推荐阅读
- gatsby - 如何设置 Gatsby 网站以使用 Netlify?
- java - 如何以编程方式获取 Hibernate 模型的 jOOQ 表?
- multithreading - Vulkan - 我们什么时候需要使用多个逻辑设备(当只有一个物理设备时)?
- vue.js - Vuetify 深色主题自定义不起作用
- python - 导入字典失败
- r - **rticles** 包的 `jss_article()` 中的格式化问题
- javascript - 在 React.js 中可视化谷歌分析数据,编辑 json
- sql - 关于从 SQL 语句/过程生成的多层 XML 的问题
- r - 如何在 R 中转置特定值?
- java - 杰克逊用特殊字符写入文件