Make horizontal blur parallel.
This commit is contained in:
parent
241e6ba6bf
commit
4e9778bffc
31
src/blur.rs
31
src/blur.rs
@ -1,4 +1,5 @@
|
|||||||
use itertools::multizip;
|
use itertools::multizip;
|
||||||
|
use rayon::prelude::*;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Blur {
|
pub struct Blur {
|
||||||
@ -56,21 +57,23 @@ impl Blur {
|
|||||||
let weight = 1.0 / (2 * radius + 1) as f32;
|
let weight = 1.0 / (2 * radius + 1) as f32;
|
||||||
let width = self.width;
|
let width = self.width;
|
||||||
|
|
||||||
for (src_row, dst_row) in src.chunks_exact(width).zip(dst.chunks_exact_mut(width)) {
|
src.par_chunks_exact(width)
|
||||||
// First we build a value for the beginning of each row. We assume periodic boundary
|
.zip(dst.par_chunks_exact_mut(width))
|
||||||
// conditions, so we need to push the left index to the opposite side of the row.
|
.for_each(|(src_row, dst_row)| {
|
||||||
let mut value = src_row[width - radius - 1];
|
// First we build a value for the beginning of each row. We assume periodic boundary
|
||||||
for j in 0..radius {
|
// conditions, so we need to push the left index to the opposite side of the row.
|
||||||
value += src_row[width - radius + j] + src_row[j];
|
let mut value = src_row[width - radius - 1];
|
||||||
}
|
for j in 0..radius {
|
||||||
|
value += src_row[width - radius + j] + src_row[j];
|
||||||
|
}
|
||||||
|
|
||||||
for i in 0..width {
|
for i in 0..width {
|
||||||
let left = (i + width - radius - 1) & (width - 1);
|
let left = (i + width - radius - 1) & (width - 1);
|
||||||
let right = (i + radius) & (width - 1);
|
let right = (i + radius) & (width - 1);
|
||||||
value += src_row[right] - src_row[left];
|
value += src_row[right] - src_row[left];
|
||||||
dst_row[i] = value * weight;
|
dst_row[i] = value * weight;
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Perform one pass of the 1D box filter of the given radius along y axis. Applies the decay
|
/// Perform one pass of the 1D box filter of the given radius along y axis. Applies the decay
|
||||||
|
|||||||
@ -5,4 +5,6 @@ fn main() {
|
|||||||
println!("{:#?}", model);
|
println!("{:#?}", model);
|
||||||
model.step();
|
model.step();
|
||||||
println!("{:#?}", model);
|
println!("{:#?}", model);
|
||||||
|
model.step();
|
||||||
|
println!("{:#?}", model);
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/model.rs
13
src/model.rs
@ -134,10 +134,13 @@ impl Model {
|
|||||||
/// Perform a single simulation step.
|
/// Perform a single simulation step.
|
||||||
pub fn step(&mut self) {
|
pub fn step(&mut self) {
|
||||||
// To avoid borrow-checker errors inside the parallel loop.
|
// To avoid borrow-checker errors inside the parallel loop.
|
||||||
let sensor_distance = self.config.sensor_distance;
|
let PopulationConfig {
|
||||||
let sensor_angle = self.config.sensor_angle;
|
sensor_distance,
|
||||||
let rotation_angle = self.config.rotation_angle;
|
sensor_angle,
|
||||||
let step_distance = self.config.step_distance;
|
rotation_angle,
|
||||||
|
step_distance,
|
||||||
|
..
|
||||||
|
} = self.config;
|
||||||
let (width, height) = (self.width, self.height);
|
let (width, height) = (self.width, self.height);
|
||||||
let grid = &self.grid;
|
let grid = &self.grid;
|
||||||
|
|
||||||
@ -161,5 +164,7 @@ impl Model {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Deposit + Diffuse + Decay
|
// Deposit + Diffuse + Decay
|
||||||
|
|
||||||
|
self.iteration += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user