基于 AMD,运行 基于英特尔?

Build on AMD, run on Intel?

如果我 cargo build --release 在 AMD CPU 上使用 Rust 二进制文件,然后 运行 在 Intel 上使用它(反之亦然),这可能是个问题(兼容性问题 and/or 相当大的性能牺牲)?我知道我们可以使用 target-cpu=<cpu> 标志,并且 应该 为目标平台生成 可能 更优化的机器代码。我的问题是:

  1. 实际上,如果我们为一个平台构建但 运行 在另一个平台上构建,我们是否应该期望 显着 运行时间性能损失?

  2. 如果我们在 AMD 上构建 target-cpu=intel(反之亦然),编译 本身是否可以:

    • 慢一点?
    • 它针对目标平台的优化程度受限?

注意:Linux 将是编译和 运行ning 的 OS。

一般来说,如果您只执行 cargo build --release 而无需进一步配置,那么您将在任何相关架构的机器上获得 运行 的二进制文件。也就是说,它将 运行 在 Intel 或 AMD CPU 上,即 x86-64。它还将针对该架构的一般 CPU 进行优化,无论您在哪种类型的 CPU 上构建它。具体设置将取决于 rustc 和 LLVM 的配置,但除非您进行了自定义构建,否则通常是这种情况。

通常这足以满足大多数人的需求,无需为目标 CPU 构建。但是,如果您指定一个特定的 CPU,那么它将针对该 CPU 进行优化,并且可能包含在其他 CPU 上不 运行 的指令。例如,x86-64 的体系结构定义不包含像 AVX 这样的东西,它是后来添加的,所以如果你为 CPU 编译提供这些指令,那么 rustc 可能会使用它们,这可能会导致它执行其他地方更糟或根本没有。

如果不进一步了解您的代码和性能需求,就不可能详细说明您的具体情况。我的建议只是使用 cargo build --release 而不是针对特定的 CPU 进行优化,除非您已经测量了代码并确定有一个特定的部分速度慢并且可以从中受益。大多数人从代码的额外可移植性中受益匪浅,不需要 CPU-specific 优化。

我在这里所说的一切也适用于其他架构集。如果您为 aarch64-unknown-linux-gnu 或 riscv64gc-unknown-linux-gnu 编译,它将为该类型的通用 CPU 构建,除非您指定不同的选项,否则该类型适用于该类型的所有系统。例外情况往往出现在像 macOS 这样的系统上,在这些系统中,明确知道 运行 在那个 OS 上的所有 CPU 都具有一些特定的功能集,因此例如的汇编macOS 上的 x86-64 CPUs 可能针对具有给定功能的 Intel CPUs 进行优化,因为 macOS 在使用这些 [=] 的硬件上仅 运行s 23=]s.