AVX512和MSVC预处理器符号

时间:2019-02-14 17:16:12

标签: visual-studio visual-c++ cmake eigen avx512

根据此链接,没有用于AVX512(MSVC 2017)的预定义预处理器符号

我正在尝试构建在(您猜对了)Windows上使用本征库的thundersvm。 Eigen和thundersvm都在编译器的前处理符号上使用cmake和depind,Eigen是否使用avx512指令进行编译。

似乎使用/arch:AVX512不会触发MSVC中的任何错误,但没有定义Eigen所需的__AVX512F__符号。我还尝试在cmake参数中包含-D__AVX512F__=ON,但还是没有运气。

由于AVX512没有预定义的预处理器符号,是否有任何方法可以强制Eigen使用avx512进行编译?


更新

根据chtz注释,我已经检查了Eigen的默认分支,并使用带有以下cmake参数的arch:AVX512重新编译了thundersvm(也许并不需要全部):

-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

在补丁前后,比较来自英特尔SDE -mix工具的指令组合,我可以清楚地看到使用了AVX指令(SDE抱怨在运行skl cpu时无法识别指令vbroadcastss zmm0, xmm0,但可以使用对于skx很好)。问题是MSVC使用标量版本的AVX,并且运行时没有任何改进(总指令数也相同),这与post

类似

我是否需要定义其他标志,以便MSVC生成非标量指令? (我想我也会尝试gcc)

1 个答案:

答案 0 :(得分:1)

MSVC对AVX-512的支持较差,并且在不同子集之间没有区别。没有可能也无法制作AVX512DQ指令的情况下,没有安全的方法可以在MSVC上生成AVX512F代码。

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