Make horizontal blur parallel.

This commit is contained in:
mindv0rtex 2021-02-26 14:46:43 -05:00
parent 241e6ba6bf
commit 4e9778bffc
3 changed files with 28 additions and 18 deletions

View File

@ -1,4 +1,5 @@
use itertools::multizip;
use rayon::prelude::*;
#[derive(Debug)]
pub struct Blur {
@ -56,21 +57,23 @@ impl Blur {
let weight = 1.0 / (2 * radius + 1) as f32;
let width = self.width;
for (src_row, dst_row) in src.chunks_exact(width).zip(dst.chunks_exact_mut(width)) {
// First we build a value for the beginning of each row. We assume periodic boundary
// conditions, so we need to push the left index to the opposite side of the row.
let mut value = src_row[width - radius - 1];
for j in 0..radius {
value += src_row[width - radius + j] + src_row[j];
}
src.par_chunks_exact(width)
.zip(dst.par_chunks_exact_mut(width))
.for_each(|(src_row, dst_row)| {
// First we build a value for the beginning of each row. We assume periodic boundary
// conditions, so we need to push the left index to the opposite side of the row.
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 {
let left = (i + width - radius - 1) & (width - 1);
let right = (i + radius) & (width - 1);
value += src_row[right] - src_row[left];
dst_row[i] = value * weight;
}
}
for i in 0..width {
let left = (i + width - radius - 1) & (width - 1);
let right = (i + radius) & (width - 1);
value += src_row[right] - src_row[left];
dst_row[i] = value * weight;
}
})
}
/// Perform one pass of the 1D box filter of the given radius along y axis. Applies the decay

View File

@ -5,4 +5,6 @@ fn main() {
println!("{:#?}", model);
model.step();
println!("{:#?}", model);
model.step();
println!("{:#?}", model);
}

View File

@ -134,10 +134,13 @@ impl Model {
/// Perform a single simulation step.
pub fn step(&mut self) {
// To avoid borrow-checker errors inside the parallel loop.
let sensor_distance = self.config.sensor_distance;
let sensor_angle = self.config.sensor_angle;
let rotation_angle = self.config.rotation_angle;
let step_distance = self.config.step_distance;
let PopulationConfig {
sensor_distance,
sensor_angle,
rotation_angle,
step_distance,
..
} = self.config;
let (width, height) = (self.width, self.height);
let grid = &self.grid;
@ -161,5 +164,7 @@ impl Model {
});
// Deposit + Diffuse + Decay
self.iteration += 1;
}
}