发布于 2022-03-15 23:45:15
-xhost标志根据当前CPU的功能(即您正在进行编译的计算机中的代码)生成最优的代码。
所谓“最高指令集”,意味着编译器将自动打开与CPU支持的最高指令集对应的代码生成标志。因此,如果您的CPU只支持SSE2,那么就只能打开它了。如果它支持AVX2,那么该选项将被打开。无论CPU支持哪个最高的指令集扩展,编译器都会生成针对该指令集扩展的代码。
此选项通常用于生成代码以在生成代码的同一台计算机上运行。例如,在构建在同一台计算机上运行的科学算法时,或者在编译自己的Linux内核时。
从技术上讲,生成的二进制文件将在支持至少与构建计算机相同的指令集扩展的任何计算机上运行,这就是为什么文档讨论“编译主机处理器上可用的最高指令集”的原因。
正如彼得·科德斯( Peter )在评论中已经指出的那样,国际商会的-xhost旗帜实质上等同于GCC和Clang的-march=native旗帜。这两种方法都告诉编译器自动打开与主机CPU能力相匹配的所有选项,为主机CPU生成最优的二进制文件,但只要它们具有相同或更高的能力,它们就会在其他CPU上运行。
通过查找计算机的CPU规范并向编译器命令行添加相应的代码-gen选项,您可以做与-xhost完全相同的事情。-xhost只是为你做这件事,查找你的主机CPU支持什么,并自动启用这些标志,而不需要你做后腿工作。因此,这是一个方便的特性;没有更多,也没有更少。
实际上,-xhost标志可以利用某些指令集扩展来加快代码速度,但是它还可能导致一个根本无法工作的二进制文件。 (在另一台不支持与构建计算机相同的指令集扩展的计算机上)。也许这对您来说不是问题;在这种情况下,您肯定会打开-host标志。但是,在许多情况下,我们软件开发人员正在为其他人构建可运行的二进制文件,在这种情况下,我们必须更加小心地确定我们想要排除哪些CPU。
还值得注意的是,Intel的编译器实际上可以生成一个具有动态调度支持的单个可执行文件,它允许您支持两种不同的体系结构。有关详细信息,请参见谢尔盖L.的回答中的相关问题。
发布于 2022-03-16 00:06:58
要添加@Cody的答案:有时您不想使用-xhost标志。在超级计算机集群中,您通常在“登录节点”上进行编译,代码在“计算节点”上执行。这两种架构可能略有(或有时:非常不同)。因此,您告诉登录节点要编译什么样的体系结构,但是不使用xhost标志,这可能会使它在计算节点上不可执行。
https://stackoverflow.com/questions/71489412
复制相似问题