20#include <unordered_map>
21#include <unordered_set>
41 size_t allocated_size;
45 int remaining_consumers;
46 std::vector<int> consumer_stage_ids;
47 int producer_stage_id;
48 int producer_output_index;
58 : size(0), initial_size(0), allocated_size(0), d_ptr(nullptr), tag(
""),
59 remaining_consumers(0), producer_stage_id(-1), producer_output_index(0),
69 std::vector<int> input_buffer_ids;
70 std::vector<int> output_buffer_ids;
71 std::unordered_map<int, int> output_index_to_buffer_id;
73 std::vector<DAGNode*> dependencies;
74 std::vector<DAGNode*> dependents;
81 fz::event_t completion_event;
86 std::vector<void*> exec_inputs;
87 std::vector<void*> exec_outputs;
88 std::vector<size_t> exec_sizes;
91 : id(-1), stage(s), level(-1), execution_order(-1),
92 stream(nullptr), is_executed(false), completion_event(nullptr),
start_event(nullptr) {}
123 size_t buffer_size = 0,
int output_index = 0);
125 void setInputBuffer(
DAGNode* node,
size_t size,
const std::string& tag =
"input");
126 void setOutputBuffer(
DAGNode* node,
size_t size,
const std::string& tag =
"output");
140 void updateBufferTag(
int buffer_id,
const std::string& tag);
141 void setBufferPersistent(
int buffer_id,
bool persistent);
151 void execute(fz::stream_t stream);
160 void reset(fz::stream_t stream = 0);
164 void* getBuffer(
int buffer_id)
const;
172 void updateBufferSize(
int buffer_id,
size_t new_size);
203 size_t getPeakMemoryUsage()
const {
return peak_memory_usage_; }
204 size_t getCurrentMemoryUsage()
const {
return current_memory_usage_; }
205 size_t getBufferSize(
int buffer_id)
const;
206 const BufferInfo& getBufferInfo(
int buffer_id)
const;
207 const std::vector<std::vector<DAGNode*>>& getLevels()
const {
return levels_; }
208 const std::vector<DAGNode*>& getNodes()
const {
return nodes_; }
234 size_t getFusedGroupCount()
const {
return fused_groups_.size(); }
235 const std::vector<FusedGroupExec>& getFusedGroups()
const {
return fused_groups_; }
236 size_t getFusedInternalBufferCount()
const {
return fused_internal_buffers_.size(); }
238 void printDAG()
const;
239 void printBufferLifetimes()
const;
247 bool isBoundsCheckEnabled()
const {
return bounds_check_enabled_; }
255 bool isColoringEnabled()
const {
return coloring_applied_; }
256 size_t getColorRegionCount()
const {
return color_region_sizes_.size(); }
266 bool isCaptureMode()
const {
return capture_mode_; }
275 bool isProfilingEnabled()
const {
return profiling_enabled_; }
284 std::vector<DAGNode*> nodes_;
285 std::unordered_map<int, BufferInfo> buffers_;
290 std::vector<fz::stream_t> streams_;
293 std::vector<std::vector<DAGNode*>> levels_;
296 size_t current_memory_usage_;
297 size_t peak_memory_usage_;
299 bool profiling_enabled_;
300 bool bounds_check_enabled_;
305 bool coloring_disabled_;
306 bool coloring_applied_;
307 std::unordered_map<int, int> buffer_color_;
308 std::vector<size_t> color_region_sizes_;
309 std::vector<void*> color_region_ptrs_;
312 std::vector<FusedGroupExec> fused_groups_;
313 std::unordered_map<DAGNode*, size_t> fused_dispatch_;
314 std::unordered_set<DAGNode*> fused_member_;
317 std::unordered_set<int> fused_internal_buffers_;
320 void assignStreams();
321 void allocateBuffer(
int buffer_id, fz::stream_t stream);
322 void freeBuffer(
int buffer_id, fz::stream_t stream);
323 void planPreallocation();
334 bool executeFusedNode(
DAGNode* node, fz::stream_t stream);
DAGNode * addStage(Stage *stage, std::string name="")
void setCaptureMode(bool capture)
int addDependency(DAGNode *dependent, DAGNode *dependency, size_t buffer_size=0, int output_index=0)
void setExternalValidSize(int buffer_id, size_t valid_bytes)
void setColoringEnabled(bool enable)
Definition dag.h:254
size_t computeTopoPoolSize() const
size_t getTotalBufferSize() const
void preallocateBuffers(fz::stream_t stream=0)
bool consumedOnlyByUnpaddedFusion(int buffer_id) const
int addUnconnectedOutput(DAGNode *node, size_t size, int output_index, const std::string &tag)
void setExternalPointer(int buffer_id, void *external_ptr)
size_t getStreamCount() const
Definition dag.h:214
void enableBoundsCheck(bool enable)
Definition dag.h:246
void setFusedGroups(std::vector< FusedGroupExec > groups)
void enableProfiling(bool enable)
void reset(fz::stream_t stream=0)
std::vector< StageTimingResult > collectTimings()
void configureStreams(int num_streams)
int getMaxParallelism() const
bool connectExistingOutput(DAGNode *producer, DAGNode *consumer, int output_index)
MemoryStrategy
Definition dag.h:32
@ MINIMAL
Allocate on-demand, free at last consumer. Lowest peak memory.
@ PREALLOCATE
Allocate everything upfront at finalize(). Required for graph mode.
Pipeline and per-stage profiling result types.
bool is_external
Definition dag.h:52
bool is_persistent
If true, survives reset() until DAG destruction.
Definition dag.h:51
size_t valid_size
Definition dag.h:55
DAGNode * dispatch
member whose schedule point launches the kernel
Definition dag.h:224
std::vector< DAGNode * > members
all group nodes (skipped individually)
Definition dag.h:225
DAGNode * head
first logical node on the fused main path
Definition dag.h:222
const FusedImpl * impl
matched fused implementation
Definition dag.h:227
std::vector< Stage * > stages
group stages for the runner context
Definition dag.h:226
DAGNode * tail
last node; its output = the archive
Definition dag.h:223
std::string execution_path
last runtime path, when reported by runner
Definition dag.h:228
bool executed
reset between DAG executions
Definition dag.h:229
fz::event_t start_event
Non-null only when profiling is enabled.
Definition dag.h:82
A registered fused implementation and its matcher.
Definition fusion_registry.h:90
Backend-neutral GPU type aliases.