• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daisytuner / sdfglib / 18718471628

22 Oct 2025 01:51PM UTC coverage: 61.746% (-0.6%) from 62.358%
18718471628

push

github

web-flow
Merge pull request #288 from daisytuner/InstrumentationInfo

Instrumentation info

104 of 310 new or added lines in 20 files covered. (33.55%)

25 existing lines in 6 files now uncovered.

9746 of 15784 relevant lines covered (61.75%)

100.97 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

3.26
/src/codegen/instrumentation/instrumentation_plan.cpp
1
#include "sdfg/codegen/instrumentation/instrumentation_plan.h"
2
#include <iostream>
3
#include <memory>
4
#include <string>
5
#include <utility>
6

7
#include "sdfg/analysis/analysis.h"
8
#include "sdfg/analysis/loop_analysis.h"
9
#include "sdfg/codegen/language_extension.h"
10
#include "sdfg/element.h"
11
#include "sdfg/symbolic/symbolic.h"
12

13
namespace sdfg {
14
namespace codegen {
15

16
void InstrumentationPlan::update(const structured_control_flow::ControlFlowNode& node, InstrumentationEventType event_type) {
×
17
    this->nodes_[&node] = event_type;
×
18
}
×
19

20
bool InstrumentationPlan::should_instrument(const Element& node) const { return this->nodes_.count(&node); }
62✔
21

22
void InstrumentationPlan::begin_instrumentation(
×
23
    const Element& node, PrettyPrinter& stream, LanguageExtension& language_extension, const InstrumentationInfo& info
24
) const {
25
    auto& metadata = sdfg_.metadata();
×
26
    std::string sdfg_name = sdfg_.name();
×
27
    std::string sdfg_file = metadata.at("sdfg_file");
×
28
    std::string arg_capture_path = metadata.at("arg_capture_path");
×
29
    std::string features_file = metadata.at("features_file");
×
30
    std::string opt_report_file = metadata.at("opt_report_file");
×
31

32
    std::string region_uuid = sdfg_name + "_" + std::to_string(node.element_id());
×
33

34
    // Create region id variable
35
    std::string region_id_var = sdfg_name + "_" + std::to_string(node.element_id()) + "_id";
×
36

37
    // Create metadata variable
38
    std::string metadata_var = sdfg_name + "_" + std::to_string(node.element_id()) + "_md";
×
39
    stream << "__daisy_metadata_t " << metadata_var << ";" << std::endl;
×
40

41
    // Source metadata
42
    auto& dbg_info = node.debug_info();
×
43
    stream << metadata_var << ".file_name = \"" << dbg_info.filename() << "\";" << std::endl;
×
44
    stream << metadata_var << ".function_name = \"" << dbg_info.function() << "\";" << std::endl;
×
45
    stream << metadata_var << ".line_begin = " << dbg_info.start_line() << ";" << std::endl;
×
46
    stream << metadata_var << ".line_end = " << dbg_info.end_line() << ";" << std::endl;
×
47
    stream << metadata_var << ".column_begin = " << dbg_info.start_column() << ";" << std::endl;
×
48
    stream << metadata_var << ".column_end = " << dbg_info.end_column() << ";" << std::endl;
×
49

50
    // Docc metadata
51
    stream << metadata_var << ".sdfg_name = \"" << sdfg_name << "\";" << std::endl;
×
52
    stream << metadata_var << ".sdfg_file = \"" << sdfg_file << "\";" << std::endl;
×
53
    stream << metadata_var << ".arg_capture_path = \"" << arg_capture_path << "\";" << std::endl;
×
54
    stream << metadata_var << ".features_file = \"" << features_file << "\";" << std::endl;
×
55
    stream << metadata_var << ".opt_report_file = \"" << opt_report_file << "\";" << std::endl;
×
NEW
56
    stream << metadata_var << ".element_id = " << info.element_id() << ";" << std::endl;
×
NEW
57
    stream << metadata_var << ".element_type = \"" << info.element_type().value() << "\";" << std::endl;
×
NEW
58
    stream << metadata_var << ".target_type = \"" << info.target_type().value() << "\";" << std::endl;
×
NEW
59
    stream << metadata_var << ".loopnest_index = " << info.loopnest_index() << ";" << std::endl;
×
UNCOV
60
    stream << metadata_var << ".region_uuid = \"" << region_uuid << "\";" << std::endl;
×
61

62
    // Initialize region
NEW
63
    switch (this->nodes_.at(&node)) {
×
64
        case InstrumentationEventType::CPU: {
NEW
65
            stream << "long long " << region_id_var << " = __daisy_instrumentation_init(&" << metadata_var
×
NEW
66
                   << ", __DAISY_EVENT_SET_CPU);" << std::endl;
×
NEW
67
            break;
×
68
        }
69
        case InstrumentationEventType::CUDA: {
NEW
70
            stream << "long long " << region_id_var << " = __daisy_instrumentation_init(&" << metadata_var
×
NEW
71
                   << ", __DAISY_EVENT_SET_CUDA);" << std::endl;
×
NEW
72
            break;
×
73
        }
74
        case InstrumentationEventType::NONE: {
NEW
75
            stream << "long long " << region_id_var << " = __daisy_instrumentation_init(&" << metadata_var
×
NEW
76
                   << ", __DAISY_EVENT_SET_NONE);" << std::endl;
×
NEW
77
            break;
×
78
        }
79
    }
80

81
    // Enter region
82
    stream << "__daisy_instrumentation_enter(" << region_id_var << ");" << std::endl;
×
83
}
×
84

85
void InstrumentationPlan::end_instrumentation(
×
86
    const Element& node, PrettyPrinter& stream, LanguageExtension& language_extension, const InstrumentationInfo& info
87
) const {
88
    std::string region_id_var = sdfg_.name() + "_" + std::to_string(node.element_id()) + "_id";
×
89

90
    // Exit region
91
    if (this->nodes_.at(&node) == InstrumentationEventType::CPU) {
×
92
        stream << "__daisy_instrumentation_exit(" << region_id_var << ");" << std::endl;
×
93
    } else {
×
94
        stream << "__daisy_instrumentation_exit(" << region_id_var << ");" << std::endl;
×
95
    }
96

NEW
97
    for (auto entry : info.metrics()) {
×
NEW
98
        stream << "__daisy_instrumentation_increment(" << region_id_var << ", \"" << entry.first << "\", "
×
NEW
99
               << entry.second << ");" << std::endl;
×
UNCOV
100
    }
×
101

102
    // Finalize region
103
    stream << "__daisy_instrumentation_finalize(" << region_id_var << ");" << std::endl;
×
104
}
×
105

106
std::unique_ptr<InstrumentationPlan> InstrumentationPlan::none(StructuredSDFG& sdfg) {
58✔
107
    return std::make_unique<InstrumentationPlan>(sdfg, std::unordered_map<const Element*, InstrumentationEventType>{});
58✔
UNCOV
108
}
×
109

110
std::unique_ptr<InstrumentationPlan> InstrumentationPlan::outermost_loops_plan(StructuredSDFG& sdfg) {
×
111
    analysis::AnalysisManager analysis_manager(sdfg);
×
112
    auto& loop_tree_analysis = analysis_manager.get<analysis::LoopAnalysis>();
×
113
    auto ols = loop_tree_analysis.outermost_loops();
×
114

NEW
115
    std::unordered_map<const Element*, InstrumentationEventType> nodes;
×
116
    for (size_t i = 0; i < ols.size(); i++) {
×
117
        auto& loop = ols[i];
×
118
        if (auto map_node = dynamic_cast<const structured_control_flow::Map*>(loop)) {
×
119
            if (map_node->schedule_type().value() == "CUDA") {
×
120
                nodes.insert({loop, InstrumentationEventType::CUDA});
×
121
                continue;
×
122
            }
123
        }
×
124
        nodes.insert({loop, InstrumentationEventType::CPU}); // Default to CPU if not CUDA
×
125
    }
×
126

NEW
127
    LibNodeFinder lib_node_finder(sdfg, analysis_manager);
×
NEW
128
    lib_node_finder.visit();
×
NEW
129
    for (auto& lib_node : lib_node_finder.get_lib_nodes_D2H()) {
×
NEW
130
        nodes.insert({lib_node, InstrumentationEventType::NONE});
×
131
    }
NEW
132
    for (auto& lib_node : lib_node_finder.get_lib_nodes_H2D()) {
×
NEW
133
        nodes.insert({lib_node, InstrumentationEventType::NONE});
×
134
    }
135

NEW
136
    std::cout << "Created instrumentation plan for " << nodes.size() << " nodes." << std::endl;
×
137

NEW
138
    return std::make_unique<InstrumentationPlan>(sdfg, nodes);
×
NEW
139
}
×
140

NEW
141
bool LibNodeFinder::accept(structured_control_flow::Block& node) {
×
NEW
142
    for (auto libnode : node.dataflow().library_nodes()) {
×
NEW
143
        if (libnode->code().value() == "CUDAD2HTransfer" || libnode->code().value() == "TTEnqueueRead") {
×
NEW
144
            lib_nodes_D2H.push_back(libnode);
×
NEW
145
        }
×
NEW
146
        if (libnode->code().value() == "CUDAH2DTransfer" || libnode->code().value() == "TTEnqueueWrite") {
×
NEW
147
            lib_nodes_H2D.push_back(libnode);
×
NEW
148
        }
×
149
    }
NEW
150
    return false;
×
UNCOV
151
}
×
152

153
} // namespace codegen
154
} // namespace sdfg
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc