首页 > 解决方案 > 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)

标签: visual-studiovisual-c++cmakeeigenavx512

解决方案


MSVC 对 AVX-512 的支持很差,不同子集之间没有区别。没有安全的方法可以在 MSVC 上生成 AVX512F 代码,而无需编写 AVX512DQ 指令。

AVX-512 的最佳编译器是 gcc 和 clang。如果您喜欢 IDE,可以使用 Visual Studio 的 Clang 插件。gcc 和 clang 编译器具有预处理器符号,如__AVX512F__,__AVX512VL__等。


推荐阅读