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 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

View File

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

View File

@ -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;
} }
} }