【问题标题】:Confusion about compiling with AVX512关于用 AVX512 编译的困惑
【发布时间】:2017-02-20 17:48:27
【问题描述】:

我正在阅读 this 文档,了解如何在 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 生成 Intel AVX-512 指令 Phi 处理器 x200,您应该使用选项 –xMIC-AVX512。为了 例如,在 Linux 系统上

$ icc –xMIC-AVX512 application.c 此编译器选项在以下情况下很有用 您想为英特尔至强融核处理器 x200 构建一个巨大的二进制文件。 而不是在需要更多时间的协处理器上构建它 时间,在基于 Intel Xeon 处理器的机器上构建它

我的 Xeon Phi KNL 没有协处理器(无需 ssh micX 或使用 -mmic 标志编译)。但是,我不明白是使用-xMIC 还是-xCORE 更好?

第二位是-ax 而不是-x

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

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

【问题讨论】:

  • -xCORE 在 KNL 上不起作用,因为它不支持 AVX-512BW、AVX-512DQ 和 AVX-512VL。

标签: intel xeon-phi icc avx512


【解决方案1】:

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

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

【讨论】:

  • 对不起,我有点困惑,什么是“基于英特尔至强处理器的机器”?正如我告诉你的那样,在我的情况下,我没有一个协处理器,它必须是 ssh-ed 以及在哪里运行代码,我只 ssh “主”机器,在其上编译和运行代码。跨度>
  • @justHelloWorld,“基于英特尔至强处理器的机器”是指使用英特尔编译器的非 KNL 机器。您可以在另一台机器上构建可执行文件,然后将二进制文件复制到 KNL 机器。关键是 KNL 机器的内核是低功耗和低频率的(OTOH 你有很多),所以在另一台机器上构建并复制二进制文件可能会更快。
【解决方案2】:

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

但是,-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 可能会起作用)。

【讨论】:

  • 是的,ISA 兼容性并不是唯一的因素。 KNL 的调优与 SKX 的调优完全不同。 IDK 如果 ICC 支持 -xCOMMON-AVX512 -mtune=knl 来制作可以在任一 CPU 上运行的二进制文件,但仅针对 KNL 进行了调整。如果是这样,您可能仍然不想在 SKX 上运行它,因为忽略 vzeroupper 会产生错误的依赖关系。
  • @PeterCordes,我在 Godbolt 中尝试了-xCOMMON-AVX512 -mtune=knl。它仍然产生vzeroupper。无论如何,我想我终于学到了关于调整的重要性而不仅仅是兼容性的教训。
  • @PeterCordes,有趣的march=skylake-avx512 定义了-mprefer-vector-width=256-mavx512f 没有。 ICC 做同样的事情(-xCOMMON-AVX512 使用 512 位向量,但 -xCORE-AVX512 使用 256 位。所以默认情况下,向量宽度没有定义或限制。这是对执行此操作的架构的调整。
  • -mavx512f 不包括-mavx512vl,因此即使默认调整为-mprefer-vector-width=256,它也不适用于EVEX 编码指令。虽然编译器可以选择根本不使用 AVX512 功能,但如果 AVX2 可用,则使用 tune=generic 并且只有 AVX512F 可用。
  • @PeterCordes,好点,我习惯了没有 AVX512VL 并且没有发现它是一个障碍。在任何情况下,-mavx512vl 都默认为 256 位向量 gcc -mavx512vl -Q --help=target | grep prefer-vector-width
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2020-03-06
  • 2016-03-16
  • 2013-07-27
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多