-xhost 标志到底是什么?

What exactly is the -xhost flag?

我无法理解与 icc 一起使用的 -xhost 标志的用途。

intel website 上,它指出:

xHost, QxHost

Tells the compiler to generate instructions for the highest instruction set available on the compilation host processor.

我不确定“最高指令集”是什么意思。

此外,我还看到了一些关于 SIMD here 的信息。如果 -xhost 可以加速您的代码,为什么有人会选择不使用此标志?

-xhost 标志根据您当前 CPU 的能力(即您用于编译的计算机中的能力)生成可能的最佳代码。

所谓“最高指令集”,是指编译器会自动打开对应于你的CPU所支持的最高指令集的code-generation标志位。所以,如果你的 CPU 只支持 SSE2,那么就只需要打开它。如果它支持 AVX2,那么该选项将被打开。无论您的 CPU 支持的最高指令集扩展是什么,编译器都会生成针对该指令集扩展的代码。

当您想在您正在构建代码的同一台计算机上构建代码以 运行 时,通常会使用此选项。例如,在构建您将在同一台计算机上 运行 的科学算法时,或者在编译您自己的 Linux 内核时。

从技术上讲,生成的二进制文件将 运行 在任何支持 至少 与构建计算机相同的指令集扩展的计算机上,这就是文档讨论的原因关于“编译主机处理器上可用的最高指令集”。

正如 Peter Cordes 在 中指出的那样,ICC 的 -xhost 标志本质上等同于 GCC 和 Clang 的 -march=native 标志。它们都告诉编译器自动打开所有匹配主机 CPU 能力的选项,为主机 CPU 生成可能的最佳二进制文件,但是 运行 在其他 CPU 上,只要它们具有相同或更高的能力。

您可以通过查找计算机 CPU 的规格并在编译器命令行中添加相应的 code-gen 选项来完成与 -xhost 完全相同的事情. -xhost 只是为您做这件事,查找您的主机 CPU 支持的内容并自动启用这些标志,而无需您进行跑腿工作。所以,这是一个方便的功能;仅此而已。

-xhost 标志确实可以通过利用某些指令集扩展来加速您的代码,但是 (在不支持相同指令集扩展的另一台计算机上作为您的构建计算机)。也许这对您来说不是问题;在那种情况下,您肯定会打开 -host 标志。但是,在许多情况下,我们软件开发人员正在为 其他人 到 运行 构建二进制文件,在这种情况下,我们必须更加小心 CPU我们要排除。

还值得注意的是,英特尔的编译器实际上可以生成具有动态调度支持的单个可执行文件,允许您支持两种不同的体系结构。有关更多详细信息,请参阅 Sergey L.'s answer 相关问题。

添加@Cody Gray 的回答:有时您不想使用 -xhost 标志。在超级计算机集群上,您经常在“登录节点”上进行编译,而您的代码在“计算节点”上执行。这两者的架构可能略有(或有时:非常)不同。所以你告诉登录节点编译什么架构,但你不使用 xhost 标志,这可能会使它在计算节点上无法执行。