Files
Raptor/src/PIM/Conversion/ONNXToSpatial/Patterns/Math/ConvGeometry.hpp
T
NiccoloN 942a9faa4f
Validate Operations / validate-operations (push) Waiting to run
second temp commit: i will soft-reset and recommit after next changes
2026-08-03 11:07:28 +02:00

151 lines
4.0 KiB
C++

#pragma once
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/Value.h"
#include "src/Accelerators/PIM/Conversion/ONNXToSpatial/Common/ContractionPlanning.hpp"
#include "src/Accelerators/PIM/Dialect/Spatial/SpatialTargetInfo.hpp"
#include "src/Accelerators/PIM/Dialect/Spatial/SpatialOps.hpp"
#include <cstdint>
namespace mlir {
class Operation;
} // namespace mlir
namespace onnx_mlir {
struct ConvProblem {
mlir::RankedTensorType xType;
mlir::RankedTensorType wType;
mlir::RankedTensorType outType;
int64_t batchSize;
int64_t numChannelsIn;
int64_t xHeight;
int64_t xWidth;
int64_t numChannelsOut;
int64_t wHeight;
int64_t wWidth;
int64_t outHeight;
int64_t outWidth;
int64_t group;
int64_t numChannelsInPerGroup;
int64_t numChannelsOutPerGroup;
int64_t padHeightBegin;
int64_t padHeightEnd;
int64_t padWidthBegin;
int64_t padWidthEnd;
int64_t strideHeight;
int64_t strideWidth;
int64_t dilationHeight;
int64_t dilationWidth;
bool hasBias;
bool isDepthwise = false;
bool isGrouped = false;
bool isPointwise = false;
};
struct ConvLoweringState : ConvProblem {
mlir::Operation* diagnosticAnchor = nullptr;
mlir::Value x;
mlir::Value w;
mlir::Value b;
const spatial::SpatialTargetInfo* target = nullptr;
const spatial::SpatialTargetInfo& targetInfo() const { return *target; }
};
struct ConvGeometry {
int64_t batchSize;
int64_t numChannelsIn;
int64_t xHeight;
int64_t xWidth;
int64_t numChannelsOut;
int64_t wHeight;
int64_t wWidth;
int64_t outHeight;
int64_t outWidth;
int64_t group;
int64_t numChannelsInPerGroup;
int64_t numChannelsOutPerGroup;
int64_t k;
int64_t c;
int64_t p;
int64_t xbarSize;
int64_t matrixUnitsPerProcessor;
int64_t pack;
uint64_t im2colElements;
bool hasBias;
bool isDepthwise;
};
struct RowInterval {
int64_t begin = 0;
int64_t end = 0;
};
struct ConvRowDemand {
RowInterval outputRows;
RowInterval neededInputRows;
RowInterval acquiredInputRows;
int64_t topHaloRows = 0;
int64_t bottomHaloRows = 0;
};
enum class ConvMaterializationKind : uint8_t {
StructuredDepthwise,
PointwiseContraction,
PackedIm2Col,
StreamedPatch,
StreamedPacked,
OutputChannelTiled,
InputKTiled,
Tiled2D,
};
struct ConvPlan {
ConvGeometry geometry;
spatial::ConvLoweringStrategy strategy = spatial::ConvLoweringStrategy::Auto;
ConvMaterializationKind materializationKind = ConvMaterializationKind::PackedIm2Col;
int64_t laneCount = 0;
int64_t mvmCount = 0;
int64_t vectorCount = 0;
int64_t reductionCount = 0;
uint64_t weightElements = 0;
uint64_t scratchElements = 0;
uint64_t materializationElements = 0;
uint64_t communicationElements = 0;
spatial::PhysicalLayout resultLayout = spatial::PhysicalLayout::DenseNCHW;
bool consumesRowStrip = false;
bool producesRowStrip = false;
bool requiresInputMaterialization = false;
bool requiresOutputMaterialization = false;
bool usesContraction = false;
bool hasContractionPlan = false;
ContractionPlan contraction;
};
bool isDepthwiseConv(int64_t group, int64_t numChannelsIn, int64_t numChannelsOut, int64_t numChannelsInPerGroup);
void classifyConvProblem(ConvProblem& problem);
ConvGeometry buildConvGeometry(const ConvProblem& problem,
const spatial::SpatialTargetInfo& target);
mlir::FailureOr<ConvPlan> makeConvPlan(const ConvProblem& problem,
spatial::ConvLoweringStrategy strategy,
const spatial::SpatialTargetInfo& target);
llvm::SmallVector<ConvPlan, 8> buildConvPlanCandidates(
const ConvProblem& problem, const spatial::SpatialTargetInfo& target);
uint64_t chooseStreamChunkPositions(const ConvGeometry& geo,
int64_t packFactor,
const spatial::SpatialTargetInfo& target);
RowInterval computeConvInputRowsForOutputRows(RowInterval outputRows, const ConvProblem& problem);
ConvRowDemand buildConvRowDemand(RowInterval outputRows, const ConvProblem& problem);
} // namespace onnx_mlir