mirror of
https://github.com/verilator/verilator.git
synced 2026-10-06 10:03:44 +02:00
Internals: Refactor MT scheduling (#8012)
Prep for fixing test added in #7913. This is a large scale no functional change refactor, however, MT output is perturbed as tied scores will be broken differently due to ordering changes (still deterministic). Split multi-threaded scheduling out of the monolithic V3OrderParallel.cpp, into relatively independent parts, simplify the data structures, and drop redundant or unused code. New translation units: - V3OrderMTaskGraph.h/.cpp: OrderMTaskGraph, the graph of LogicMTask vertices and MTaskEdge edges. LogicMTask and MTaskEdge no longer depend on the coarsening algorithm's merge candidate types; per-algorithm auxiliary data is attached externally via the vertex and edge user pointers. - V3OrderMTaskFixHazards.cpp: data hazard fixup, was FixDataHazards. - V3OrderMTaskContraction.cpp: graph coarsening, was Partitioner together with PropagateCp and the merge candidate types. - V3OrderParallel.cpp: now just the partitioning driver and ExecMTask graph construction. Data structure changes: - Delete V3Scoreboard.h/.cpp. The generic template had a single user, now a file-local MergeCandidateScoreboard in V3OrderMTaskContraction.cpp. - Merge candidates are now MergeCandidate/SiblingMC/EdgeMC, distinguished by a bit in the candidate id rather than by a vtable, and allocated by the scoreboard, which owns their lifetime. This removes the multiple inheritance previously used by MTaskEdge. Move `hashGraphDebug` which prints the hash of a graph's shape for debugging to generic `V3Graph::hashGraphDebug`. Removed (can be added back later): - Unnecesasry self tests that force special data stucture requirements. - Per stage --stats output under --debug. (Final figures still reported.) - Various debug dumps
This commit is contained in:
@@ -82,11 +82,21 @@ public:
|
||||
// OrderMoveGraph is constructed from the fine-grained OrderGraph.
|
||||
// It is a slightly coarsened representation of dependencies used to drive serialization.
|
||||
class OrderMoveGraph final : public V3Graph {
|
||||
OrderGraph& m_orderGraph; // The OrderGraph this move graph was built from
|
||||
|
||||
public:
|
||||
explicit OrderMoveGraph(OrderGraph& orderGraph)
|
||||
: m_orderGraph{orderGraph} {}
|
||||
|
||||
OrderGraph& orderGraph() const { return m_orderGraph; }
|
||||
|
||||
// Build an OrderMoveGraph from an OrderGraph
|
||||
static std::unique_ptr<OrderMoveGraph> build(OrderGraph&, const V3Order::TrigToSenMap&);
|
||||
};
|
||||
|
||||
//======================================================================
|
||||
// OrderMoveDomScope
|
||||
|
||||
// Information stored for each unique (domain, scope) pair. Mainly a list of ready vertices under
|
||||
// that (domain, scope). OrderMoveDomScope instances are themselves organized into a global ready
|
||||
// list if they have ready vertices.
|
||||
|
||||
Reference in New Issue
Block a user