Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

164 lines
6.2 KiB
C++

// Copyright Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include <rocRoller/KernelGraph/KernelGraph.hpp>
#include <rocRoller/KernelGraph/TopoVisitor.hpp>
#include <rocRoller/KernelGraph/Utils.hpp>
namespace rocRoller
{
namespace KernelGraph
{
ConstraintStatus NoDanglingMappings(const KernelGraph& k)
{
TIMER(t, "Constraint::NoDanglingMappings");
ConstraintStatus retval;
for(auto control : k.mapper.getControls())
{
if(!k.control.exists(control))
{
retval.combine(false,
concatenate("Dangling Mapping: Control node ",
control,
" does not exist."));
}
for(auto& connection : k.mapper.getConnections(control))
{
if(!k.coordinates.exists(connection.coordinate))
{
retval.combine(false,
concatenate("Dangling Mapping: Control node ",
control,
" maps to coordinate node ",
connection.coordinate,
", which doesn't exist."));
}
}
}
return retval;
}
ConstraintStatus SingleControlRoot(const KernelGraph& k)
{
TIMER(t, "Constraint::SingleControlRoot");
ConstraintStatus retval;
auto controlRoots = k.control.roots().to<std::vector>();
if(controlRoots.size() != 1)
{
std::ostringstream msg;
msg << "Single Control Root: Control graph must have exactly one root node, not "
<< controlRoots.size() << ". Nodes: (";
streamJoin(msg, controlRoots, ", ");
msg << ")";
retval.combine(false, msg.str());
}
return retval;
}
ConstraintStatus NoRedundantSetCoordinates(const KernelGraph& k)
{
TIMER(t, "Constraint::NoRedundantSetCoordinates");
using namespace ControlGraph;
using GD = rocRoller::Graph::Direction;
ConstraintStatus retval;
for(const auto& op : k.control.leaves())
{
std::set<std::pair<int, int>> existingSetCoordData;
int tag = op;
while(true)
{
auto parent = only(k.control.getInputNodeIndices<Body>(tag));
if(!parent)
break;
tag = parent.value();
auto setCoord = k.control.get<SetCoordinate>(tag);
if(!setCoord)
break;
auto valueExpr = setCoord.value().value;
AssertFatal(evaluationTimes(valueExpr)[Expression::EvaluationTime::Translate],
"SetCoordinate::value should be a literal.");
auto value = getUnsignedInt(evaluate(valueExpr));
for(auto const& dst : k.mapper.getConnections(tag))
{
auto insertResult = existingSetCoordData.insert({dst.coordinate, value});
if(!insertResult.second)
{
auto setCoordData = insertResult.first;
retval.combine(false,
concatenate("Redundant SetCoordinate for node ",
op,
": SetCoordinate ",
tag,
" with target coordinate ",
setCoordData->first,
" and value ",
setCoordData->second));
}
}
}
}
return retval;
}
struct WalkableControlGraphVisitor
: public TopoControlGraphVisitor<WalkableControlGraphVisitor>
{
using TopoControlGraphVisitor<WalkableControlGraphVisitor>::TopoControlGraphVisitor;
ConstraintStatus status;
std::set<int> visitedNodes;
void operator()(int nodeIdx, auto const& node)
{
visitedNodes.insert(nodeIdx);
}
virtual void errorCondition(std::string const& message) override
{
status.combine(false, message);
}
};
ConstraintStatus WalkableControlGraph(KernelGraph const& k)
{
TIMER(t, "Constraint::WalkableControlGraph");
WalkableControlGraphVisitor visitor(k);
visitor.walk();
auto allNodes = k.control.getNodes().to<std::set>();
if(visitor.visitedNodes != allNodes)
{
std::set<int> nonVisitedNodes;
std::set_difference(allNodes.begin(),
allNodes.end(),
visitor.visitedNodes.begin(),
visitor.visitedNodes.end(),
std::inserter(nonVisitedNodes, nonVisitedNodes.end()));
std::ostringstream msg;
msg << "Not all nodes were visited! Missing: ";
streamJoin(msg, nonVisitedNodes, ", ");
msg << "\n All nodes: ";
streamJoin(msg, allNodes, ", ");
msg << "\n Visited nodes: ";
streamJoin(msg, visitor.visitedNodes, ", ");
visitor.status.combine(false, msg.str());
}
return visitor.status;
}
}
}