我正在阅读有关如何使用英特尔C ++编译器和英特尔Knights Landing上的AVX512支持编译C / C ++代码的this文档。
但是,我对这部分有点困惑:
-xMIC-AVX512:使用此选项生成AVX-512F,AVX-512CD,AVX-512ER和AVX-512FP。
-xCORE-AVX512:使用此选项生成AVX-512F,AVX-512CD,AVX-512BW,AVX-512DQ和AVX-512VL。
例如,要为Intel Xeon Phi处理器x200生成Intel AVX-512指令,您应该使用选项-xMIC-AVX512。例如,在Linux系统上
$ icc -xMIC-AVX512 application.c当你想为Intel Xeon Phi处理器x200构建一个巨大的二进制文件时,这个编译器选项很有用。而不是在协处理器上构建它需要更多时间,而是在基于英特尔至强处理器的机器上构建它
我的Xeon Phi KNL没有协处理器(不需要ssh micX或用-mmic
标志编译)。但是,我不明白使用-xMIC
或-xCORE
是否更好?
排在第二位的是-ax
而不是-x
:
当您尝试构建可在多个平台上运行的二进制文件时,此编译器选项很有用。
所以qazxsw poi用于跨平台支持,但与qazxsw poi相比有没有任何性能差异?
对于第一个问题,如果要编译Intel Xeon Phi处理器x200(也称为KNL处理器),请使用-xMIC-AVX512。请注意,您提到的论文中的短语是错误的,它应该是“当您想要为英特尔至强融核处理器x200构建一个巨大的二进制文件时,此编译器选项很有用。而不是在英特尔至强融核处理器x200上构建它它将花费更多的时间,在基于英特尔至强处理器的机器上构建。“
对于第二个问题,如果在Intel Xeon Phi处理器x200上运行二进制文件,则不应存在性能差异。但是,符合-ax的二进制文件的大小应该大于使用-x选项编译的大小。
您提供的链接中的另一个选项是使用-ax
构建。这是一个诱人的选择,因为在我的情况下它具有我需要的所有指令,我可以对KNL和Sklake-AVX512系统使用相同的选项。由于我没有建立在KNL系统上,所以我不能使用-x
(或者使用GCC的-xCOMMON-AVX512
)。
但是,-xHost
不应与KNL一起使用。原因是它生成了-march=native
指令(-xCOMMON-AVX512
),这不仅不是必需的,它实际上在KNL系统上非常慢。
来自Agner Fog的vzeroupper
,他在KNL部分写道。
VZEROALL或VZEROUPPER指令不仅在这里是多余的,它们实际上对性能有害。 VZEROALL或VZEROUPPER指令在64位模式下需要36个时钟周期...
因此对于KNL系统,你应该使用https://godbolt.org/z/PgFX55for其他系统与AVX512你应该使用micro-architecture manual(或-xMIC-AVX512
)。我也使用-xCORE-AVX512
。
我不知道ICC在启用后禁用vzeroupper的开关(使用GCC可以使用-xSKYLAKE-AVX512
)。
顺便说一句,按照相同的逻辑,你应该使用-qopt-zmm-usage=high
与GCC而不是-mno-vzeroupper
(如果你确定你不需要AVX512ER或AVX512PF,可以使用-march=knl
)。