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