Meausure flush stage Signed-off-by: Nico Burns <nico@nicoburns.com>
diff --git a/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs b/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs index 0239c02..49f5e5d 100644 --- a/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs +++ b/sparse_strips/vello_cpu/src/dispatch/multi_threaded.rs
@@ -178,36 +178,98 @@ fn run_coarse(&mut self, abort_empty: bool) { let result_receiver = self.result_receiver.as_mut().unwrap(); + let start = std::time::Instant::now(); + + let mut total_layers = 0; + let mut current_depth = 0; + let mut max_depth = 0; + let mut renders = 0; + let mut tot_render_time = 0; + let mut tot_push_layer_time = 0; + let mut tot_pop_layer_time = 0; + let mut tot_match_time = 0; + + let mut received = false; + let mut first_recv = 0; + + let mut after_task_time = std::time::Instant::now(); + loop { - match result_receiver.try_recv() { - Ok(cmd) => match cmd { - CoarseCommand::Render { - thread_id, - strips, - fill_rule, - paint, - } => self.wide.generate(&strips, fill_rule, paint, thread_id), - CoarseCommand::PushLayer { - thread_id, - clip_path, - blend_mode, - mask, - opacity, - } => self - .wide - .push_layer(clip_path, blend_mode, mask, opacity, thread_id), - CoarseCommand::PopLayer => self.wide.pop_layer(), - }, + + let att = after_task_time.elapsed().as_micros(); + println!("ATT {att}us"); + + let msg = time!(us:"try_recv", { + result_receiver.try_recv() + }); + + time!(us:"match_time", tot_match_time, { + match msg { + Ok(cmd) => { + if !received { + first_recv = start.elapsed().as_micros(); + received = true; + } + match cmd { + CoarseCommand::Render { + thread_id, + strips, + fill_rule, + paint, + } => { + renders += 1; + time!(us:"render wide", tot_render_time, { + self.wide.generate(&strips, fill_rule, paint, thread_id) + }) + } + CoarseCommand::PushLayer { + thread_id, + clip_path, + blend_mode, + mask, + opacity, + } => time!(us:"push layer", tot_push_layer_time, { + total_layers += 1; + current_depth += 1; + max_depth = max_depth.max(current_depth); + self + .wide + .push_layer(clip_path, blend_mode, mask, opacity, thread_id) + }), + CoarseCommand::PopLayer => time!(us:"pop layer", tot_pop_layer_time, { + current_depth -= 1; + self.wide.pop_layer() + }), + } + } Err(e) => match e { TryRecvError::Empty => { + println!("EMPTY"); if abort_empty { - return; + break; } } - TryRecvError::Disconnected => return, + TryRecvError::Disconnected => { + break; + } }, } + + }); + + after_task_time = std::time::Instant::now(); } + + let t = start.elapsed().as_micros(); + println!("Total layers: {total_layers}"); + println!("Total push layer time: {tot_push_layer_time}"); + println!("Total pop layer time: {tot_pop_layer_time}"); + println!("Max depth: {max_depth}"); + println!("Renders: {renders}"); + println!("Total render times: {tot_render_time}"); + println!("Total match time: {tot_match_time}"); + println!("first_recv: {first_recv}"); + println!("abort_empty in {}us", t); } fn rasterize_with<S: Simd, F: FineKernel<S>>( @@ -343,12 +405,17 @@ } fn flush(&mut self) { - self.flush_tasks(); + time!("flush_tasks", { + self.flush_tasks(); + }); let sender = core::mem::take(&mut self.task_sender); // Note that dropping the sender will signal to the workers that no more new paths // can arrive. core::mem::drop(sender); - self.run_coarse(false); + + time!("run_coarse", { + self.run_coarse(false); + }); self.flushed = true; }
diff --git a/sparse_strips/vello_cpu/src/lib.rs b/sparse_strips/vello_cpu/src/lib.rs index 0e0c412..fa5a426 100644 --- a/sparse_strips/vello_cpu/src/lib.rs +++ b/sparse_strips/vello_cpu/src/lib.rs
@@ -108,6 +108,31 @@ extern crate alloc; extern crate core; +macro_rules! time { + ($label:expr, $body:tt) => {{ + let start = ::std::time::Instant::now(); + let result = {$body}; + let t = start.elapsed().as_millis(); + println!("{} in {}ms", $label, t); + result + }}; + (us:$label:expr, $body:tt) => {{ + let start = ::std::time::Instant::now(); + let result = {$body}; + let t = start.elapsed().as_micros(); + println!("{} in {}us", $label, t); + result + }}; + (us:$label:expr, $acc:expr, $body:tt) => {{ + let start = ::std::time::Instant::now(); + let result = {$body}; + let t = start.elapsed().as_micros(); + $acc += t; + println!("{} in {}us", $label, t); + result + }}; +} + mod render; mod dispatch;