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

daisytuner / docc / 24215882789

09 Apr 2026 10:12PM UTC coverage: 64.375% (-0.007%) from 64.382%
24215882789

Pull #668

github

web-flow
Merge 6f7f28e8f into bb3981349
Pull Request #668: Offload Memset to GPU

249 of 381 new or added lines in 18 files covered. (65.35%)

189 existing lines in 2 files now uncovered.

29942 of 46512 relevant lines covered (64.37%)

584.42 hits per line

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

39.53
/opt/src/passes/offloading/rocm_library_node_rewriter_pass.cpp
1
#include "sdfg/passes/offloading/rocm_library_node_rewriter_pass.h"
2
#include <optional>
3

4
#include "sdfg/data_flow/library_nodes/math/math.h"
5
#include "sdfg/data_flow/library_nodes/stdlib/memset.h"
6
#include "sdfg/symbolic/symbolic.h"
7
#include "sdfg/targets/rocm/rocm.h"
8

9
namespace sdfg {
10
namespace rocm {
11

12
std::optional<data_flow::ImplementationType> RocmLibraryNodeRewriter::
13
    try_library_node_implementation(const data_flow::LibraryNode& lib_node, types::PrimitiveType data_type) {
×
14
    if (data_type == types::PrimitiveType::Float || data_type == types::PrimitiveType::Double) {
×
15
        if (lib_node.code() == math::blas::LibraryNodeType_GEMM.value()) {
×
16
            auto& gemm_node = static_cast<const math::blas::GEMMNode&>(lib_node);
×
17
            return try_rocm_gemm_node_implementation(gemm_node, data_type);
×
18
        } else if (lib_node.code() == math::blas::LibraryNodeType_DOT.value()) {
×
NEW
19
            return rocm::ImplementationType_ROCMWithTransfers;
×
20
        } else {
×
21
            return std::nullopt;
×
22
        }
×
23
    } else {
×
24
        return std::nullopt;
×
25
    }
×
26
}
×
27

28
std::optional<data_flow::ImplementationType> RocmLibraryNodeRewriter::
29
    try_rocm_gemm_node_implementation(const math::blas::GEMMNode& gemm_node, types::PrimitiveType data_type) {
×
30
    // Heuristic: Avoid using ROCm BLAS for very small matrix multiplications
31
    if (symbolic::eq(gemm_node.m(), symbolic::one()) || symbolic::eq(gemm_node.n(), symbolic::one()) ||
×
32
        symbolic::eq(gemm_node.k(), symbolic::one())) {
×
33
        return std::nullopt;
×
34
    }
×
NEW
35
    return rocm::ImplementationType_ROCMWithTransfers;
×
NEW
36
}
×
37

38
std::optional<data_flow::ImplementationType> RocmLibraryNodeRewriter::
39
    try_memset_implementation(const ::sdfg::stdlib::MemsetNode& memset_node) {
2✔
40
    return rocm::ImplementationType_ROCMWithTransfers;
2✔
41
}
2✔
42

43
RocmLibraryNodeRewriter::
44
    RocmLibraryNodeRewriter(builder::StructuredSDFGBuilder& builder, analysis::AnalysisManager& analysis_manager)
45
    : visitor::StructuredSDFGVisitor(builder, analysis_manager) {}
2✔
46

47
bool RocmLibraryNodeRewriter::accept(structured_control_flow::Block& node) {
2✔
48
    auto& dataflow = node.dataflow();
2✔
49
    for (auto& library_node : dataflow.nodes()) {
4✔
50
        if (auto lib_node = dynamic_cast<math::blas::BLASNode*>(&library_node)) {
4✔
51
            auto implType = try_library_node_implementation(*lib_node, lib_node->scalar_primitive());
×
52

53
            if (implType) {
×
54
                lib_node->implementation_type() = implType.value();
×
55
            }
×
56
        }
×
57
        if (auto memset_node = dynamic_cast<::sdfg::stdlib::MemsetNode*>(&library_node)) {
4✔
58
            auto implType = try_memset_implementation(*memset_node);
2✔
59
            if (implType) {
2✔
60
                memset_node->implementation_type() = implType.value();
2✔
61
            }
2✔
62
        }
2✔
63
    }
4✔
64
    return false;
2✔
65
}
2✔
66

67
} // namespace rocm
68
} // 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