#cpu #cargo-build #cargo #optimization #performance #package-version #cargo-toml

app cargo-multivers

Cargo 子命令,用于构建同一可执行文件的不同版本,每个版本具有不同的 CPU 特性集,合并成一个单一的便携式优化二进制文件

14 个版本 (8 个破坏性更新)

0.9.0 2024 年 7 月 26 日
0.8.1 2024 年 2 月 17 日
0.8.0 2023 年 12 月 27 日
0.5.0 2023 年 8 月 12 日
0.3.0 2023 年 3 月 28 日

#49Cargo 插件

Download history 8/week @ 2024-05-20 20/week @ 2024-05-27 13/week @ 2024-06-03 24/week @ 2024-06-10 10/week @ 2024-06-17 9/week @ 2024-06-24 8/week @ 2024-07-01 7/week @ 2024-07-08 1/week @ 2024-07-15 112/week @ 2024-07-22 24/week @ 2024-07-29 4/week @ 2024-08-05 24/week @ 2024-08-12

每月下载量 164

MIT/Apache

60KB
1K SLoC

cargo-multivers

Latest Version MSRV Apache 2.0 OR MIT licensed

Cargo 子命令,用于构建同一可执行文件的不同版本,每个版本具有不同的 CPU 特性集,合并成一个单一的便携式优化二进制文件。

概述

cargo-multivers 构建 Rust 包的可执行文件的不同版本。每个版本使用一组 CPU 特性(例如,+cmpxchg16b,+fxsr,+sse,+sse2,+sse3)从支持的 CPU(例如,ivybridge)构建(例如,x86_64-pc-windows-msvc)。

默认情况下,它会列出已知于 rustc 的目标 CPU,然后它会获取每组的 CPU 特性并过滤掉重复项(即支持相同扩展的 CPU)。您还可以在您的 Cargo.toml 中添加一个部分来设置您包允许的 CPU 列表。例如,对于 x86_64,您可以添加

[package.metadata.multivers.x86_64]
cpus = ["x86-64", "x86-64-v2", "x86-64-v3", "x86-64-v4", "raptorlake"]

构建不同的版本后,它会计算每个版本的哈希值并过滤掉重复项(即尽管具有不同的 CPU 特性,但产生了相同二进制的编译)。最后,它构建一个运行器,该运行器嵌入一个压缩的版本(源代码)和其他版本作为压缩的二进制补丁到源代码中。例如,当为目标 x86_64-pc-windows-msvc 构建时,默认情况下将构建 37 个不同的版本,过滤、压缩并合并成一个单一的便携式二进制文件。

运行时,运行器将解压缩并执行与主机 CPU 特性匹配的版本。

预期用途

虽然可以使用 cargo-multivers 从 Rust 包构建任何类型的二进制文件,但它主要用于以下场景:

  • 构建分发到具有不同微架构的多位用户的项目(例如,您项目的发布版本)。
  • 构建执行长时间运行任务(例如,重量级计算、服务器或游戏)的程序。

[!TIP] 如果您只想优化您的程序以针对您的 CPU,不要使用 cargo multivers,您可以直接使用 -C target-cpu=native 如下:RUSTFLAGS=-Ctarget-cpu=native cargo build --release。您将节省一些 CPU 循环 :)

支持的操作系统

该项目已在 Windows 和 Linux 上进行测试(由于使用了 memfd_create,仅支持 Linux >= v3.17)。

支持的架构

理论上支持以下架构:x86、x86_64、arm、aarch64、riscv32、riscv64、powerpc、powerpc64、mips 和 mips64。但仅对 x86_64 进行了测试。

安装

cargo install --locked cargo-multivers

使用方法

cargo +nightly multivers

建议

cargo multivers 使用您的包的 release 配置文件 来构建二进制文件([profile.release])。为了优化二进制文件的大小并减少启动时间,建议启用可以减小构建大小的功能。例如,您可以拥有以下配置文件来减小二进制文件的大小,同时仍优先考虑速度优化,并且不会显著增加构建时间

[profile.release]
strip = "symbols"
panic = "abort"
lto = "thin"

为了减少总构建时间,最好限制将要为其构建的项目所针对的 CPU 集合。例如,如果您为 x86_64 构建,您可以将以下部分添加到您的 Cargo.toml

[package.metadata.multivers.x86_64]
cpus = ["x86-64", "x86-64-v2", "x86-64-v3", "x86-64-v4"]

GitHub Actions 集成

如果您想在发布项目的新版本时发布由 cargo-multivers 构建的优化便携式二进制文件,您可以使用 cargo-multivers GitHub Action。为此,您需要一个 Rust 夜间工具链,并在作业中添加一个步骤

    - uses: ronnychevalier/cargo-multivers@main

例如,这可以看起来像

jobs:
  cargo-multivers-build:
    name: Build with cargo-multivers
    runs-on: windows-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
    - name: Install Rust nightly
      uses: dtolnay/rust-toolchain@master
      with:
        toolchain: nightly
    - uses: ronnychevalier/cargo-multivers@main
      with:
        manifest_path: path/to-your/Cargo.toml
    - name: Upload release archive
      uses: softprops/action-gh-release@v1
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: the-name-of-your-binary.exe

        ... [other config fields]

输入

您可以设置两种类型的输入。那些与 cargo-multivers 的安装方式相关的输入

名称 描述 必需 默认
版本 要使用的 cargo-multivers 版本(例如,0.7.0) false crates.io 上发布的最新版本

以及与 cargo multivers 给定的参数相关的输入(例如,target 配置 --target 选项)

名称 描述 必需 默认
manifest_path Cargo.toml 的路径 false
target 为指定目标三元组构建 false
out_dir 将最终工件复制到此目录 true .
profile 使用指定的配置文件构建工件 false
runner_version 指定要使用的运行程序的版本 false
other_args 给 cargo multivers 的其他参数 false
build_args 给 cargo build 的参数 false

许可证

根据以下任一许可证授权:

供您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,包括在作品中,都应双授权如上所述,不附加任何额外条款或条件。

依赖项

~6–14MB
~164K SLoC