14 releases
0.7.4 | Mar 15, 2024 |
---|---|
0.7.3 | Aug 10, 2023 |
0.7.2 | May 10, 2023 |
0.7.1 | Dec 23, 2022 |
0.2.0 | Nov 11, 2019 |
#22 in Hardware support
179,376 downloads per month
Used in 351 crates
(17 directly)
19KB
139 lines
Multiversion
Function multiversioning attribute macros for Rust.
What is function multiversioning?
Many CPU architectures have a variety of instruction set extensions that provide additional functionality. Common examples are single instruction, multiple data (SIMD) extensions such as SSE and AVX on x86/x86-64 and NEON on ARM/AArch64. When available, these extended features can provide significant speed improvements to some functions. These optional features cannot be haphazardly compiled into programs--executing an unsupported instruction will result in a crash.
Function multiversioning is the practice of compiling multiple versions of a function with various features enabled and safely detecting which version to use at runtime.
Example
The multiversion
macro compiles a function for multiple possible targets, and selects the optimal one at runtime:
use multiversion::multiversion;
#[multiversion(targets("x86_64+avx", "aarch64+neon"))]
fn square(x: &mut [f32]) {
for v in x {
*v *= *v;
}
}
License
Multiversion is distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE and LICENSE-MIT for details.
Dependencies
~1.5MB
~38K SLoC