我正在尝试优化一些矩阵计算,我想知道是否有可能在编译时检测SSE / SSE2 / AVX / AVX2 / AVX-512 / AVX-128-FMA / KCVI [1]是否由编译器?理想情况下,对于GCC和Clang,但我只能管理其中一个 .
我不确定它是否可行,也许我会使用自己的宏,但我更愿意检测它并要求用户选择它 .
[1] "KCVI"代表Knights Corner Vector指令优化 . 像FFTW这样的库检测/利用这些较新的指令优化 .
我正在尝试优化一些矩阵计算,我想知道是否有可能在编译时检测SSE / SSE2 / AVX / AVX2 / AVX-512 / AVX-128-FMA / KCVI [1]是否由编译器?理想情况下,对于GCC和Clang,但我只能管理其中一个 .
我不确定它是否可行,也许我会使用自己的宏,但我更愿意检测它并要求用户选择它 .
[1] "KCVI"代表Knights Corner Vector指令优化 . 像FFTW这样的库检测/利用这些较新的指令优化 .
1 回答
大多数编译器会自动定义:
等等,根据你传递的命令行开关 . 您可以使用gcc(或gcc兼容的编译器,如clang)轻松检查,如下所示:
要么:
或者只是检查预定义的宏以获取特定平台上的默认构建:
最近的英特尔处理器支持AVX-512,它不是单片指令集 . 可以从以下两个示例中看到GCC(版本6.2)提供的支持 .
这是骑士登陆:
这是Skylake AVX-512:
英特尔公布了其他AVX-512子集(参见ISA extensions) . GCC(版本7)支持与AVX-512的4FMAPS,4VNNIW,IFMA,VBMI和VPOPCNTDQ子集相关联的编译器标志和预处理器符号: