Description
WIP implementation: https://salsa.debian.org/Kazan-team/vector-math
Problem Statement:
Vector Math functions are not widely available and can’t be used from core
due to needing to link to the external vector math library, therefore we are building a math library for Rust that can be used everywhere and doesn’t require external dependencies allowing it to be used in core
.
This allows SimdF32::sin()
and similar to then work everywhere SimdF32
or similar works (basically everywhere).
This includes WebAssembly (with or without the simd128
extension), Microcontrollers, etc.
Also, where actual SIMD instructions are available, it will be faster than just calling f32::sin
a bunch of times.
We will want to extend LLVM to use our Vector Math library as the fallback implementation for LLVM's vector math intrinsics (e.g. llvm.sin.v8f32
).
The reason we want to go through all the hassle of getting LLVM to generate calls to our library is then because LLVM can then generate the native sin
instruction(s) where supported and call our library otherwise. Leaving it up to LLVM to decide is by far the best option since it can do const-propagation and other optimizations based on its knowledge of how sin
ought to behave, and LLVM is the best spot to make target-specific decisions.
This means we can’t just use LLVM’s existing features for a vector math library but require it to learn how to generate calls to our Vector Math library when native instructions aren't available.
Example of adding libcall support to LLVM: https://reviews.llvm.org/D53927
Implementation:
https://salsa.debian.org/Kazan-team/vector-math
The Vector Math library is being written in #![no_std]
Rust, along with an abstraction layer allowing the implemented functions to also be used in Kazan (a Vulkan GPU driver being developed for Libre-SOC, who is helping funding development, see bug on Libre-SOC's bugtracker).
The abstraction layer will have four implementations, the first three of which are currently implemented:
- A scalar math implementation for testing purposes.
- A implementation wrapping over
core::simd
. - A demo implementation of generating compiler IR.
- An implemententation that generates Kazan's compiler IR, allowing integration with Kazan.
Kazan needs all the functions that Vulkan requires (basically all the sin, cos, tan, atan, sinpi, cospi, exp, log2, pow, etc. functions), if we work together on the same library we could also use it for Rust's std::simd
, potentially saving a bit of work. Both Kazan and rustc share backends (LLVM and cranelift) and would like to support having vector math functions inlined into calling code, giving a potentially substantial performance boost.
Implemented functions so far:
f16
/f32
/f64
:
abs
,copy_sign
,trunc
,round_to_nearest_ties_to_even
,floor
,ceil
ilogb
sin_pi
,cos_pi
,sin_cos_pi
,tan_pi
sqrt_fast
u8
/u16
/u32
/u64
/i8
/i16
/i32
/i64
:
count_leading_zeros
count_trailing_zeros
count_ones