#cpu #performance #optimization #cargo #compression #multivers

nightly multivers-runner

Library to create a portable binary that embeds multiple versions of an executable each using a different CPU feature set

3 releases

0.1.2 Aug 11, 2024
0.1.1 Feb 17, 2024
0.1.0 Dec 15, 2023

#1256 in Hardware support

Download history 34/week @ 2024-07-22 6/week @ 2024-08-05 160/week @ 2024-08-12 22/week @ 2024-08-19 17/week @ 2024-08-26 34/week @ 2024-09-16 14/week @ 2024-09-23 3/week @ 2024-09-30 7/week @ 2024-10-14 91/week @ 2024-10-21 71/week @ 2024-10-28 64/week @ 2024-11-04

233 downloads per month

MIT/Apache

22KB
381 lines

multivers-runner

This crate can be used to create a portable binary that embeds multiple versions of an executable each using a different CPU feature set.

Take a look at cargo multivers, it does all the work for you: build the multiple versions and build the final binary that embeds them.

How Does it Work?

The build script parses a JSON description file (see an example below) that contains a set of paths to executables with their dependency on CPU features from the environment variable MULTIVERS_BUILDS_DESCRIPTION_PATH. Then, it generates a Rust file that contains a compressed source binary and compressed binary patches to regenerate the other binaries from the source.

{
  "builds": [
    {
      "path": "/path/to/binary-with-additional-cpu-features",
      "features": [
        "aes",
        "avx",
        "avx2",
        "sse",
        "sse2",
        "sse3",
        "sse4.1",
        "sse4.2",
        "ssse3",
      ]
    },
    {
      "path": "/path/to/binary-source",
      "features": [
        "sse",
        "sse2"
      ]
    }
  ]
}

At runtime, the function main uncompresses and executes the version that matches the CPU features of the host. On Linux, it uses memfd_create and fexecve to do an in-memory execution. On Windows, however, it writes the version in a temporary file and executes it.

cargo multivers

This library is used by cargo multivers to build the final binary that embeds the multiple versions.

Dependencies

~2–12MB
~139K SLoC