根据此链接,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)