1

我正在阅读这篇文档,了解如何在 Intel Knights Landing 上使用 Intel C++ 编译器和 AVX512 支持来编译 C/C++ 代码。

但是,我对这部分有点困惑:

-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标志编译)。但是,我不明白使用-xMICor是否更好-xCORE

排在第二位的是 about-ax而不是-x

当您尝试构建可以在多个平台上运行的二进制文件时,此编译器选项很有用。

所以-ax用于跨平台支持,但是有什么性能差异-x吗?

4

2 回答 2

2

您提供的链接中的另一个选项是使用-xCOMMON-AVX512. 这是一个诱人的选项,因为在我的情况下,它具有我需要的所有指令,并且我可以对 KNL 和 Sklake-AVX512 系统使用相同的选项。由于我不是在 KNL 系统上构建,因此我无法使用-xHost(或-march=native使用 GCC)。

但是,-xCOMMON-AVX512不应与KNL一起使用。原因是它生成的vzeroupper指令 ( https://godbolt.org/z/PgFX55 ) 不仅没有必要,而且在 KNL 系统上实际上非常慢。

来自 Agner Fog 的微架构手册,他写在 KNL 部分。

VZEROALL 或 VZEROUPPER 指令在这里不仅是多余的,它们实际上对性能有害。VZEROALL 或 VZEROUPPER 指令在 64 位模式下需要 36 个时钟周期...

因此,对于 KNL 系统,您应该使用-xMIC-AVX512其他带有 AVX512 的系统,您应该使用-xCORE-AVX512(或-xSKYLAKE-AVX512)。我-qopt-zmm-usage=high也用。

我不知道 ICC 的开关在启用后会禁用 vzeroupper(您可以使用 GCC -mno-vzeroupper)。

顺便说一句,按照相同的逻辑,您应该使用-march=knlGCC 而不是-mavx512f-mavx512f -mno-vzeroupper如果您确定不需要 AVX512ER 或 AVX512PF,可能会起作用)。

于 2019-04-26T07:39:19.463 回答
2

对于第一个问题,如果您想为 Intel Xeon Phi 处理器 x200(又名 KNL 处理器)进行编译,请使用 –xMIC-AVX512。请注意,您提到的论文中的短语输入错误,它应该是“当您想为英特尔至强融核处理器 x200 构建一个巨大的二进制文件时,此编译器选项很有用。而不是在英特尔至强融核处理器 x200 上构建它,其中这将需要更多时间,在基于英特尔至强处理器的机器上构建它。”

对于第二个问题,如果您在 Intel Xeon Phi 处理器 x200 上运行二进制文件,应该不会有性能差异。但是,使用 -ax 编译的二进制文件的大小应该大于使用 -x 选项编译的二进制文件的大小。

于 2017-02-21T23:10:16.250 回答