From 16775f0e7f06c283ec11c1757dc985fd761ce464 Mon Sep 17 00:00:00 2001 From: Unbewohnte Date: Sat, 12 Feb 2022 13:46:45 +0300 Subject: [PATCH] Zooming in; A little more threads --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 18 +++++++++++++++--- src/main.rs | 46 +++++++++++++++++++++++++++++++++++++++------- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fbd1899..2d3b912 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -223,7 +223,7 @@ checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" [[package]] name = "mandelplot" -version = "0.2.0" +version = "0.3.0" dependencies = [ "clap", "image", diff --git a/Cargo.toml b/Cargo.toml index 07033d5..de63888 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mandelplot" -version = "0.2.0" +version = "0.3.0" license = "MIT" edition = "2021" authors = ["Unbewohnte "] diff --git a/README.md b/README.md index 8b179aa..8cd590b 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,25 @@ OPTIONS: ## Naive benchmarks Singe-threaded (19200x10800) (pre v0.2.0) -- ./mandelplot -d 19200x10800 -p dark 70.06s user 0.14s system 99% cpu 1:10.24 total + +`./mandelplot -d 19200x10800 -p dark 70.06s user 0.14s system 99% cpu 1:10.24 total` Multi-threaded (19200x10800) (v0.2.0) -- ./target/release/mandelplot -d 19200x10800 -p dark 85.28s user 8.06s system 258% cpu 36.079 total + +`./target/release/mandelplot -d 19200x10800 -p dark 85.28s user 8.06s system 258% cpu 36.079 total` 1:10 - 0:36 == 0:34 saved +Multi-threaded (19200x10800) (v0.3.0) + +`./mandelplot -d 19200x10800 87.43s user 10.93s system 349% cpu 28.134 total` + +1:10 - 0:28 == 0:42 saved + +## Interesting "places" +- `./mandelplot -z='-0.55,-0.55x-0.5,-0.48' -i 5000` +- `./mandelplot -z='-0.565,-0.565x-0.550,-0.550' -i 10000` + ## TODO: - ~~generate image in parallel~~ -- zooming in \ No newline at end of file +- ~~zooming in~~ \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 321ce3d..fd89bcf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,10 +69,10 @@ fn compute_pixel_color(c: num::Complex, max_iter: u32, palette: u8) -> u8 { } fn main() { - const RE_START: f64 = -2.5; - const RE_END: f64 = 1.5; - const IM_START: f64 = -2.0; - const IM_END: f64 = 2.0; + let mut re_start: f64 = -2.5; + let mut re_end: f64 = 1.5; + let mut im_start: f64 = -2.0; + let mut im_end: f64 = 2.0; let mut width: u32 = 7680; let mut height: u32 = 4320; @@ -81,7 +81,7 @@ fn main() { let mut palette: u8 = 0; let matches = clap::App::new("mandelplot") - .version("0.2.0") + .version("0.3.0") .author("Kasyanov Nikolay Alexeyevich (Unbewohnte)") .arg( Arg::new("max_iter") @@ -119,6 +119,15 @@ fn main() { .long("palette") .short('p') ) + .arg( + Arg::new("m_set_dimensions") + .help("Set real and imaginary constraints (real_start,imaginary_startxreal_end,imaginary_end)") + .takes_value(true) + .required(false) + .default_value("-2.5,-2.0x1.5,2.0") + .long("m_set_dimensions") + .short('z') + ) .get_matches(); // process given options @@ -152,11 +161,34 @@ fn main() { } } + if let Some(arg_m_set_dimensions) = matches.value_of("m_set_dimensions") { + match arg_m_set_dimensions.split_once("x") { + Some((start, end)) => { + match start.split_once(",") { + Some((real_start, imaginary_start)) => { + re_start = real_start.parse::().unwrap(); + im_start = imaginary_start.parse::().unwrap(); + } + None => {} + } + + match end.split_once(",") { + Some((real_end, imaginary_end)) => { + re_end = real_end.parse::().unwrap(); + im_end = imaginary_end.parse::().unwrap(); + } + None => {} + } + } + None => {} + } + } + let img = Arc::new(Mutex::new(RgbImage::new(width, height))); // run the algorithm in a naive multi-threaded way - const AMOUNT_OF_THREADS: usize = 8; + const AMOUNT_OF_THREADS: usize = 24; let thread_work = (height as f32 / AMOUNT_OF_THREADS as f32) as u32; let mut threads = Vec::with_capacity(AMOUNT_OF_THREADS); @@ -166,7 +198,7 @@ fn main() { threads.push(std::thread::spawn(move || { for y in from..from+thread_work { for x in 0..width { - let c = pixel_to_set_point(x, y, width, height, RE_START, RE_END, IM_START, IM_END); + let c = pixel_to_set_point(x, y, width, height, re_start, re_end, im_start, im_end); let pixel_color = compute_pixel_color(c, max_iter, palette); img_copy.lock().unwrap().put_pixel(x, y, Rgb([pixel_color, pixel_color, pixel_color]));