SIMDNoise
Super fast SIMD noise library for Rust. PRs welcome!
Available on crates.io.
See above crates.io link for Docs.
Features
- Gradient Noise (Simplex aka Perlin) 1D,2D,3D,4D
- Fractal Brownian Motion, Ridge, and Turbulence
- Cellular Noise (aka Voroni) 2D, 3D
- SSE2, SSE41, and AVX2 instruction sets, along with non SIMD fallback
- AVX2 version also leverages FMA3
- Runtime detection picks the best available instruction set
Benchmarks
Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
Single Threaded
using Criterion.rs
1D 1024 points of Fbm Noise, 3 Octaves
SIMD Set |
Time |
scalar |
21.289 us |
sse2 |
8.203 us |
sse41 |
6.598 us |
avx2 |
3.174 us |
2D 256x256 Fbm Noise, 3 Octaves
SIMD Set |
Time |
scalar |
5.351 ms |
sse2 |
1.766 ms |
sse41 |
1.562 ms |
avx2 |
0.880 ms |
3D 32x32x32 Fbm Noise, 3 Octaves
SIMD Set |
Time |
scalar |
3.173 ms |
sse2 |
1.631 ms |
sse41 |
1.440 ms |
avx2 |
0.882 ms |
4D 8x8x8x8 Fbm Noise, 3 Octaves
SIMD Set |
Time |
scalar |
534 us |
sse2 |
345 us |
sse41 |
305 us |
avx2 |
144 us |
2D 1024x1024 Cell Noise
SIMD Set |
Time |
scalar |
37.220 ms |
sse2 |
30.780 ms |
sse41 |
20.492 ms |
avx2 |
8.697 ms |
3D 32x32x32 Cell Noise
SIMD Set |
Time |
scalar |
3.964 ms |
sse2 |
3.660 ms |
sse41 |
2.251 ms |
avx2 |
1.182 ms |
Todo
- AVX512 support
- ARM NEON support
- Other noise types
Get a block of noise with runtime SIMD detection
The library will, at runtime, pick the fastest available options between SSE2, SSE41, and AVX2
use simdnoise::*;
let noise_type = simdnoise::NoiseType::Fbm {
freq: 0.04,
lacunarity: 0.5,
gain: 2.0,
octaves: 3,
};
let (an_f32_vec,min,max) = simdnoise::get_2d_noise(0.0, 800, 0.0, 600, noise_type);
let (an_f32_vec,min,max) = simdnoise::get_3d_noise(0.0, 200, 0.0, 200,0.0, 200, noise_type);
let an_f32_vec = simdnoise::get_2d_scaled_noise(0.0, 800, 0.0, 600, noise_type,-1.0,1.0);
Call noise functions directly
Sometimes you need something other than a block, like the points on the surface of a sphere.
Sometimes you may want to use SSE41 even with AVX2 is available
let (noise,min,max) = simdnoise::sse41::get_2d_noise(0.0,100,0.0,100,noise_type);
unsafe {
let x = _mm_set1_ps(5.0);
let y = _mm_set1_ps(10.0);
let f : __m128 = simdnoise::sse2::simplex_2d(x,y);
let x = _mm256_set1_ps(5.0);
let y = _mm256_set1_ps(10.0);
let freq = _mm_256_set1_ps(1.0);
let lacunarity = _mm256_set1_ps(0.5);
let gain = _mm256_set1_ps(2.0);
let octaves = 3;
let f_turbulence : __m256 = simdnoise::avx2::turbulence_2d(x,y,freq,lacunarity,gain,octaves);
}