The easy way, with multiversion

The multiversion crate is helpful for automatically multiversioning functions.

A multiversioned function is one that’s compiled multiple times for any number of targets, with the optimal function selected at runtime.

use multiversion::multiversion;

#[multiversion(targets(
    "x86_64+avx",
    "x86_64+sse4.2",
    "arm+neon",
))]
fn multiversioned() {
    println!("This function uses whichever features are available")
}

Multiversion also supports automatically targeting all SIMD features on all architectures:

use multiversion::multiversion;

#[multiversion(targets = "simd")]
fn multiversioned() {
    println!("This function automatically uses the best SIMD feature available")
}

For each target, a copy of the function is compiled with the appropriate target_feature attributes. At runtime, the optimal function is selected.

Info

Compared to the example on the previous page, multiversion also selects the appropriate function with less performance overhead.