【问题标题】:Compiling for a specific machine on a different machine在另一台机器上为特定机器编译
【发布时间】:2024-04-29 07:05:02
【问题描述】:

这实际上可能是一个荒谬的问题,但是关于编译器/编译的内容太多了,我不明白。我知道cross compiling, cross-native compiling, etc. 的概念但是,我不知道什么适用于我的场景:

我想做的就是这个。

假设我有两台具有不同硬件的计算机,AB

假设 AB 我确定的唯一相似之处是:

  1. 两者都有一些能够进行 64 位计算的 Intel 处理器。
  2. 两者都运行 Windows 10,因此可以通过其他方式(例如 WSL)访问 Linux。
  3. AB 都具有编译(任意)代码所需的所有程序。

假设我也有对 A 的管理权限(即我可以做/运行/安装任何我想做的事情/在它上面)。 不是B的情况。

此外,(这可能无关紧要),A 可以物理访问(如果需要,可以远程访问)。 B只能远程访问(通过 SSH、RDP 等)


现在说我想用一些编译器为 A 上的硬件编译一些任意复杂的 C/C++ 代码专门优化。例如,如果我使用gcc on A,我相信-march=native 可以做到这一点。

但是,如果说 A 是特殊的,它的处理能力不能“浪费”在编译上,因为它有更重要的任务要做。换句话说,我确实想经历编译onA的耗时耗力的过程。

相反,我想为 A on B 进行此编译。

我怎样才能获得与 "-march=native" 编译完成的最终结果on A如果 gcc 被使用)?换句话说,我如何 B 上为A 上的硬件编译精确 优化的代码?

对于gcc,是否像finding the equivalent flags for -march=native on A 然后在B 上运行execute?如果是这样,有没有办法简化这个过程,如果没有,怎么做(如果有的话?)。

这个过程可以用compilers other than gcc(即Visual C++和Intel C++编译器)完成吗?

【问题讨论】:

  • 如果两个系统具有相同类型的 CPU 并运行相同的操作系统,那么您不需要交叉编译,因为两个系统的目标是相同的。如果您想要针对目标 CPU 的 变体 进行优化,可以使用 -march(和其他 optimization flags and options)指定它。

标签: gcc compilation cross-compiling compiler-optimization icc


【解决方案1】:

假设您知道目标服务器的架构(在您的情况下为 A),只需将其作为 -march 传递给 B 上的 gcc。

例子

建筑就是天空

等B用

gcc -march=skylake ..... (rest of the flags)

如果 A 是锐龙

gcc -march=znver1 ..... (rest of the flags)

然后将文件从 B 复制到 A。

【讨论】:

    【解决方案2】:

    英特尔编译器可用于生成针对其他架构的可执行文件,方法是使用 GCC 兼容选项 -march 或 ICC 特定选项 -x。这些选项记录在https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-x-qxhttps://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-march

    【讨论】:

      最近更新 更多