我无法理解与
-xhost
一起使用的 icc
标志的用途。
在intel网站上,它指出:
x主机、Qx主机
告诉编译器生成指令 编译主机处理器上可用的最高指令集。
我不确定“最高指令集”是什么意思。
此外,我在这里看到了一些有关 SIMD 的内容。如果
-xhost
可以加速你的代码,为什么有人选择不使用这个标志?
-xhost
标志根据当前CPU(即您用来进行编译的计算机中的CPU)的功能生成尽可能最佳的代码。
“最高指令集”是指编译器会自动打开你的CPU支持的最高指令集对应的代码生成标志。因此,如果您的 CPU 仅支持 SSE2,那么就仅支持 SSE2。如果支持 AVX2,则该选项将打开。无论您的 CPU 支持哪种最高指令集扩展,编译器都会生成针对该指令集扩展的代码。
当您想要构建代码以在构建代码的同一台计算机上运行时,通常会使用此选项。例如,当构建将在同一台计算机上运行的科学算法时,或者编译您自己的 Linux 内核时。
从技术上讲,生成的二进制文件将在任何支持“至少”与构建计算机相同的指令集扩展的计算机上运行,这就是文档谈论“编译主机处理器上可用的最高指令集”的原因。 正如 Peter Cordes 在
a comment 中已经指出的那样,ICC 的 -xhost
标志本质上等同于 GCC 和 Clang 的
-march=native
标志。它们都告诉编译器自动打开与主机 CPU 功能相匹配的所有选项,为主机 CPU 生成可能的最佳二进制文件,但只要它们具有相同或相同的性能,它就可以在其他 CPU 上运行更高的能力。您可以通过查找计算机 CPU 的规格并将相应的代码生成选项添加到编译器命令行来执行与 -xhost
完全相同的操作。 -xhost
只是为您做这件事,查找您的主机 CPU 支持的内容并自动启用这些标志,而无需您进行跑腿工作。所以,这是一个方便的功能;不多不少。
-xhost
标志确实可以通过利用某些指令集扩展来加速代码,但是它也可能导致二进制文件根本无法工作(在不支持的另一台计算机上)与您的构建计算机相同的指令集扩展)。也许这对你来说不是问题;在这种情况下,您肯定会打开
-host
标志。但是,在许多情况下,我们软件开发人员正在构建二进制文件供“其他人”运行,在这种情况下,我们必须更加小心地确定要排除哪些 CPU。
还值得注意的是,英特尔的编译器实际上可以生成具有动态调度支持的单个可执行文件,从而允许您支持两种不同的架构。有关更多详细信息,请参阅 Sergey L. 对相关问题的回答。
添加@Cody Gray 的答案:有时您不想使用 -xhost
标志。在超级计算机集群上,您通常在“登录节点”上进行编译,并且代码在“计算节点”上执行。这两者的架构可能略有(或有时:非常)不同。正确的策略是通过指示目标指令集的显式编译器标志告诉登录节点要编译哪种架构。
在任何情况下,您都不要使用
xhost