From 0fa10b40745a4e22ae3efc79e4eeed502b26541a Mon Sep 17 00:00:00 2001 From: NiccoloN Date: Fri, 5 Jun 2026 13:35:27 +0200 Subject: [PATCH] better Conv.cpp and fixed broken conv op validation test --- .../ONNXToSpatial/Patterns/Math/Conv.cpp | 1489 +++++++++++------ .../conv_grouped_many_groups.onnx | Bin 262355 -> 65747 bytes validation/operations/gen_tests.py | 2 +- 3 files changed, 1001 insertions(+), 490 deletions(-) diff --git a/src/PIM/Conversion/ONNXToSpatial/Patterns/Math/Conv.cpp b/src/PIM/Conversion/ONNXToSpatial/Patterns/Math/Conv.cpp index 0954a5c..d4dad33 100644 --- a/src/PIM/Conversion/ONNXToSpatial/Patterns/Math/Conv.cpp +++ b/src/PIM/Conversion/ONNXToSpatial/Patterns/Math/Conv.cpp @@ -7,7 +7,9 @@ #include "llvm/ADT/SmallVector.h" #include +#include +#include "src/Accelerators/PIM/Common/IR/AffineUtils.hpp" #include "src/Accelerators/PIM/Common/IR/LoopUtils.hpp" #include "src/Accelerators/PIM/Common/Support/Diagnostics.hpp" #include "src/Accelerators/PIM/Compiler/PimCompilerOptions.hpp" @@ -29,6 +31,36 @@ struct ConvToGemm : OpConversionPattern { ConversionPatternRewriter& rewriter) const override; }; +struct ConvLoweringState { + Value x; + Value w; + Value b; + RankedTensorType xType; + RankedTensorType wType; + 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; +}; + static Value expandBiasIfNeeded(Value bias, ConversionPatternRewriter& rewriter, Location loc) { auto biasType = cast(bias.getType()); if (biasType.getRank() != 1) @@ -44,58 +76,621 @@ static Value expandBiasIfNeeded(Value bias, ConversionPatternRewriter& rewriter, }); } -static Value createPaddedRows(Value tensorValue, - RankedTensorType tensorType, - int64_t paddedRows, - ConversionPatternRewriter& rewriter, - Location loc) { - if (tensorType.getDimSize(0) == paddedRows) - return tensorValue; +static bool +isDepthwiseConv(int64_t group, int64_t numChannelsIn, int64_t numChannelsOut, int64_t numChannelsInPerGroup) { + return group == numChannelsIn && numChannelsInPerGroup == 1 && numChannelsOut % group == 0; +} - auto paddedType = RankedTensorType::get( - {paddedRows, tensorType.getDimSize(1)}, tensorType.getElementType(), tensorType.getEncoding()); - SmallVector lowPads = {rewriter.getIndexAttr(0), rewriter.getIndexAttr(0)}; - SmallVector highPads = {rewriter.getIndexAttr(paddedRows - tensorType.getDimSize(0)), - rewriter.getIndexAttr(0)}; - auto padOp = tensor::PadOp::create(rewriter, loc, paddedType, tensorValue, lowPads, highPads); +static int64_t findLargestDivisorAtMost(int64_t value, int64_t limit) { + assert(value > 0 && "expected positive value"); + limit = std::min(value, limit); + for (int64_t candidate = limit; candidate >= 1; --candidate) + if (value % candidate == 0) + return candidate; + return 1; +} + +static Value createZeroPaddedTensor(Value value, + RankedTensorType resultType, + ArrayRef lowPadValues, + ArrayRef highPadValues, + ConversionPatternRewriter& rewriter, + Location loc) { + auto valueType = cast(value.getType()); + if (valueType == resultType) + return value; + + SmallVector lowPads; + SmallVector highPads; + lowPads.reserve(lowPadValues.size()); + highPads.reserve(highPadValues.size()); + for (auto lowPad : lowPadValues) + lowPads.push_back(rewriter.getIndexAttr(lowPad)); + for (auto highPad : highPadValues) + highPads.push_back(rewriter.getIndexAttr(highPad)); + + auto padOp = tensor::PadOp::create(rewriter, loc, resultType, value, lowPads, highPads); auto* padBlock = new Block(); - for (int i = 0; i < 2; ++i) + for (int64_t dim = 0, rank = resultType.getRank(); dim < rank; ++dim) padBlock->addArgument(rewriter.getIndexType(), loc); padOp.getRegion().push_back(padBlock); rewriter.setInsertionPointToStart(padBlock); auto zero = getOrCreateConstant( - rewriter, padOp.getOperation(), rewriter.getZeroAttr(tensorType.getElementType()), tensorType.getElementType()); + rewriter, padOp.getOperation(), rewriter.getZeroAttr(resultType.getElementType()), resultType.getElementType()); tensor::YieldOp::create(rewriter, loc, zero); rewriter.setInsertionPointAfter(padOp); return padOp.getResult(); } +static Value affineAddConst( + ConversionPatternRewriter& rewriter, Location loc, Value value, int64_t offset, Operation* constantAnchor) { + if (offset == 0) + return value; + + MLIRContext* context = rewriter.getContext(); + AffineExpr d0 = getAffineDimExpr(0, context); + return createOrFoldAffineApply(rewriter, loc, d0 + offset, ValueRange {value}, constantAnchor); +} + +static Value createConvInputPatch(Value input, + RankedTensorType patchType, + Value batchIndex, + Value channelOffset, + Value inputHeightOffset, + Value inputWidthOffset, + int64_t dilationHeight, + int64_t dilationWidth, + ConversionPatternRewriter& rewriter, + Location loc) { + const int64_t patchChannels = patchType.getDimSize(1); + const int64_t kernelHeight = patchType.getDimSize(2); + const int64_t kernelWidth = patchType.getDimSize(3); + if (dilationHeight == 1 && dilationWidth == 1) { + SmallVector offsets {batchIndex, channelOffset, inputHeightOffset, inputWidthOffset}; + SmallVector sizes {rewriter.getIndexAttr(1), + rewriter.getIndexAttr(patchChannels), + rewriter.getIndexAttr(kernelHeight), + rewriter.getIndexAttr(kernelWidth)}; + return tensor::ExtractSliceOp::create(rewriter, loc, patchType, input, offsets, sizes, getUnitStrides(rewriter, 4)); + } + + Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); + auto elementType = patchType.getElementType(); + auto pixelType = RankedTensorType::get({1, patchChannels, 1, 1}, elementType, patchType.getEncoding()); + Value patch = tensor::EmptyOp::create(rewriter, loc, patchType.getShape(), elementType); + for (int64_t kernelH = 0; kernelH < kernelHeight; ++kernelH) { + Value sourceHeightOffset = affineAddConst(rewriter, loc, inputHeightOffset, kernelH * dilationHeight, anchorOp); + for (int64_t kernelW = 0; kernelW < kernelWidth; ++kernelW) { + Value sourceWidthOffset = affineAddConst(rewriter, loc, inputWidthOffset, kernelW * dilationWidth, anchorOp); + SmallVector sourceOffsets {batchIndex, channelOffset, sourceHeightOffset, sourceWidthOffset}; + SmallVector sourceSizes {rewriter.getIndexAttr(1), + rewriter.getIndexAttr(patchChannels), + rewriter.getIndexAttr(1), + rewriter.getIndexAttr(1)}; + Value sourcePixel = tensor::ExtractSliceOp::create( + rewriter, loc, pixelType, input, sourceOffsets, sourceSizes, getUnitStrides(rewriter, 4)); + SmallVector targetOffsets { + rewriter.getIndexAttr(0), rewriter.getIndexAttr(0), rewriter.getIndexAttr(kernelH), rewriter.getIndexAttr(kernelW)}; + patch = tensor::InsertSliceOp::create( + rewriter, loc, sourcePixel, patch, targetOffsets, sourceSizes, getUnitStrides(rewriter, 4)); + } + } + return patch; +} + +static Value createCollectedConvOutput(ValueRange gemmRows, + Type convType, + RankedTensorType gemmOutType, + RankedTensorType nhwcType, + RankedTensorType outType, + int64_t numPatches, + int64_t numChannelsOut, + int64_t packFactor, + ConversionPatternRewriter& rewriter, + Location loc); + +namespace depthwise { + +struct Tiling { + int64_t outputMultiplier; + int64_t kernelElements; + int64_t channelsPerTile; + int64_t tileInputRows; + int64_t tileOutputChannels; + int64_t numChannelTiles; + int64_t spatialPatchesPerBatch; + int64_t totalPatches; +}; + +static std::optional computeTiling(int64_t batchSize, + int64_t numChannelsIn, + int64_t numChannelsOut, + int64_t wHeight, + int64_t wWidth, + int64_t outHeight, + int64_t outWidth) { + const int64_t kernelElements = wHeight * wWidth; + const int64_t outputMultiplier = numChannelsOut / numChannelsIn; + const int64_t xbarDim = static_cast(crossbarSize.getValue()); + if (kernelElements <= 0 || outputMultiplier <= 0 || kernelElements > xbarDim || outputMultiplier > xbarDim) + return std::nullopt; + + const int64_t maxChannelsPerTile = std::min(xbarDim / kernelElements, xbarDim / outputMultiplier); + if (maxChannelsPerTile <= 0) + return std::nullopt; + + const int64_t channelsPerTile = findLargestDivisorAtMost(numChannelsIn, maxChannelsPerTile); + const int64_t tileInputRows = channelsPerTile * kernelElements; + const int64_t tileOutputChannels = channelsPerTile * outputMultiplier; + if (tileInputRows > xbarDim || tileOutputChannels > xbarDim) + return std::nullopt; + + return Tiling { + outputMultiplier, + kernelElements, + channelsPerTile, + tileInputRows, + tileOutputChannels, + numChannelsIn / channelsPerTile, + outHeight * outWidth, + batchSize * outHeight * outWidth, + }; +} + +static Value buildPackedWeights(DenseElementsAttr wDenseAttr, + RankedTensorType wType, + const Tiling& tiling, + ConversionPatternRewriter& rewriter, + Location loc) { + auto packedWeightType = RankedTensorType::get( + {tiling.numChannelTiles, tiling.tileInputRows, tiling.tileOutputChannels}, wType.getElementType()); + SmallVector packedValues(packedWeightType.getNumElements(), + cast(rewriter.getZeroAttr(wType.getElementType()))); + SmallVector sourceValues(wDenseAttr.getValues()); + + for (int64_t tileIndex = 0; tileIndex < tiling.numChannelTiles; ++tileIndex) { + const int64_t channelBase = tileIndex * tiling.channelsPerTile; + for (int64_t localChannel = 0; localChannel < tiling.channelsPerTile; ++localChannel) { + const int64_t globalChannel = channelBase + localChannel; + for (int64_t kernelIndex = 0; kernelIndex < tiling.kernelElements; ++kernelIndex) { + const int64_t kernelH = kernelIndex / wType.getDimSize(3); + const int64_t kernelW = kernelIndex % wType.getDimSize(3); + const int64_t targetRow = localChannel * tiling.kernelElements + kernelIndex; + for (int64_t multiplierIndex = 0; multiplierIndex < tiling.outputMultiplier; ++multiplierIndex) { + const int64_t globalOutChannel = globalChannel * tiling.outputMultiplier + multiplierIndex; + const int64_t sourceFlatIndex = + ((globalOutChannel * wType.getDimSize(1) * wType.getDimSize(2)) + kernelH) * wType.getDimSize(3) + kernelW; + const int64_t targetCol = localChannel * tiling.outputMultiplier + multiplierIndex; + const int64_t targetFlatIndex = + ((tileIndex * tiling.tileInputRows) + targetRow) * tiling.tileOutputChannels + targetCol; + packedValues[targetFlatIndex] = sourceValues[sourceFlatIndex]; + } + } + } + } + + auto packedAttr = DenseElementsAttr::get(packedWeightType, packedValues); + return getOrCreateConstant(rewriter, rewriter.getInsertionBlock()->getParentOp(), packedAttr, packedWeightType); +} + +static Value createPaddedInput(Value input, + RankedTensorType inputType, + int64_t padHeightBegin, + int64_t padHeightEnd, + int64_t padWidthBegin, + int64_t padWidthEnd, + ConversionPatternRewriter& rewriter, + Location loc) { + if (padHeightBegin == 0 && padHeightEnd == 0 && padWidthBegin == 0 && padWidthEnd == 0) + return input; + + auto paddedInputType = RankedTensorType::get({inputType.getDimSize(0), + inputType.getDimSize(1), + inputType.getDimSize(2) + padHeightBegin + padHeightEnd, + inputType.getDimSize(3) + padWidthBegin + padWidthEnd}, + inputType.getElementType()); + auto computeOp = createSpatCompute<1>(rewriter, loc, TypeRange {paddedInputType}, {}, input, [&](Value computeInput) { + Value padded = createZeroPaddedTensor(computeInput, + paddedInputType, + {0, 0, padHeightBegin, padWidthBegin}, + {0, 0, padHeightEnd, padWidthEnd}, + rewriter, + loc); + spatial::SpatYieldOp::create(rewriter, loc, padded); + }); + return computeOp.getResult(0); +} + +static Value createInputTile(Value input, + Value patchIndex, + Value channelTileIndex, + RankedTensorType inputTileType, + const Tiling& tiling, + int64_t strideHeight, + int64_t strideWidth, + int64_t dilationHeight, + int64_t dilationWidth, + int64_t outWidth, + ConversionPatternRewriter& rewriter, + Location loc) { + Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); + Value batchIndex = affineFloorDivConst(rewriter, loc, patchIndex, tiling.spatialPatchesPerBatch, anchorOp); + Value batchPatchIndex = affineModConst(rewriter, loc, patchIndex, tiling.spatialPatchesPerBatch, anchorOp); + Value outHeightIndex = affineFloorDivConst(rewriter, loc, batchPatchIndex, outWidth, anchorOp); + Value outWidthIndex = affineModConst(rewriter, loc, batchPatchIndex, outWidth, anchorOp); + Value inputHeightOffset = + strideHeight == 1 ? outHeightIndex : affineMulConst(rewriter, loc, outHeightIndex, strideHeight, anchorOp); + Value inputWidthOffset = + strideWidth == 1 ? outWidthIndex : affineMulConst(rewriter, loc, outWidthIndex, strideWidth, anchorOp); + Value channelOffset = tiling.channelsPerTile == 1 + ? channelTileIndex + : affineMulConst(rewriter, loc, channelTileIndex, tiling.channelsPerTile, anchorOp); + Value tile4D = createConvInputPatch(input, + inputTileType, + batchIndex, + channelOffset, + inputHeightOffset, + inputWidthOffset, + dilationHeight, + dilationWidth, + rewriter, + loc); + auto collapsedType = RankedTensorType::get({1, tiling.tileInputRows}, inputTileType.getElementType()); + return tensor::CollapseShapeOp::create(rewriter, + loc, + collapsedType, + tile4D, + SmallVector { + {0}, + {1, 2, 3} + }); +} + +static Value createWeightTile(Value packedWeights, + Value channelTileIndex, + RankedTensorType packedWeightType, + const Tiling& tiling, + ConversionPatternRewriter& rewriter, + Location loc) { + SmallVector offsets {channelTileIndex, rewriter.getIndexAttr(0), rewriter.getIndexAttr(0)}; + SmallVector sizes {rewriter.getIndexAttr(1), + rewriter.getIndexAttr(tiling.tileInputRows), + rewriter.getIndexAttr(tiling.tileOutputChannels)}; + auto sliceType = + RankedTensorType::get({1, tiling.tileInputRows, tiling.tileOutputChannels}, packedWeightType.getElementType()); + Value slice = tensor::ExtractSliceOp::create( + rewriter, loc, sliceType, packedWeights, offsets, sizes, getUnitStrides(rewriter, 3)); + auto collapsedType = + RankedTensorType::get({tiling.tileInputRows, tiling.tileOutputChannels}, packedWeightType.getElementType()); + return tensor::CollapseShapeOp::create(rewriter, + loc, + collapsedType, + slice, + SmallVector { + {0, 1}, + {2} + }); +} + +static Value createBiasTile( + Value bias, Value channelTileIndex, const Tiling& tiling, ConversionPatternRewriter& rewriter, Location loc) { + auto biasType = cast(bias.getType()); + auto biasTileType = RankedTensorType::get({1, tiling.tileOutputChannels}, biasType.getElementType()); + Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); + Value channelOffset = tiling.tileOutputChannels == 1 + ? channelTileIndex + : affineMulConst(rewriter, loc, channelTileIndex, tiling.tileOutputChannels, anchorOp); + SmallVector offsets {rewriter.getIndexAttr(0), channelOffset}; + SmallVector sizes {rewriter.getIndexAttr(1), rewriter.getIndexAttr(tiling.tileOutputChannels)}; + return tensor::ExtractSliceOp::create(rewriter, loc, biasTileType, bias, offsets, sizes, getUnitStrides(rewriter, 2)); +} + +static Value insertOutputTile(Value rowTile, + Value rowAccumulator, + Value channelTileIndex, + const Tiling& tiling, + ConversionPatternRewriter& rewriter, + Location loc) { + Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); + Value channelOffset = tiling.tileOutputChannels == 1 + ? channelTileIndex + : affineMulConst(rewriter, loc, channelTileIndex, tiling.tileOutputChannels, anchorOp); + SmallVector offsets {rewriter.getIndexAttr(0), channelOffset}; + SmallVector sizes {rewriter.getIndexAttr(1), rewriter.getIndexAttr(tiling.tileOutputChannels)}; + return tensor::InsertSliceOp::create( + rewriter, loc, rowTile, rowAccumulator, offsets, sizes, getUnitStrides(rewriter, 2)); +} + +static FailureOr reconstructDepthwiseGemmRows(Value pieces, + RankedTensorType piecesType, + RankedTensorType gemmOutType, + const Tiling& tiling, + ConversionPatternRewriter& rewriter, + Location loc) { + auto collectedOp = createSpatCompute<1>(rewriter, loc, TypeRange {gemmOutType}, {}, pieces, [&](Value piecesArg) { + auto rowType = RankedTensorType::get({1, gemmOutType.getDimSize(1)}, gemmOutType.getElementType()); + Value outputInit = tensor::EmptyOp::create(rewriter, loc, gemmOutType.getShape(), gemmOutType.getElementType()); + Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); + Value c0 = getOrCreateIndexConstant(rewriter, anchorOp, 0); + Value c1 = getOrCreateIndexConstant(rewriter, anchorOp, 1); + Value cNumPatches = getOrCreateIndexConstant(rewriter, anchorOp, tiling.totalPatches); + Value cNumChannelTiles = getOrCreateIndexConstant(rewriter, anchorOp, tiling.numChannelTiles); + + auto patchLoop = buildNormalizedScfFor( + rewriter, + loc, + c0, + cNumPatches, + c1, + ValueRange {outputInit}, + [&](OpBuilder&, + Location nestedLoc, + Value patchIndex, + ValueRange patchIterArgs, + SmallVectorImpl& patchYielded) { + Value outputAcc = patchIterArgs.front(); + Value rowInit = tensor::EmptyOp::create(rewriter, nestedLoc, rowType.getShape(), rowType.getElementType()); + auto tileLoop = buildNormalizedScfFor( + rewriter, + nestedLoc, + c0, + cNumChannelTiles, + c1, + ValueRange {rowInit}, + [&](OpBuilder&, + Location tileLoc, + Value channelTileIndex, + ValueRange tileIterArgs, + SmallVectorImpl& tileYielded) { + Value rowAcc = tileIterArgs.front(); + MLIRContext* context = rewriter.getContext(); + AffineExpr d0 = getAffineDimExpr(0, context); + AffineExpr d1 = getAffineDimExpr(1, context); + Value laneIndex = createOrFoldAffineApply( + rewriter, tileLoc, (d0 * tiling.totalPatches) + d1, ValueRange {channelTileIndex, patchIndex}, anchorOp); + auto rowTileType = RankedTensorType::get({1, tiling.tileOutputChannels}, piecesType.getElementType()); + SmallVector pieceOffsets {laneIndex, rewriter.getIndexAttr(0)}; + SmallVector pieceSizes {rewriter.getIndexAttr(1), + rewriter.getIndexAttr(tiling.tileOutputChannels)}; + Value rowTile = tensor::ExtractSliceOp::create( + rewriter, tileLoc, rowTileType, piecesArg, pieceOffsets, pieceSizes, getUnitStrides(rewriter, 2)); + Value rowNext = insertOutputTile(rowTile, rowAcc, channelTileIndex, tiling, rewriter, tileLoc); + tileYielded.push_back(rowNext); + return success(); + }); + if (failed(tileLoop)) + return failure(); + + SmallVector rowOffsets {patchIndex, rewriter.getIndexAttr(0)}; + SmallVector rowSizes {rewriter.getIndexAttr(1), rewriter.getIndexAttr(gemmOutType.getDimSize(1))}; + Value outputNext = tensor::InsertSliceOp::create(rewriter, + nestedLoc, + tileLoop->results.front(), + outputAcc, + rowOffsets, + rowSizes, + getUnitStrides(rewriter, 2)) + .getResult(); + patchYielded.push_back(outputNext); + return success(); + }); + if (failed(patchLoop)) + return failure(); + + spatial::SpatYieldOp::create(rewriter, loc, patchLoop->results.front()); + return success(); + }); + if (failed(collectedOp)) + return failure(); + return collectedOp->getResult(0); +} + +static bool canUseStructuredRewrite(const ConvLoweringState& state) { + if (!getHostConstDenseElementsAttr(state.w)) + return false; + + if (!computeTiling(state.batchSize, + state.numChannelsIn, + state.numChannelsOut, + state.wHeight, + state.wWidth, + state.outHeight, + state.outWidth)) { + return false; + } + + if (isa(state.b.getDefiningOp())) + return true; + + auto biasType = dyn_cast(state.b.getType()); + if (!biasType) + return false; + if (biasType.getRank() == 1) + return biasType.getDimSize(0) == state.numChannelsOut; + if (biasType.getRank() != 2) + return false; + return biasType.getDimSize(0) == 1 && biasType.getDimSize(1) == state.numChannelsOut; +} + +static FailureOr +rewriteConv(ONNXConvOp convOp, const ConvLoweringState& state, ConversionPatternRewriter& rewriter, Location loc) { + auto wDenseAttr = getHostConstDenseElementsAttr(state.w); + if (!wDenseAttr) { + convOp.emitOpError("requires constant-derived weights for structured depthwise Spatial lowering"); + return failure(); + } + + auto tiling = computeTiling(state.xType.getDimSize(0), + state.xType.getDimSize(1), + state.outType.getDimSize(1), + state.wType.getDimSize(2), + state.wType.getDimSize(3), + state.outType.getDimSize(2), + state.outType.getDimSize(3)); + if (!tiling) { + convOp.emitOpError("failed to derive a structured depthwise tiling that fits Spatial weighted VMM lowering"); + return failure(); + } + + Value paddedInput = createPaddedInput(state.x, + state.xType, + state.padHeightBegin, + state.padHeightEnd, + state.padWidthBegin, + state.padWidthEnd, + rewriter, + loc); + Value packedWeights = buildPackedWeights(wDenseAttr, state.wType, *tiling, rewriter, loc); + + Value expandedBias; + SmallVector batchInputs {paddedInput}; + if (!isa(state.b.getDefiningOp())) { + expandedBias = expandBiasIfNeeded(state.b, rewriter, loc); + auto biasType = dyn_cast(expandedBias.getType()); + if (!biasType || biasType.getRank() != 2 || biasType.getDimSize(0) != 1 + || biasType.getDimSize(1) != state.outType.getDimSize(1)) { + convOp.emitOpError("requires bias sliceable as tensor<1xCout> for structured depthwise Spatial lowering"); + return failure(); + } + batchInputs.push_back(expandedBias); + } + + auto gemmOutType = + RankedTensorType::get({tiling->totalPatches, state.outType.getDimSize(1)}, state.outType.getElementType()); + auto piecesType = RankedTensorType::get({tiling->totalPatches * tiling->numChannelTiles, tiling->tileOutputChannels}, + state.outType.getElementType()); + auto paddedInputType = cast(paddedInput.getType()); + auto inputTileType = + RankedTensorType::get({1, tiling->channelsPerTile, state.wType.getDimSize(2), state.wType.getDimSize(3)}, + paddedInputType.getElementType()); + + auto batchOp = createSpatComputeBatch( + rewriter, + loc, + TypeRange {piecesType}, + tiling->totalPatches * tiling->numChannelTiles, + ValueRange {packedWeights}, + batchInputs, + [&](detail::SpatComputeBatchBodyArgs args) { + Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); + Value patchIndex = affineModConst(rewriter, loc, args.lane, tiling->totalPatches, anchorOp); + Value channelTileIndex = affineFloorDivConst(rewriter, loc, args.lane, tiling->totalPatches, anchorOp); + Value inputTile = createInputTile(args.inputs.front(), + patchIndex, + channelTileIndex, + inputTileType, + *tiling, + state.strideHeight, + state.strideWidth, + state.dilationHeight, + state.dilationWidth, + state.outType.getDimSize(3), + rewriter, + loc); + Value weightTile = createWeightTile(args.weights.front(), + channelTileIndex, + cast(args.weights.front().getType()), + *tiling, + rewriter, + loc); + auto rowTileType = RankedTensorType::get({1, tiling->tileOutputChannels}, state.outType.getElementType()); + Value rowTile = spatial::SpatVMMOp::create(rewriter, loc, rowTileType, weightTile, inputTile).getResult(); + if (args.inputs.size() > 1) { + Value biasTile = createBiasTile(args.inputs[1], channelTileIndex, *tiling, rewriter, loc); + rowTile = spatial::SpatVAddOp::create(rewriter, loc, rowTileType, rowTile, biasTile).getResult(); + } + + SmallVector outputOffsets {args.lane, rewriter.getIndexAttr(0)}; + SmallVector outputSizes {rewriter.getIndexAttr(1), + rewriter.getIndexAttr(tiling->tileOutputChannels)}; + createParallelInsertSliceIntoBatchOutput( + rewriter, loc, rowTile, args.outputs.front(), outputOffsets, outputSizes, getUnitStrides(rewriter, 2)); + }); + if (failed(batchOp)) + return failure(); + + auto nhwcType = RankedTensorType::get( + {state.xType.getDimSize(0), state.outType.getDimSize(2), state.outType.getDimSize(3), state.outType.getDimSize(1)}, + state.outType.getElementType()); + auto collectedRows = + reconstructDepthwiseGemmRows(batchOp->getResult(0), piecesType, gemmOutType, *tiling, rewriter, loc); + if (failed(collectedRows)) + return failure(); + + return createCollectedConvOutput(ValueRange {*collectedRows}, + state.outType, + gemmOutType, + nhwcType, + state.outType, + tiling->totalPatches, + state.outType.getDimSize(1), + /*packFactor=*/1, + rewriter, + loc); +} + +} // namespace depthwise + +namespace standard { + +struct ConvGemmPlan { + int64_t patchSize; + int64_t numPatchesPerBatch; + int64_t numPatches; + int64_t maxParallelPixels; + int64_t effectiveMaxParallelPixels; + int64_t packedNumRows; + + RankedTensorType im2colType; + RankedTensorType im2colRowType; + RankedTensorType gemmInputRowsType; + RankedTensorType wFlatType; + RankedTensorType wTransType; + RankedTensorType gemmOutType; + RankedTensorType gemmOutputRowsType; + RankedTensorType nhwcType; +}; + +static Value createPaddedRows(Value rows, + RankedTensorType rowsType, + int64_t paddedRows, + ConversionPatternRewriter& rewriter, + Location loc) { + if (rowsType.getDimSize(0) == paddedRows) + return rows; + + auto paddedType = + RankedTensorType::get({paddedRows, rowsType.getDimSize(1)}, rowsType.getElementType(), rowsType.getEncoding()); + return createZeroPaddedTensor( + rows, paddedType, {0, 0}, {paddedRows - rowsType.getDimSize(0), 0}, rewriter, loc); +} + static Value packRowsForParallelGemm( Value rows, RankedTensorType rowsType, int64_t packFactor, ConversionPatternRewriter& rewriter, Location loc) { if (packFactor == 1) return rows; - const int64_t packedNumRows = ceilIntegerDivide(rowsType.getDimSize(0), packFactor); - const int64_t paddedNumRows = packedNumRows * packFactor; + const int64_t paddedNumRows = ceilIntegerDivide(rowsType.getDimSize(0), packFactor) * packFactor; + const int64_t packedNumRows = paddedNumRows / packFactor; const int64_t rowWidth = rowsType.getDimSize(1); auto groupedType = RankedTensorType::get({packedNumRows, packFactor, rowWidth}, rowsType.getElementType(), rowsType.getEncoding()); auto packedType = RankedTensorType::get({packedNumRows, packFactor * rowWidth}, rowsType.getElementType(), rowsType.getEncoding()); - Value paddedRows = createPaddedRows(rows, rowsType, paddedNumRows, rewriter, loc); - Value groupedRows = tensor::ExpandShapeOp::create(rewriter, - loc, - groupedType, - paddedRows, - SmallVector { - {0, 1}, - {2} + Value padded = createPaddedRows(rows, rowsType, paddedNumRows, rewriter, loc); + Value grouped = tensor::ExpandShapeOp::create(rewriter, + loc, + groupedType, + padded, + SmallVector { + {0, 1}, + {2} }); return tensor::CollapseShapeOp::create(rewriter, loc, packedType, - groupedRows, + grouped, SmallVector { {0}, {1, 2} @@ -121,62 +716,82 @@ static Value unpackRowsFromParallelGemm(Value packedRows, auto unpackedType = RankedTensorType::get({unpackedRows, rowWidth}, packedRowsType.getElementType(), packedRowsType.getEncoding()); - Value expandedRows = tensor::ExpandShapeOp::create(rewriter, - loc, - expandedType, - packedRows, - SmallVector { - {0}, - {1, 2} + Value expanded = tensor::ExpandShapeOp::create(rewriter, + loc, + expandedType, + packedRows, + SmallVector { + {0}, + {1, 2} }); - Value paddedRows = tensor::CollapseShapeOp::create(rewriter, - loc, - paddedType, - expandedRows, - SmallVector { - {0, 1}, - {2} + Value padded = tensor::CollapseShapeOp::create(rewriter, + loc, + paddedType, + expanded, + SmallVector { + {0, 1}, + {2} }); if (paddedNumRows == unpackedRows) - return paddedRows; + return padded; SmallVector offsets {rewriter.getIndexAttr(0), rewriter.getIndexAttr(0)}; SmallVector sizes {rewriter.getIndexAttr(unpackedRows), rewriter.getIndexAttr(rowWidth)}; - SmallVector strides {rewriter.getIndexAttr(1), rewriter.getIndexAttr(1)}; - return tensor::ExtractSliceOp::create(rewriter, loc, unpackedType, paddedRows, offsets, sizes, strides); + return tensor::ExtractSliceOp::create(rewriter, loc, unpackedType, padded, offsets, sizes, getUnitStrides(rewriter, 2)); } -static Value buildPackedWeight(DenseElementsAttr wDenseAttr, - Value wTrans, - RankedTensorType wType, - int64_t numChannelsIn, - int64_t numChannelsOut, - int64_t wHeight, - int64_t wWidth, - int64_t patchSize, - int64_t packFactor, - ConversionPatternRewriter& rewriter, - Location loc) { - if (packFactor == 1) +static Value createWeightMatrix( + Value weights, const ConvGemmPlan& plan, ConversionPatternRewriter& rewriter, Location loc) { + auto buildWeightMatrix = [&](Value weight) -> Value { + Value flattened = tensor::CollapseShapeOp::create(rewriter, + loc, + plan.wFlatType, + weight, + SmallVector { + {0}, + {1, 2, 3} + }); + return ONNXTransposeOp::create(rewriter, loc, plan.wTransType, flattened, rewriter.getI64ArrayAttr({1, 0})) + .getResult(); + }; + + if (isCompileTimeComputable(weights)) + return buildWeightMatrix(weights); + + auto computeOp = + createSpatCompute<1>(rewriter, loc, TypeRange {plan.wTransType}, {}, ValueRange {weights}, [&](Value weight) { + spatial::SpatYieldOp::create(rewriter, loc, buildWeightMatrix(weight)); + }); + return computeOp.getResult(0); +} + +static Value buildPackedWeights(DenseElementsAttr wDenseAttr, + Value wTrans, + const ConvLoweringState& state, + const ConvGemmPlan& plan, + ConversionPatternRewriter& rewriter, + Location loc) { + if (plan.effectiveMaxParallelPixels == 1) return wTrans; - auto packedWeightType = - RankedTensorType::get({packFactor * patchSize, packFactor * numChannelsOut}, wType.getElementType()); + auto packedWeightType = RankedTensorType::get( + {plan.effectiveMaxParallelPixels * plan.patchSize, plan.effectiveMaxParallelPixels * state.numChannelsOut}, + state.wType.getElementType()); SmallVector sourceValues(wDenseAttr.getValues()); SmallVector packedValues(packedWeightType.getNumElements(), - cast(rewriter.getZeroAttr(wType.getElementType()))); + cast(rewriter.getZeroAttr(state.wType.getElementType()))); - for (int64_t copyId = 0; copyId < packFactor; copyId++) { - for (int64_t outChannel = 0; outChannel < numChannelsOut; outChannel++) { - for (int64_t inChannel = 0; inChannel < numChannelsIn; inChannel++) { - for (int64_t kernelH = 0; kernelH < wHeight; kernelH++) { - for (int64_t kernelW = 0; kernelW < wWidth; kernelW++) { + for (int64_t copyId = 0; copyId < plan.effectiveMaxParallelPixels; ++copyId) { + for (int64_t outChannel = 0; outChannel < state.numChannelsOut; ++outChannel) { + for (int64_t inChannel = 0; inChannel < state.numChannelsIn; ++inChannel) { + for (int64_t kernelH = 0; kernelH < state.wHeight; ++kernelH) { + for (int64_t kernelW = 0; kernelW < state.wWidth; ++kernelW) { const int64_t sourceFlatIndex = - (((outChannel * numChannelsIn) + inChannel) * wHeight + kernelH) * wWidth + kernelW; - const int64_t patchIndex = ((inChannel * wHeight) + kernelH) * wWidth + kernelW; - const int64_t targetRow = copyId * patchSize + patchIndex; - const int64_t targetCol = copyId * numChannelsOut + outChannel; - packedValues[targetRow * (packFactor * numChannelsOut) + targetCol] = sourceValues[sourceFlatIndex]; + (((outChannel * state.numChannelsIn) + inChannel) * state.wHeight + kernelH) * state.wWidth + kernelW; + const int64_t patchIndex = ((inChannel * state.wHeight) + kernelH) * state.wWidth + kernelW; + const int64_t targetRow = copyId * plan.patchSize + patchIndex; + const int64_t targetCol = copyId * state.numChannelsOut + outChannel; + packedValues[targetRow * packedWeightType.getDimSize(1) + targetCol] = sourceValues[sourceFlatIndex]; } } } @@ -187,124 +802,95 @@ static Value buildPackedWeight(DenseElementsAttr wDenseAttr, return getOrCreateConstant(rewriter, rewriter.getInsertionBlock()->getParentOp(), packedAttr, packedWeightType); } -static Value createConvWeightMatrix( - Value w, RankedTensorType wFlatType, RankedTensorType wTransType, ConversionPatternRewriter& rewriter, Location loc) { - auto buildWeightMatrix = [&](Value weight) -> Value { - Value wFlat = tensor::CollapseShapeOp::create(rewriter, - loc, - wFlatType, - weight, - SmallVector { - {0}, - {1, 2, 3} - }); - return ONNXTransposeOp::create(rewriter, loc, wTransType, wFlat, rewriter.getI64ArrayAttr({1, 0})).getResult(); - }; - - if (isCompileTimeComputable(w)) - return buildWeightMatrix(w); - - auto computeOp = createSpatCompute<1>(rewriter, loc, TypeRange {wTransType}, {}, ValueRange {w}, [&](Value weight) { - spatial::SpatYieldOp::create(rewriter, loc, buildWeightMatrix(weight)); - }); - return computeOp.getResult(0); -} - -static Value buildPackedBias(bool hasBias, - Value gemmBias, +static Value buildPackedBias(Value gemmBias, Value biasMatrix, DenseElementsAttr biasDenseAttr, - RankedTensorType outType, - int64_t numChannelsOut, - int64_t packFactor, + const ConvLoweringState& state, + const ConvGemmPlan& plan, ConversionPatternRewriter& rewriter, Location loc) { - if (!hasBias) + if (!state.hasBias) return gemmBias; - if (packFactor == 1) + if (plan.effectiveMaxParallelPixels == 1) return biasMatrix; SmallVector sourceValues(biasDenseAttr.getValues()); SmallVector packedValues; - packedValues.reserve(packFactor * numChannelsOut); - for (int64_t copyId = 0; copyId < packFactor; copyId++) + packedValues.reserve(plan.effectiveMaxParallelPixels * state.numChannelsOut); + for (int64_t copyId = 0; copyId < plan.effectiveMaxParallelPixels; ++copyId) packedValues.append(sourceValues.begin(), sourceValues.end()); - auto packedBiasType = RankedTensorType::get({1, packFactor * numChannelsOut}, outType.getElementType()); + auto packedBiasType = + RankedTensorType::get({1, plan.effectiveMaxParallelPixels * state.numChannelsOut}, state.outType.getElementType()); auto packedBiasAttr = DenseElementsAttr::get(packedBiasType, packedValues); return getOrCreateConstant(rewriter, rewriter.getInsertionBlock()->getParentOp(), packedBiasAttr, packedBiasType); } -static Value createIm2colRowComputes(Value x, - RankedTensorType xType, - RankedTensorType im2colType, - RankedTensorType im2colRowType, - RankedTensorType gemmInputRowsType, - int64_t batchSize, - int64_t numChannelsIn, - int64_t xHeight, - int64_t xWidth, - int64_t wHeight, - int64_t wWidth, - int64_t padHeightBegin, - int64_t padHeightEnd, - int64_t padWidthBegin, - int64_t padWidthEnd, - int64_t strideHeight, - int64_t strideWidth, - int64_t dilationHeight, - int64_t dilationWidth, - int64_t outWidth, - int64_t patchSize, - int64_t numPatches, - int64_t numPatchesPerBatch, - int64_t packFactor, - ConversionPatternRewriter& rewriter, - Location loc) { - auto elemType = xType.getElementType(); +static ConvGemmPlan +buildConvGemmPlan(const ConvLoweringState& state, bool canPackWeightsAsConstants, bool canPackBiasAsConstants) { + ConvGemmPlan plan; + plan.patchSize = state.numChannelsIn * state.wHeight * state.wWidth; + plan.numPatchesPerBatch = state.outHeight * state.outWidth; + plan.numPatches = state.batchSize * plan.numPatchesPerBatch; + const int64_t wMaxDim = std::max(plan.patchSize, state.numChannelsOut); + plan.maxParallelPixels = std::max(1, static_cast(crossbarSize.getValue()) / wMaxDim); + plan.effectiveMaxParallelPixels = + (canPackWeightsAsConstants && canPackBiasAsConstants) ? plan.maxParallelPixels : 1; + plan.packedNumRows = ceilIntegerDivide(plan.numPatches, plan.effectiveMaxParallelPixels); + + auto elemType = state.xType.getElementType(); + auto outElemType = state.outType.getElementType(); + plan.im2colType = RankedTensorType::get({plan.numPatches, plan.patchSize}, elemType); + plan.im2colRowType = RankedTensorType::get({1, plan.patchSize}, elemType); + plan.gemmInputRowsType = + RankedTensorType::get({plan.packedNumRows, plan.effectiveMaxParallelPixels * plan.patchSize}, elemType); + plan.wFlatType = RankedTensorType::get({state.numChannelsOut, plan.patchSize}, state.wType.getElementType()); + plan.wTransType = RankedTensorType::get({plan.patchSize, state.numChannelsOut}, state.wType.getElementType()); + plan.gemmOutType = RankedTensorType::get({plan.numPatches, state.numChannelsOut}, outElemType); + plan.gemmOutputRowsType = + RankedTensorType::get({plan.packedNumRows, plan.effectiveMaxParallelPixels * state.numChannelsOut}, outElemType); + plan.nhwcType = + RankedTensorType::get({state.batchSize, state.outHeight, state.outWidth, state.numChannelsOut}, outElemType); + return plan; +} + +static Value createIm2colRows( + const ConvLoweringState& state, const ConvGemmPlan& plan, ConversionPatternRewriter& rewriter, Location loc) { constexpr size_t numInputs = 1; auto im2colComputeOp = - createSpatCompute(rewriter, loc, TypeRange {gemmInputRowsType}, {}, x, [&](Value xArg) { + createSpatCompute(rewriter, loc, TypeRange {plan.gemmInputRowsType}, {}, state.x, [&](Value xArg) { + auto elemType = state.xType.getElementType(); Value paddedInput = xArg; - - // Pad input with zeros if needed: - // [1, numChannelsIn, xHeight, xWidth] -> [1, numChannelsIn, xHeight+padHeight, xWidth+padWidth] - if (padHeightBegin || padHeightEnd || padWidthBegin || padWidthEnd) { - const int64_t paddedHeight = xHeight + padHeightBegin + padHeightEnd; - const int64_t paddedWidth = xWidth + padWidthBegin + padWidthEnd; - auto paddedType = RankedTensorType::get({batchSize, numChannelsIn, paddedHeight, paddedWidth}, elemType); - SmallVector lowPads = {rewriter.getIndexAttr(0), - rewriter.getIndexAttr(0), - rewriter.getIndexAttr(padHeightBegin), - rewriter.getIndexAttr(padWidthBegin)}; - SmallVector highPads = {rewriter.getIndexAttr(0), - rewriter.getIndexAttr(0), - rewriter.getIndexAttr(padHeightEnd), - rewriter.getIndexAttr(padWidthEnd)}; - auto padOp = tensor::PadOp::create(rewriter, loc, paddedType, paddedInput, lowPads, highPads); - auto* padBlock = new Block(); - for (int i = 0; i < 4; i++) - padBlock->addArgument(rewriter.getIndexType(), loc); - padOp.getRegion().push_back(padBlock); - rewriter.setInsertionPointToStart(padBlock); - auto zero = getOrCreateConstant(rewriter, padOp.getOperation(), rewriter.getFloatAttr(elemType, 0.0), elemType); - tensor::YieldOp::create(rewriter, loc, zero); - rewriter.setInsertionPointAfter(padOp); - paddedInput = padOp.getResult(); + if (state.padHeightBegin || state.padHeightEnd || state.padWidthBegin || state.padWidthEnd) { + auto paddedInputType = RankedTensorType::get( + {state.batchSize, + state.numChannelsIn, + state.xHeight + state.padHeightBegin + state.padHeightEnd, + state.xWidth + state.padWidthBegin + state.padWidthEnd}, + elemType); + paddedInput = createZeroPaddedTensor(paddedInput, + paddedInputType, + {0, 0, state.padHeightBegin, state.padWidthBegin}, + {0, 0, state.padHeightEnd, state.padWidthEnd}, + rewriter, + loc); } - // Build im2col [numPatches, patchSize] incrementally to keep the IR small - // until the late PIM unrolling step. - Value im2colInit = tensor::EmptyOp::create(rewriter, loc, im2colType.getShape(), elemType); + // Keep the standard im2col view of convolution, flipped so filters sit in + // B / crossbar columns: + // A (im2col): [numPatches, patchSize] -- one row per output spatial position + // B (weights): [patchSize, cOut] + // Gemm output: [numPatches, cOut] + Value im2colInit = tensor::EmptyOp::create(rewriter, loc, plan.im2colType.getShape(), elemType); Operation* anchorOp = rewriter.getInsertionBlock()->getParentOp(); - auto c0 = getOrCreateIndexConstant(rewriter, anchorOp, 0); - auto c1 = getOrCreateIndexConstant(rewriter, anchorOp, 1); - auto cNumPatches = getOrCreateIndexConstant(rewriter, anchorOp, numPatches); - auto cNumPatchesPerBatch = getOrCreateIndexConstant(rewriter, anchorOp, numPatchesPerBatch); - auto cOutWidth = getOrCreateIndexConstant(rewriter, anchorOp, outWidth); - auto cStrideHeight = getOrCreateIndexConstant(rewriter, anchorOp, strideHeight); - auto cStrideWidth = getOrCreateIndexConstant(rewriter, anchorOp, strideWidth); + Value c0 = getOrCreateIndexConstant(rewriter, anchorOp, 0); + Value c1 = getOrCreateIndexConstant(rewriter, anchorOp, 1); + Value cNumPatches = getOrCreateIndexConstant(rewriter, anchorOp, plan.numPatches); + Value cNumPatchesPerBatch = getOrCreateIndexConstant(rewriter, anchorOp, plan.numPatchesPerBatch); + Value cOutWidth = getOrCreateIndexConstant(rewriter, anchorOp, state.outWidth); + Value cStrideHeight = getOrCreateIndexConstant(rewriter, anchorOp, state.strideHeight); + Value cStrideWidth = getOrCreateIndexConstant(rewriter, anchorOp, state.strideWidth); auto im2colLoop = buildNormalizedScfFor( rewriter, @@ -322,44 +908,44 @@ static Value createIm2colRowComputes(Value x, Value inputHeightOffset = arith::MulIOp::create(rewriter, nestedLoc, outHeightIndex, cStrideHeight); Value inputWidthOffset = arith::MulIOp::create(rewriter, nestedLoc, outWidthIndex, cStrideWidth); - SmallVector offsets = { - batchIndex, rewriter.getIndexAttr(0), inputHeightOffset, inputWidthOffset}; - SmallVector sizes = {rewriter.getIndexAttr(1), - rewriter.getIndexAttr(numChannelsIn), - rewriter.getIndexAttr(wHeight), - rewriter.getIndexAttr(wWidth)}; - SmallVector strides = {rewriter.getIndexAttr(1), - rewriter.getIndexAttr(1), - rewriter.getIndexAttr(dilationHeight), - rewriter.getIndexAttr(dilationWidth)}; - auto patchType = RankedTensorType::get({1, numChannelsIn, wHeight, wWidth}, elemType); - Value patch = - tensor::ExtractSliceOp::create(rewriter, nestedLoc, patchType, paddedInput, offsets, sizes, strides); - + auto patchType = + RankedTensorType::get({1, state.numChannelsIn, state.wHeight, state.wWidth}, elemType); + Value patch = createConvInputPatch(paddedInput, + patchType, + batchIndex, + c0, + inputHeightOffset, + inputWidthOffset, + state.dilationHeight, + state.dilationWidth, + rewriter, + nestedLoc); Value row = tensor::CollapseShapeOp::create(rewriter, nestedLoc, - im2colRowType, + plan.im2colRowType, patch, SmallVector { {0}, {1, 2, 3} }); - SmallVector rowOffsets = {patchIndex, rewriter.getIndexAttr(0)}; - SmallVector rowSizes = {rewriter.getIndexAttr(1), rewriter.getIndexAttr(patchSize)}; - SmallVector rowStrides = {rewriter.getIndexAttr(1), rewriter.getIndexAttr(1)}; - Value updatedIm2col = - tensor::InsertSliceOp::create(rewriter, nestedLoc, row, im2colAcc, rowOffsets, rowSizes, rowStrides); - yielded.push_back(updatedIm2col); + SmallVector rowOffsets {patchIndex, rewriter.getIndexAttr(0)}; + SmallVector rowSizes {rewriter.getIndexAttr(1), rewriter.getIndexAttr(plan.patchSize)}; + Value next = tensor::InsertSliceOp::create( + rewriter, nestedLoc, row, im2colAcc, rowOffsets, rowSizes, getUnitStrides(rewriter, 2)); + yielded.push_back(next); return success(); }); if (failed(im2colLoop)) return failure(); - Value im2col = im2colLoop->results.front(); - Value gemmInputRows = im2col; - if (packFactor != 1) - gemmInputRows = packRowsForParallelGemm(im2col, im2colType, packFactor, rewriter, loc); + Value gemmInputRows = im2colLoop->results.front(); + // Pack N old im2col rows into one longer row so one GEMM can cover N + // pixels in parallel. The corresponding packed weight matrix contains N + // block-diagonal copies of W^T, and the packed output must be unpacked + // back to one row per spatial patch. + if (plan.effectiveMaxParallelPixels != 1) + gemmInputRows = packRowsForParallelGemm(gemmInputRows, plan.im2colType, plan.effectiveMaxParallelPixels, rewriter, loc); spatial::SpatYieldOp::create(rewriter, loc, gemmInputRows); return success(); @@ -369,6 +955,52 @@ static Value createIm2colRowComputes(Value x, return im2colComputeOp->getResult(0); } +static Value rewriteConv(const ConvLoweringState& state, ConversionPatternRewriter& rewriter, Location loc) { + auto wDenseAttr = getHostConstDenseElementsAttr(state.w); + Value gemmBias = ONNXNoneOp::create(rewriter, loc, rewriter.getNoneType()); + Value biasMatrix; + DenseElementsAttr biasDenseAttr; + if (state.hasBias) { + gemmBias = state.b; + biasDenseAttr = getHostConstDenseElementsAttr(state.b); + biasMatrix = expandBiasIfNeeded(state.b, rewriter, loc); + } + + ConvGemmPlan plan = + buildConvGemmPlan(state, static_cast(wDenseAttr), !state.hasBias || static_cast(biasDenseAttr)); + // Prepare weight matrix W for crossbar storage: + // W: [Cout, Cin, KH, KW] -> [Cout, patchSize] -> [patchSize, Cout] + Value weightMatrix = createWeightMatrix(state.w, plan, rewriter, loc); + Value gemmInputRows = createIm2colRows(state, plan, rewriter, loc); + Value gemmB = buildPackedWeights(wDenseAttr, weightMatrix, state, plan, rewriter, loc); + Value gemmC = buildPackedBias(gemmBias, biasMatrix, biasDenseAttr, state, plan, rewriter, loc); + + Value gemmRows = ONNXGemmOp::create(rewriter, + loc, + plan.gemmOutputRowsType, + gemmInputRows, + gemmB, + gemmC, + rewriter.getF32FloatAttr(1.0f), + rewriter.getF32FloatAttr(1.0f), + rewriter.getBoolAttr(false), + rewriter.getBoolAttr(false)) + .getY(); + + return createCollectedConvOutput(ValueRange {gemmRows}, + state.outType, + plan.gemmOutType, + plan.nhwcType, + state.outType, + plan.numPatches, + state.numChannelsOut, + plan.effectiveMaxParallelPixels, + rewriter, + loc); +} + +} // namespace standard + static Value createCollectedConvOutput(ValueRange gemmRows, Type convType, RankedTensorType gemmOutType, @@ -386,19 +1018,14 @@ static Value createCollectedConvOutput(ValueRange gemmRows, } else { Value packedOutput = createSpatConcat(rewriter, loc, /*axis=*/0, gemmRowArgs); - gemmOut = unpackRowsFromParallelGemm(packedOutput, - cast(packedOutput.getType()), - numPatches, - numChannelsOut, - packFactor, - rewriter, - loc); + gemmOut = standard::unpackRowsFromParallelGemm( + packedOutput, cast(packedOutput.getType()), numPatches, numChannelsOut, packFactor, rewriter, loc); } - // Restore to NCHW layout: + // Restore output layout: // [numPatches, numChannelsOut] - // -> [1, outHeight, outWidth, numChannelsOut] - // -> [1, numChannelsOut, outHeight, outWidth] + // -> [N, Hout, Wout, Cout] + // -> [N, Cout, Hout, Wout] Value nhwcOut = tensor::ExpandShapeOp::create(rewriter, loc, nhwcType, @@ -413,232 +1040,82 @@ static Value createCollectedConvOutput(ValueRange gemmRows, return collectComputeOp.getResult(0); } -static Value lowerSingleConvGroup(Value x, - Value w, - Value b, - RankedTensorType xType, - RankedTensorType wType, - RankedTensorType outType, - int64_t padHeightBegin, - int64_t padHeightEnd, - int64_t padWidthBegin, - int64_t padWidthEnd, - int64_t strideHeight, - int64_t strideWidth, - int64_t dilationHeight, - int64_t dilationWidth, - ConversionPatternRewriter& rewriter, - Location loc) { - const int64_t batchSize = xType.getDimSize(0); - const int64_t numChannelsIn = xType.getDimSize(1); - const int64_t xHeight = xType.getDimSize(2); - const int64_t xWidth = xType.getDimSize(3); - const int64_t numChannelsOut = wType.getDimSize(0); - const int64_t wHeight = wType.getDimSize(2); - const int64_t wWidth = wType.getDimSize(3); - const int64_t outHeight = outType.getDimSize(2); - const int64_t outWidth = outType.getDimSize(3); +static FailureOr analyzeConvLoweringState(ONNXConvOp convOp, ONNXConvOpAdaptor convOpAdaptor) { + ConvLoweringState state; + state.x = convOpAdaptor.getX(); + state.w = convOpAdaptor.getW(); + state.b = convOpAdaptor.getB(); + state.xType = cast(state.x.getType()); + state.wType = cast(state.w.getType()); + state.outType = cast(convOp.getY().getType()); - // im2col layout (flipped with respect to the standard, so filters sit in B = crossbar): - // A (im2col): [numPatches, patchSize] -- one row per output spatial position - // B (weights): [patchSize, cOut] -- W^T, stored in crossbar columns - // Gemm output: [numPatches, cOut] - const int64_t patchSize = numChannelsIn * wHeight * wWidth; - const int64_t numPatchesPerBatch = outHeight * outWidth; - const int64_t numPatches = batchSize * numPatchesPerBatch; - - auto elemType = xType.getElementType(); - auto im2colType = RankedTensorType::get({numPatches, patchSize}, elemType); - auto rowType = RankedTensorType::get({1, patchSize}, elemType); - auto wFlatType = RankedTensorType::get({numChannelsOut, patchSize}, wType.getElementType()); - auto wTransType = RankedTensorType::get({patchSize, numChannelsOut}, wType.getElementType()); - auto gemmOutType = RankedTensorType::get({numPatches, numChannelsOut}, outType.getElementType()); - auto nhwcType = RankedTensorType::get({batchSize, outHeight, outWidth, numChannelsOut}, outType.getElementType()); - - const int64_t xbarSize = static_cast(crossbarSize.getValue()); - const int64_t wMaxDim = std::max(patchSize, numChannelsOut); - const int64_t maxParallelPixels = std::max(1, xbarSize / wMaxDim); - auto wDenseAttr = getHostConstDenseElementsAttr(w); - - // Prepare weight matrix W for crossbar storage: - // W: [numChannelsOut, numChannelsIn, wHeight, wWidth] -> [numChannelsOut, patchSize] -> [patchSize, numChannelsOut] - Value wTrans = createConvWeightMatrix(w, wFlatType, wTransType, rewriter, loc); - - // Pass bias through directly; Gemm handles rank-1 C canonicalization. - bool hasB = !isa(b.getDefiningOp()); - Value gemmBias = ONNXNoneOp::create(rewriter, loc, rewriter.getNoneType()); - Value biasMatrix; - DenseElementsAttr biasDenseAttr; - if (hasB) { - gemmBias = b; - biasDenseAttr = getHostConstDenseElementsAttr(b); - biasMatrix = expandBiasIfNeeded(b, rewriter, loc); - } - const bool canPackWeightsAsConstants = static_cast(wDenseAttr); - const bool canPackBiasAsConstants = !hasB || static_cast(biasDenseAttr); - const int64_t effectiveMaxParallelPixels = - (canPackWeightsAsConstants && canPackBiasAsConstants) ? maxParallelPixels : 1; - - // Keep the standard im2col view of convolution: - // A (im2col): [numPatches, patchSize] -- one row per output spatial position - // B (weights): [patchSize, cOut] -- W^T, stored in crossbar columns - // and optionally repack several old rows into one GEMM row to use the available crossbar size better. - // - // We want to process N pixels at the same time. Instead of doing N separate operations - // of (1 x patchSize) x (patchSize x cOut), we construct a block-diagonal weight matrix - // containing N copies of W^T and concatenate N im2col rows into one longer row: - // A_packed: [ceil(numPatches / N), N * patchSize] - // B_packed: [N * patchSize, N * cOut] - // Y_packed: [ceil(numPatches / N), N * cOut] - const int64_t packedNumRows = ceilIntegerDivide(numPatches, effectiveMaxParallelPixels); - auto gemmInputRowsType = RankedTensorType::get({packedNumRows, effectiveMaxParallelPixels * patchSize}, elemType); - auto gemmOutputRowsType = - RankedTensorType::get({packedNumRows, effectiveMaxParallelPixels * numChannelsOut}, outType.getElementType()); - Value gemmInputRows = createIm2colRowComputes(x, - xType, - im2colType, - rowType, - gemmInputRowsType, - batchSize, - numChannelsIn, - xHeight, - xWidth, - wHeight, - wWidth, - padHeightBegin, - padHeightEnd, - padWidthBegin, - padWidthEnd, - strideHeight, - strideWidth, - dilationHeight, - dilationWidth, - outWidth, - patchSize, - numPatches, - numPatchesPerBatch, - effectiveMaxParallelPixels, - rewriter, - loc); - - Value gemmB = buildPackedWeight(wDenseAttr, - wTrans, - wType, - numChannelsIn, - numChannelsOut, - wHeight, - wWidth, - patchSize, - effectiveMaxParallelPixels, - rewriter, - loc); - Value gemmC = buildPackedBias( - hasB, gemmBias, biasMatrix, biasDenseAttr, outType, numChannelsOut, effectiveMaxParallelPixels, rewriter, loc); - - Value gemmRows = ONNXGemmOp::create(rewriter, - loc, - gemmOutputRowsType, - gemmInputRows, - gemmB, - gemmC, - rewriter.getF32FloatAttr(1.0f), - rewriter.getF32FloatAttr(1.0f), - rewriter.getBoolAttr(false), - rewriter.getBoolAttr(false)) - .getY(); - - return createCollectedConvOutput(ValueRange {gemmRows}, - outType, - gemmOutType, - nhwcType, - outType, - numPatches, - numChannelsOut, - effectiveMaxParallelPixels, - rewriter, - loc); -} - -} // namespace - -LogicalResult ConvToGemm::matchAndRewrite(ONNXConvOp convOp, - ONNXConvOpAdaptor convOpAdaptor, - ConversionPatternRewriter& rewriter) const { - Location loc = convOp.getLoc(); - Value x = convOpAdaptor.getX(); - Value w = convOpAdaptor.getW(); - Value b = convOpAdaptor.getB(); - - auto xType = cast(x.getType()); - auto wType = cast(w.getType()); - auto outType = cast(convOp.getY().getType()); - - if (!xType.hasStaticShape()) { + if (!state.xType.hasStaticShape()) { pim::emitUnsupportedStaticShapeDiagnostic(convOp, "conv input"); return failure(); } - if (!wType.hasStaticShape()) { + if (!state.wType.hasStaticShape()) { pim::emitUnsupportedStaticShapeDiagnostic(convOp, "conv weight"); return failure(); } - if (!outType.hasStaticShape()) { + if (!state.outType.hasStaticShape()) { pim::emitUnsupportedStaticShapeDiagnostic(convOp, "conv result"); return failure(); } - if (xType.getRank() != 4) { - pim::emitUnsupportedRankDiagnostic(convOp, "conv input", xType.getRank(), {4}); + if (state.xType.getRank() != 4) { + pim::emitUnsupportedRankDiagnostic(convOp, "conv input", state.xType.getRank(), {4}); return failure(); } - if (wType.getRank() != 4) { - pim::emitUnsupportedRankDiagnostic(convOp, "conv weight", wType.getRank(), {4}); + if (state.wType.getRank() != 4) { + pim::emitUnsupportedRankDiagnostic(convOp, "conv weight", state.wType.getRank(), {4}); return failure(); } - if (outType.getRank() != 4) { - pim::emitUnsupportedRankDiagnostic(convOp, "conv result", outType.getRank(), {4}); + if (state.outType.getRank() != 4) { + pim::emitUnsupportedRankDiagnostic(convOp, "conv result", state.outType.getRank(), {4}); return failure(); } - if (convOp.getGroup() < 1) { + + state.group = convOp.getGroup(); + if (state.group < 1) { convOp.emitOpError("requires group >= 1 for Spatial lowering"); return failure(); } - const int64_t batchSize = xType.getDimSize(0); - const int64_t numChannelsIn = xType.getDimSize(1); - const int64_t xHeight = xType.getDimSize(2); - const int64_t xWidth = xType.getDimSize(3); - const int64_t numChannelsOut = wType.getDimSize(0); - const int64_t wHeight = wType.getDimSize(2); - const int64_t wWidth = wType.getDimSize(3); - const int64_t outHeight = outType.getDimSize(2); - const int64_t outWidth = outType.getDimSize(3); - const int64_t group = convOp.getGroup(); - const bool hasB = !isa(b.getDefiningOp()); + state.batchSize = state.xType.getDimSize(0); + state.numChannelsIn = state.xType.getDimSize(1); + state.xHeight = state.xType.getDimSize(2); + state.xWidth = state.xType.getDimSize(3); + state.numChannelsOut = state.wType.getDimSize(0); + state.wHeight = state.wType.getDimSize(2); + state.wWidth = state.wType.getDimSize(3); + state.outHeight = state.outType.getDimSize(2); + state.outWidth = state.outType.getDimSize(3); + state.hasBias = !isa(state.b.getDefiningOp()); - if (numChannelsIn % group != 0) { - convOp.emitOpError() << "requires input channels " << numChannelsIn << " to be divisible by group " << group + if (state.numChannelsIn % state.group != 0) { + convOp.emitOpError() << "requires input channels " << state.numChannelsIn << " to be divisible by group " + << state.group << " for Spatial lowering"; + return failure(); + } + if (state.numChannelsOut % state.group != 0) { + convOp.emitOpError() << "requires output channels " << state.numChannelsOut << " to be divisible by group " + << state.group << " for Spatial lowering"; + return failure(); + } + + state.numChannelsInPerGroup = state.numChannelsIn / state.group; + state.numChannelsOutPerGroup = state.numChannelsOut / state.group; + if (state.wType.getDimSize(1) != state.numChannelsInPerGroup) { + convOp.emitOpError() << "requires grouped conv weight input channels " << state.wType.getDimSize(1) + << " to match input channels per group " << state.numChannelsInPerGroup << " for Spatial lowering"; return failure(); } - if (numChannelsOut % group != 0) { - convOp.emitOpError() << "requires output channels " << numChannelsOut << " to be divisible by group " << group - << " for Spatial lowering"; + if (state.wType.getDimSize(0) != state.numChannelsOut) { + convOp.emitOpError() << "requires weight output channels " << state.wType.getDimSize(0) + << " to match result channels " << state.numChannelsOut << " for Spatial lowering"; return failure(); } - const int64_t numChannelsInPerGroup = numChannelsIn / group; - const int64_t numChannelsOutPerGroup = numChannelsOut / group; - if (wType.getDimSize(1) != numChannelsInPerGroup) { - convOp.emitOpError() << "requires grouped conv weight input channels " << wType.getDimSize(1) - << " to match input channels per group " << numChannelsInPerGroup << " for Spatial lowering"; - return failure(); - } - if (wType.getDimSize(0) != numChannelsOut) { - convOp.emitOpError() << "requires weight output channels " << wType.getDimSize(0) << " to match result channels " - << numChannelsOut << " for Spatial lowering"; - return failure(); - } - - // Read optional conv attributes (ONNX defaults: stride=1, dilation=1, pad=0) const auto stridesAttr = convOp.getStrides(); const auto dilationsAttr = convOp.getDilations(); const auto padsAttr = convOp.getPads(); @@ -656,79 +1133,104 @@ LogicalResult ConvToGemm::matchAndRewrite(ONNXConvOp convOp, return failure(); } - const int64_t strideHeight = getOptionalI64Attr(stridesAttr, 0, 1); - const int64_t strideWidth = getOptionalI64Attr(stridesAttr, 1, 1); - const int64_t dilationHeight = getOptionalI64Attr(dilationsAttr, 0, 1); - const int64_t dilationWidth = getOptionalI64Attr(dilationsAttr, 1, 1); - - int64_t padHeightBegin = 0; - int64_t padHeightEnd = 0; - int64_t padWidthBegin = 0; - int64_t padWidthEnd = 0; + state.strideHeight = getOptionalI64Attr(stridesAttr, 0, 1); + state.strideWidth = getOptionalI64Attr(stridesAttr, 1, 1); + state.dilationHeight = getOptionalI64Attr(dilationsAttr, 0, 1); + state.dilationWidth = getOptionalI64Attr(dilationsAttr, 1, 1); + state.padHeightBegin = 0; + state.padHeightEnd = 0; + state.padWidthBegin = 0; + state.padWidthEnd = 0; if (padsAttr) { - padHeightBegin = getI64Attr(*padsAttr, 0); - padWidthBegin = getI64Attr(*padsAttr, 1); - padHeightEnd = getI64Attr(*padsAttr, 2); - padWidthEnd = getI64Attr(*padsAttr, 3); + state.padHeightBegin = getI64Attr(*padsAttr, 0); + state.padWidthBegin = getI64Attr(*padsAttr, 1); + state.padHeightEnd = getI64Attr(*padsAttr, 2); + state.padWidthEnd = getI64Attr(*padsAttr, 3); + return state; } - else { - // Compute padding from auto_pad attribute - const auto autoPad = convOp.getAutoPad(); - if (autoPad == "SAME_UPPER" || autoPad == "SAME_LOWER") { - const int64_t effectiveKernelH = (wHeight - 1) * dilationHeight + 1; - const int64_t effectiveKernelW = (wWidth - 1) * dilationWidth + 1; - const int64_t totalPadH = - std::max(static_cast(0), (outHeight - 1) * strideHeight + effectiveKernelH - xHeight); - const int64_t totalPadW = - std::max(static_cast(0), (outWidth - 1) * strideWidth + effectiveKernelW - xWidth); - if (autoPad == "SAME_UPPER") { - padHeightBegin = totalPadH / 2; - padHeightEnd = totalPadH - padHeightBegin; - padWidthBegin = totalPadW / 2; - padWidthEnd = totalPadW - padWidthBegin; - } - else { // SAME_LOWER - padHeightEnd = totalPadH / 2; - padHeightBegin = totalPadH - padHeightEnd; - padWidthEnd = totalPadW / 2; - padWidthBegin = totalPadW - padWidthEnd; - } + const auto autoPad = convOp.getAutoPad(); + if (autoPad == "SAME_UPPER" || autoPad == "SAME_LOWER") { + const int64_t effectiveKernelH = (state.wHeight - 1) * state.dilationHeight + 1; + const int64_t effectiveKernelW = (state.wWidth - 1) * state.dilationWidth + 1; + const int64_t totalPadH = + std::max(static_cast(0), (state.outHeight - 1) * state.strideHeight + effectiveKernelH - state.xHeight); + const int64_t totalPadW = + std::max(static_cast(0), (state.outWidth - 1) * state.strideWidth + effectiveKernelW - state.xWidth); + + if (autoPad == "SAME_UPPER") { + state.padHeightBegin = totalPadH / 2; + state.padHeightEnd = totalPadH - state.padHeightBegin; + state.padWidthBegin = totalPadW / 2; + state.padWidthEnd = totalPadW - state.padWidthBegin; } - else if (autoPad != "NOTSET" && autoPad != "VALID") { - convOp.emitOpError() << "unsupported auto_pad value `" << autoPad << "` for Spatial lowering"; - return failure(); + else { + state.padHeightEnd = totalPadH / 2; + state.padHeightBegin = totalPadH - state.padHeightEnd; + state.padWidthEnd = totalPadW / 2; + state.padWidthBegin = totalPadW - state.padWidthEnd; } - // "NOTSET" or "VALID" -> all pads stay 0 + return state; } - if (group == 1) { - rewriter.replaceOp(convOp, - lowerSingleConvGroup(x, - w, - b, - xType, - wType, - outType, - padHeightBegin, - padHeightEnd, - padWidthBegin, - padWidthEnd, - strideHeight, - strideWidth, - dilationHeight, - dilationWidth, - rewriter, - loc)); - return success(); + if (autoPad != "NOTSET" && autoPad != "VALID") { + convOp.emitOpError() << "unsupported auto_pad value `" << autoPad << "` for Spatial lowering"; + return failure(); } - SmallVector xSlices = sliceTensor(x, /*axis=*/1, numChannelsInPerGroup, rewriter, loc); - SmallVector wSlices = sliceTensor(w, /*axis=*/0, numChannelsOutPerGroup, rewriter, loc); + return state; +} + +static LogicalResult +rewriteUngroupedConv(ONNXConvOp convOp, const ConvLoweringState& state, ConversionPatternRewriter& rewriter) { + rewriter.replaceOp(convOp, standard::rewriteConv(state, rewriter, convOp.getLoc())); + return success(); +} + +static LogicalResult +rewriteDepthwiseConv(ONNXConvOp convOp, const ConvLoweringState& state, ConversionPatternRewriter& rewriter) { + FailureOr result = depthwise::rewriteConv(convOp, state, rewriter, convOp.getLoc()); + if (failed(result)) + return failure(); + + rewriter.replaceOp(convOp, *result); + return success(); +} + +static ConvLoweringState makeGroupedConvLoweringState( + const ConvLoweringState& parent, Value groupX, Value groupW, Value groupB, RankedTensorType groupOutType) { + ConvLoweringState state = parent; + state.x = groupX; + state.w = groupW; + state.b = groupB; + state.xType = cast(groupX.getType()); + state.wType = cast(groupW.getType()); + state.outType = groupOutType; + state.batchSize = state.xType.getDimSize(0); + state.numChannelsIn = state.xType.getDimSize(1); + state.xHeight = state.xType.getDimSize(2); + state.xWidth = state.xType.getDimSize(3); + state.numChannelsOut = state.wType.getDimSize(0); + state.wHeight = state.wType.getDimSize(2); + state.wWidth = state.wType.getDimSize(3); + state.outHeight = state.outType.getDimSize(2); + state.outWidth = state.outType.getDimSize(3); + state.group = 1; + state.numChannelsInPerGroup = state.numChannelsIn; + state.numChannelsOutPerGroup = state.numChannelsOut; + state.hasBias = !isa(groupB.getDefiningOp()); + return state; +} + +static LogicalResult +rewriteGroupedConv(ONNXConvOp convOp, const ConvLoweringState& state, ConversionPatternRewriter& rewriter) { + SmallVector xSlices = sliceTensor(state.x, /*axis=*/1, state.numChannelsInPerGroup, rewriter, convOp.getLoc()); + SmallVector wSlices = + sliceTensor(state.w, /*axis=*/0, state.numChannelsOutPerGroup, rewriter, convOp.getLoc()); SmallVector bSlices; - if (hasB) { - auto biasType = cast(b.getType()); + if (state.hasBias) { + auto biasType = cast(state.b.getType()); int64_t biasAxis = -1; if (biasType.getRank() == 1) biasAxis = 0; @@ -739,50 +1241,38 @@ LogicalResult ConvToGemm::matchAndRewrite(ONNXConvOp convOp, << biasType.getRank(); return failure(); } - bSlices = sliceTensor(b, biasAxis, numChannelsOutPerGroup, rewriter, loc); + bSlices = sliceTensor(state.b, biasAxis, state.numChannelsOutPerGroup, rewriter, convOp.getLoc()); } - if (xSlices.size() != static_cast(group) || wSlices.size() != static_cast(group) - || (hasB && bSlices.size() != static_cast(group))) { + if (xSlices.size() != static_cast(state.group) || wSlices.size() != static_cast(state.group) + || (state.hasBias && bSlices.size() != static_cast(state.group))) { convOp.emitOpError("failed to partition grouped convolution operands for Spatial lowering"); return failure(); } SmallVector groupResults; - groupResults.reserve(group); - auto groupOutType = - RankedTensorType::get({batchSize, numChannelsOutPerGroup, outHeight, outWidth}, outType.getElementType()); - Value noBias = ONNXNoneOp::create(rewriter, loc, rewriter.getNoneType()); - for (int64_t groupId = 0; groupId < group; groupId++) { + groupResults.reserve(state.group); + auto groupOutType = RankedTensorType::get( + {state.batchSize, state.numChannelsOutPerGroup, state.outHeight, state.outWidth}, state.outType.getElementType()); + Value noBias = ONNXNoneOp::create(rewriter, convOp.getLoc(), rewriter.getNoneType()); + for (int64_t groupId = 0; groupId < state.group; groupId++) { Value groupX = xSlices[groupId]; Value groupW = wSlices[groupId]; - Value groupB = hasB ? bSlices[groupId] : noBias; - groupResults.push_back(lowerSingleConvGroup(groupX, - groupW, - groupB, - cast(groupX.getType()), - cast(groupW.getType()), - groupOutType, - padHeightBegin, - padHeightEnd, - padWidthBegin, - padWidthEnd, - strideHeight, - strideWidth, - dilationHeight, - dilationWidth, - rewriter, - loc)); + Value groupB = state.hasBias ? bSlices[groupId] : noBias; + ConvLoweringState groupState = makeGroupedConvLoweringState(state, groupX, groupW, groupB, groupOutType); + groupResults.push_back(standard::rewriteConv(groupState, rewriter, convOp.getLoc())); } Value result; if (llvm::all_of(groupResults, isCompileTimeComputable)) { - result = createSpatConcat(rewriter, loc, /*axis=*/1, groupResults); + result = createSpatConcat(rewriter, convOp.getLoc(), /*axis=*/1, groupResults); } else { - auto concatCompute = createSpatCompute(rewriter, loc, TypeRange {outType}, {}, groupResults, [&](ValueRange args) { - spatial::SpatYieldOp::create(rewriter, loc, createSpatConcat(rewriter, loc, /*axis=*/1, args)); - }); + auto concatCompute = + createSpatCompute(rewriter, convOp.getLoc(), TypeRange {state.outType}, {}, groupResults, [&](ValueRange args) { + spatial::SpatYieldOp::create( + rewriter, convOp.getLoc(), createSpatConcat(rewriter, convOp.getLoc(), /*axis=*/1, args)); + }); result = concatCompute.getResult(0); } @@ -790,6 +1280,27 @@ LogicalResult ConvToGemm::matchAndRewrite(ONNXConvOp convOp, return success(); } +} // namespace + +LogicalResult ConvToGemm::matchAndRewrite(ONNXConvOp convOp, + ONNXConvOpAdaptor convOpAdaptor, + ConversionPatternRewriter& rewriter) const { + FailureOr state = analyzeConvLoweringState(convOp, convOpAdaptor); + if (failed(state)) + return failure(); + + if (isDepthwiseConv(state->group, state->numChannelsIn, state->numChannelsOut, state->numChannelsInPerGroup)) { + if (depthwise::canUseStructuredRewrite(*state)) + return rewriteDepthwiseConv(convOp, *state, rewriter); + return rewriteGroupedConv(convOp, *state, rewriter); + } + + if (state->group == 1) + return rewriteUngroupedConv(convOp, *state, rewriter); + + return rewriteGroupedConv(convOp, *state, rewriter); +} + void populateConvPatterns(RewritePatternSet& patterns, MLIRContext* ctx) { patterns.insert(ctx); } } // namespace onnx_mlir diff --git a/validation/operations/conv/grouped_many_groups/conv_grouped_many_groups.onnx b/validation/operations/conv/grouped_many_groups/conv_grouped_many_groups.onnx index 7df7a8e696d67c36f0dc528a357c908cd40e767b..53e138f88e2ee204b7888915ad17eb47acb4a0d7 100644 GIT binary patch delta 42 ycmccIC~&!vg^h#P>Ubl|M79cH7LEoE4gn5E4n_e+C&qBEh6a|#iBl)CH~|3f;R>|? delta 198199 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%0D|cR4mBaZbxI})Z$V#hxD0BQm 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