关于使用AVX512进行编译的困惑

时间:2017-02-20 17:48:28

标签: intel xeon-phi icc avx512

我正在阅读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是否有任何性能差异?

2 个答案:

答案 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可能会起作用)。