根据此链接,没有用于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)
答案 0 :(得分:1)
MSVC对AVX-512的支持较差,并且在不同子集之间没有区别。没有可能也无法制作AVX512DQ指令的情况下,没有安全的方法可以在MSVC上生成AVX512F代码。
用于AVX-512的最佳编译器是gcc和clang。如果您喜欢IDE,可以使用Visual Studio的Clang插件。 gcc和clang编译器具有预处理器符号,例如__AVX512F__
,__AVX512VL__
等。