From 2fa7c4b6d4e10cf192cabdc867333fdaf742f5f5 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 4 Oct 2019 01:48:45 +0200 Subject: [PATCH] Partially enabled progress for hierarchical processor. --- src/db/db/dbHierProcessor.cc | 76 +++++++++++++++++++++++++++++++----- src/db/db/dbHierProcessor.h | 10 +++++ 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/db/db/dbHierProcessor.cc b/src/db/db/dbHierProcessor.cc index 63129fdb6..1385deea2 100644 --- a/src/db/db/dbHierProcessor.cc +++ b/src/db/db/dbHierProcessor.cc @@ -441,6 +441,7 @@ local_processor_cell_contexts::compute_results (const local_processo for (typename std::vector *> >::const_iterator c = sorted_contexts.begin (); c != sorted_contexts.end (); ++c) { + proc->next (); ++index; if (tl::verbosity () >= proc->base_verbosity () + 20) { @@ -1046,14 +1047,14 @@ template class DB_PUBLIC local_processor_result_computation_task local_processor::local_processor (db::Layout *layout, db::Cell *top) - : mp_subject_layout (layout), mp_intruder_layout (layout), mp_subject_top (top), mp_intruder_top (top), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_base_verbosity (30) + : mp_subject_layout (layout), mp_intruder_layout (layout), mp_subject_top (top), mp_intruder_top (top), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_base_verbosity (30), m_progress (0), mp_progress (0) { // .. nothing yet .. } template local_processor::local_processor (db::Layout *subject_layout, db::Cell *subject_top, const db::Layout *intruder_layout, const db::Cell *intruder_top) - : mp_subject_layout (subject_layout), mp_intruder_layout (intruder_layout), mp_subject_top (subject_top), mp_intruder_top (intruder_top), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_base_verbosity (30) + : mp_subject_layout (subject_layout), mp_intruder_layout (intruder_layout), mp_subject_top (subject_top), mp_intruder_top (intruder_top), m_nthreads (0), m_max_vertex_count (0), m_area_ratio (0.0), m_base_verbosity (30), m_progress (0), mp_progress (0) { // .. nothing yet .. } @@ -1068,6 +1069,31 @@ std::string local_processor::description (const local_operation +void local_processor::next () const +{ + static tl::Mutex s_lock; + tl::MutexLocker locker (&s_lock); + ++m_progress; + + tl::RelativeProgress *rp = dynamic_cast (mp_progress); + if (rp) { + rp->set (m_progress); + } +} + +template +size_t local_processor::get_progress () const +{ + size_t p = 0; + { + static tl::Mutex s_lock; + tl::MutexLocker locker (&s_lock); + p = m_progress; + } + return p; +} + template void local_processor::run (local_operation *op, unsigned int subject_layer, unsigned int intruder_layer, unsigned int output_layer) { @@ -1416,6 +1442,16 @@ local_processor::compute_results (local_processor_contextsupdate (); db::LayoutLocker layout_update_locker (mp_subject_layout); + // prepare a progress for the computation tasks + size_t comp_effort = 0; + for (typename local_processor_contexts::iterator c = contexts.begin (); c != contexts.end (); ++c) { + comp_effort += c->second.size (); + } + + tl::RelativeProgress progress (description (op), comp_effort, 1); + m_progress = 0; + mp_progress = 0; + if (m_nthreads > 0) { std::auto_ptr > > rc_job (new tl::Job > (m_nthreads)); @@ -1471,22 +1507,44 @@ local_processor::compute_results (local_processor_contextsstart (); - rc_job->wait (); + + try { + + rc_job->start (); + while (! rc_job->wait (10)) { + progress.set (get_progress ()); + } + + } catch (...) { + rc_job->terminate (); + throw; + } + } } } else { - for (db::Layout::bottom_up_const_iterator bu = mp_subject_layout->begin_bottom_up (); bu != mp_subject_layout->end_bottom_up (); ++bu) { + try { + + mp_progress = &progress; + + for (db::Layout::bottom_up_const_iterator bu = mp_subject_layout->begin_bottom_up (); bu != mp_subject_layout->end_bottom_up (); ++bu) { + + typename local_processor_contexts::iterator cpc = contexts.context_map ().find (&mp_subject_layout->cell (*bu)); + if (cpc != contexts.context_map ().end ()) { + cpc->second.compute_results (contexts, cpc->first, op, output_layer, this); + contexts.context_map ().erase (cpc); + } - typename local_processor_contexts::iterator cpc = contexts.context_map ().find (&mp_subject_layout->cell (*bu)); - if (cpc != contexts.context_map ().end ()) { - cpc->second.compute_results (contexts, cpc->first, op, output_layer, this); - contexts.context_map ().erase (cpc); } + mp_progress = 0; + + } catch (...) { + mp_progress = 0; + throw; } } diff --git a/src/db/db/dbHierProcessor.h b/src/db/db/dbHierProcessor.h index 72b95cc1a..6444c8753 100644 --- a/src/db/db/dbHierProcessor.h +++ b/src/db/db/dbHierProcessor.h @@ -30,6 +30,7 @@ #include "dbLayout.h" #include "dbLocalOperation.h" #include "tlThreadedWorkers.h" +#include "tlProgress.h" #include #include @@ -193,6 +194,11 @@ public: db::local_processor_cell_context *create (const context_key_type &intruders); void compute_results (const local_processor_contexts &contexts, db::Cell *cell, const local_operation *op, unsigned int output_layer, const local_processor *proc); + size_t size () const + { + return m_contexts.size (); + } + iterator begin () const { return m_contexts.begin (); @@ -427,8 +433,12 @@ private: double m_area_ratio; int m_base_verbosity; mutable std::auto_ptr > > mp_cc_job; + mutable size_t m_progress; + mutable tl::Progress *mp_progress; std::string description (const local_operation *op) const; + void next () const; + size_t get_progress () const; void compute_contexts (db::local_processor_contexts &contexts, db::local_processor_cell_context *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const typename local_processor_cell_contexts::context_key_type &intruders, db::Coord dist) const; void do_compute_contexts (db::local_processor_cell_context *cell_context, const db::local_processor_contexts &contexts, db::local_processor_cell_context *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, const typename local_processor_cell_contexts::context_key_type &intruders, db::Coord dist) const; void issue_compute_contexts (db::local_processor_contexts &contexts, db::local_processor_cell_context *parent_context, db::Cell *subject_parent, db::Cell *subject_cell, const db::ICplxTrans &subject_cell_inst, const db::Cell *intruder_cell, typename local_processor_cell_contexts::context_key_type &intruders, db::Coord dist) const;