diff --git a/src/PIM/Compiler/PimCodeGen.cpp b/src/PIM/Compiler/PimCodeGen.cpp index 873fe21..1312fa9 100644 --- a/src/PIM/Compiler/PimCodeGen.cpp +++ b/src/PIM/Compiler/PimCodeGen.cpp @@ -695,13 +695,16 @@ void PimCodeGen::codeGenSendOp(pim::PimSendOp sendOp, const StaticValueKnowledge void PimCodeGen::codeGenWaitOp( pim::PimWaitOp waitOp, const StaticValueKnowledge& knowledge) const { auto eventRegister = indexOf(waitOp.getEventRegister(), knowledge); - assert(succeeded(eventRegister) - && "pim.wait event register must be statically resolvable during codegen"); + auto waitValue = indexOf(waitOp.getWaitValue(), knowledge); + assert(succeeded(eventRegister) && succeeded(waitValue) + && "pim.wait operands must be statically resolvable during codegen"); + if (*waitValue == 0) + return; pim_binary::InstructionRecord instruction; instruction.opcode = pim_binary::Opcode::wait; instruction.generic1 = pim::checkedI32OrCrash( *eventRegister, "wait event register"); - instruction.generic2 = waitOp.getWaitValue(); + instruction.generic2 = pim::checkedI32OrCrash(*waitValue, "wait value"); emitInstruction(instruction); } diff --git a/src/PIM/Compiler/PimCompilerUtils.cpp b/src/PIM/Compiler/PimCompilerUtils.cpp index d172285..f95b8ff 100644 --- a/src/PIM/Compiler/PimCompilerUtils.cpp +++ b/src/PIM/Compiler/PimCompilerUtils.cpp @@ -12,6 +12,7 @@ #include #include +#include "src/Accelerators/PIM/Common/PimCommon.hpp" #include "src/Accelerators/PIM/Compiler/PimCompilerOptions.hpp" #include "src/Accelerators/PIM/Compiler/PimCompilerUtils.hpp" #include "src/Accelerators/PIM/Conversion/ONNXToSpatial/ONNXToSpatialOptions.hpp" @@ -78,6 +79,7 @@ spatial::SchedulingTarget getDefaultPimSchedulingTarget() { target.residentWeightCapacity = crossbarCountInCore.getValue(); target.matrixRows = crossbarSize.getValue(); target.matrixColumns = crossbarSize.getValue(); + target.synchronizationRegisterCount = kPimEventRegisterCount; setDefaultPimInterProcessorLatencies(target); return target; diff --git a/src/PIM/Conversion/SpatialToPim/CoreLoweringPatterns.cpp b/src/PIM/Conversion/SpatialToPim/CoreLoweringPatterns.cpp index 4dc6101..02dad5b 100644 --- a/src/PIM/Conversion/SpatialToPim/CoreLoweringPatterns.cpp +++ b/src/PIM/Conversion/SpatialToPim/CoreLoweringPatterns.cpp @@ -368,11 +368,14 @@ LogicalResult raptor::SpatialToPimPass::lowerComputeOp(spatial::SpatScheduledCom return failure(); PimWaitOp::create( rewriter, receiveOp->getLoc(), hostWaitLoad.getEventRegister(), - rewriter.getI32IntegerAttr(1)); + hostWaitLoad.getWaitValue()); received = PimMemCopyHostToDevOp::create( rewriter, receiveOp->getLoc(), outputBuffer.getType(), zero, hostWaitLoad.getHostOffset(), outputBuffer, *hostBuffer, *sizeAttr) .getOutput(); + PimSyncOp::create( + rewriter, receiveOp->getLoc(), hostWaitLoad.getSourceCoreId(), + hostWaitLoad.getAcknowledgementEventRegister()); } else { received = PimReceiveOp::create( rewriter, receiveOp->getLoc(), outputBuffer.getType(), outputBuffer, diff --git a/src/PIM/Conversion/SpatialToPim/Patterns/ChannelLowering.cpp b/src/PIM/Conversion/SpatialToPim/Patterns/ChannelLowering.cpp index 08d2902..81f4537 100644 --- a/src/PIM/Conversion/SpatialToPim/Patterns/ChannelLowering.cpp +++ b/src/PIM/Conversion/SpatialToPim/Patterns/ChannelLowering.cpp @@ -147,15 +147,42 @@ struct HostWaitLoadLowering : OpRewritePattern { return failure(); auto wait = pim::PimWaitOp::create( rewriter, op.getLoc(), op.getEventRegister(), - rewriter.getI32IntegerAttr(1)); + op.getWaitValue()); copyRaptorDebugAttrs(op.getOperation(), wait.getOperation()); - return pim::PimMemCopyHostToDevOp::create( + Value output = pim::PimMemCopyHostToDevOp::create( rewriter, op.getLoc(), outputBuffer.getType(), zero, op.getHostOffset(), outputBuffer, *hostBuffer, sizeAttr).getOutput(); + auto sync = pim::PimSyncOp::create( + rewriter, op.getLoc(), op.getSourceCoreId(), + op.getAcknowledgementEventRegister()); + copyRaptorDebugAttrs(op.getOperation(), sync.getOperation()); + return output; }); } }; +struct SyncLowering : OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(spatial::SpatSyncOp op, + PatternRewriter& rewriter) const override { + rewriter.replaceOpWithNewOp( + op, op.getTargetCoreId(), op.getEventRegister()); + return success(); + } +}; + +struct WaitLowering : OpRewritePattern { + using OpRewritePattern::OpRewritePattern; + + LogicalResult matchAndRewrite(spatial::SpatWaitOp op, + PatternRewriter& rewriter) const override { + rewriter.replaceOpWithNewOp( + op, op.getEventRegister(), op.getWaitValue()); + return success(); + } +}; + struct ExtractRowsLowering : OpRewritePattern { using OpRewritePattern::OpRewritePattern; @@ -200,7 +227,8 @@ struct ConcatLowering : OpRewritePattern { void populateChannelLoweringPatterns(RewritePatternSet& patterns) { patterns.add(patterns.getContext()); + SyncLowering, WaitLowering, ExtractRowsLowering, + ConcatLowering>(patterns.getContext()); } } // namespace onnx_mlir diff --git a/src/PIM/Conversion/SpatialToPim/SpatialToPimPass.cpp b/src/PIM/Conversion/SpatialToPim/SpatialToPimPass.cpp index f9b4ebd..70db2d9 100644 --- a/src/PIM/Conversion/SpatialToPim/SpatialToPimPass.cpp +++ b/src/PIM/Conversion/SpatialToPim/SpatialToPimPass.cpp @@ -128,6 +128,8 @@ void onnx_mlir::raptor::SpatialToPimPass::runOnOperation() { spatial::SpatChannelSendOp, spatial::SpatHostStoreSyncOp, spatial::SpatHostWaitLoadOp, + spatial::SpatSyncOp, + spatial::SpatWaitOp, spatial::SpatExtractRowsOp>(); RewritePatternSet initialPatterns(ctx); @@ -223,6 +225,8 @@ void onnx_mlir::raptor::SpatialToPimPass::runOnOperation() { spatial::SpatChannelSendOp, spatial::SpatHostStoreSyncOp, spatial::SpatHostWaitLoadOp, + spatial::SpatSyncOp, + spatial::SpatWaitOp, spatial::SpatExtractRowsOp>(); SmallVector coreOps; @@ -274,6 +278,8 @@ void onnx_mlir::raptor::SpatialToPimPass::runOnOperation() { spatial::SpatChannelSendOp, spatial::SpatHostStoreSyncOp, spatial::SpatHostWaitLoadOp, + spatial::SpatSyncOp, + spatial::SpatWaitOp, spatial::SpatExtractRowsOp>(); RewritePatternSet communicationPatterns(ctx); diff --git a/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/ContiguityPatterns.cpp b/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/ContiguityPatterns.cpp index 2e70a85..48172a5 100644 --- a/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/ContiguityPatterns.cpp +++ b/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/ContiguityPatterns.cpp @@ -302,12 +302,19 @@ static FailureOr getShapedByteSize(MemRefType type) { return static_cast(*byteSize); } -static FailureOr> +struct LogicalCopyShape { + SmallVector dimensions; + Type elementType; +}; + +static bool isPackedByteBuffer(MemRefType type) { + return type.getRank() == 1 && type.getElementType().isInteger(8); +} + +static FailureOr inferLogicalCopyShape(MemRefType targetType, MemRefType sourceType, int64_t size) { if (!targetType.hasStaticShape() || !sourceType.hasStaticShape()) return failure(); - if (targetType.getElementType() != sourceType.getElementType() || targetType.getRank() != sourceType.getRank()) - return failure(); auto targetBytes = getShapedByteSize(targetType); auto sourceBytes = getShapedByteSize(sourceType); @@ -316,18 +323,37 @@ inferLogicalCopyShape(MemRefType targetType, MemRefType sourceType, int64_t size bool targetMatches = *targetBytes == size; bool sourceMatches = *sourceBytes == size; - if (targetMatches && sourceMatches && targetType.getShape() != sourceType.getShape()) + bool matchingTypes = targetType.getElementType() == sourceType.getElementType() + && targetType.getRank() == sourceType.getRank(); + if (matchingTypes) { + if (targetMatches && sourceMatches + && targetType.getShape() != sourceType.getShape()) + return failure(); + MemRefType logicalType = targetMatches ? targetType : sourceType; + if (targetMatches || sourceMatches) + return LogicalCopyShape { + SmallVector(logicalType.getShape()), + logicalType.getElementType()}; return failure(); - if (targetMatches) - return SmallVector(targetType.getShape().begin(), targetType.getShape().end()); - if (sourceMatches) - return SmallVector(sourceType.getShape().begin(), sourceType.getShape().end()); + } + if (targetMatches && isPackedByteBuffer(sourceType)) + return LogicalCopyShape { + SmallVector(targetType.getShape()), + targetType.getElementType()}; + if (sourceMatches && isPackedByteBuffer(targetType)) + return LogicalCopyShape { + SmallVector(sourceType.getShape()), + sourceType.getElementType()}; return failure(); } -static FailureOr getContiguousSuffixRank(Value value, ArrayRef copyShape) { +static FailureOr getContiguousSuffixRank( + Value value, ArrayRef copyShape, Type elementType = {}) { auto type = dyn_cast(value.getType()); + if (type && elementType && isPackedByteBuffer(type)) + return copyShape.size(); if (!type || !type.hasStaticShape() || !hasByteSizedElementType(type.getElementType()) + || (elementType && type.getElementType() != elementType) || type.getRank() != static_cast(copyShape.size())) return failure(); if (llvm::any_of(copyShape, [](int64_t dim) { return dim <= 0; })) @@ -351,6 +377,30 @@ static FailureOr getContiguousSuffixRank(Value value, ArrayRef return contiguousSuffixRank; } +static FailureOr> getOuterByteStrides( + Value value, const LogicalCopyShape ©Shape, size_t outerRank) { + auto type = cast(value.getType()); + SmallVector strides; + if (isPackedByteBuffer(type)) + strides = computeRowMajorStrides(copyShape.dimensions); + else { + auto proven = getProvenMemRefStrides(value); + if (failed(proven)) + return failure(); + strides = std::move(*proven); + } + int64_t elementByteWidth = static_cast( + getElementTypeSizeInBytes(copyShape.elementType)); + SmallVector result; + for (int64_t stride : ArrayRef(strides).take_front(outerRank)) { + auto byteStride = checkedPositiveMul(stride, elementByteWidth); + if (failed(byteStride)) + return failure(); + result.push_back(*byteStride); + } + return result; +} + static FailureOr analyzeCopyEndpoint(Value value, Value initialByteOffset, MemRefType logicalType) { if (!logicalType.hasStaticShape() || !hasByteSizedElementType(logicalType.getElementType())) return failure(); @@ -448,8 +498,10 @@ analyzeCopyRewrite(Value target, Value source, Value targetOffset, Value sourceO if (failed(logicalCopyShape)) return failure(); - auto targetSuffixRank = getContiguousSuffixRank(target, *logicalCopyShape); - auto sourceSuffixRank = getContiguousSuffixRank(source, *logicalCopyShape); + auto targetSuffixRank = getContiguousSuffixRank( + target, logicalCopyShape->dimensions, logicalCopyShape->elementType); + auto sourceSuffixRank = getContiguousSuffixRank( + source, logicalCopyShape->dimensions, logicalCopyShape->elementType); if (failed(targetSuffixRank) || failed(sourceSuffixRank)) return failure(); @@ -458,23 +510,24 @@ analyzeCopyRewrite(Value target, Value source, Value targetOffset, Value sourceO plan.source = *sourcePlan; int64_t contiguousSuffixRank = std::min(*targetSuffixRank, *sourceSuffixRank); - if (contiguousSuffixRank == static_cast(logicalCopyShape->size())) { + if (contiguousSuffixRank + == static_cast(logicalCopyShape->dimensions.size())) { plan.kind = CopyRewritePlan::Kind::Direct; plan.directBytes = size; return plan; } - auto targetStrides = getProvenMemRefStrides(target); - auto sourceStrides = getProvenMemRefStrides(source); - if (failed(targetStrides) || failed(sourceStrides)) - return failure(); - - int64_t elementByteWidth = static_cast(getElementTypeSizeInBytes(targetType.getElementType())); + int64_t elementByteWidth = static_cast( + getElementTypeSizeInBytes(logicalCopyShape->elementType)); plan.kind = CopyRewritePlan::Kind::Loop; plan.loop.targetBaseOffset = plan.target.offset; plan.loop.sourceBaseOffset = plan.source.offset; - plan.loop.outerShape.assign(logicalCopyShape->begin(), logicalCopyShape->end() - contiguousSuffixRank); - SmallVector chunkShape(logicalCopyShape->end() - contiguousSuffixRank, logicalCopyShape->end()); + plan.loop.outerShape.assign( + logicalCopyShape->dimensions.begin(), + logicalCopyShape->dimensions.end() - contiguousSuffixRank); + SmallVector chunkShape( + logicalCopyShape->dimensions.end() - contiguousSuffixRank, + logicalCopyShape->dimensions.end()); auto outerElements = checkedPositiveProduct(plan.loop.outerShape); auto chunkElements = checkedPositiveProduct(chunkShape); auto chunkBytes = failed(chunkElements) @@ -484,18 +537,14 @@ analyzeCopyRewrite(Value target, Value source, Value targetOffset, Value sourceO return failure(); plan.loop.outerElements = *outerElements; plan.loop.chunkBytes = *chunkBytes; - for (int64_t stride : ArrayRef(*targetStrides).take_front(plan.loop.outerShape.size())) { - auto byteStride = checkedPositiveMul(stride, elementByteWidth); - if (failed(byteStride)) - return failure(); - plan.loop.targetOuterByteStrides.push_back(*byteStride); - } - for (int64_t stride : ArrayRef(*sourceStrides).take_front(plan.loop.outerShape.size())) { - auto byteStride = checkedPositiveMul(stride, elementByteWidth); - if (failed(byteStride)) - return failure(); - plan.loop.sourceOuterByteStrides.push_back(*byteStride); - } + auto targetStrides = getOuterByteStrides( + target, *logicalCopyShape, plan.loop.outerShape.size()); + auto sourceStrides = getOuterByteStrides( + source, *logicalCopyShape, plan.loop.outerShape.size()); + if (failed(targetStrides) || failed(sourceStrides)) + return failure(); + plan.loop.targetOuterByteStrides = std::move(*targetStrides); + plan.loop.sourceOuterByteStrides = std::move(*sourceStrides); if (plan.loop.chunkBytes <= 0) return failure(); return plan; diff --git a/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/PimBufferizationPass.cpp b/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/PimBufferizationPass.cpp index 7988e3f..33c3c40 100644 --- a/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/PimBufferizationPass.cpp +++ b/src/PIM/Dialect/Pim/Passes/Transforms/Bufferization/PimBufferizationPass.cpp @@ -602,18 +602,30 @@ static LogicalResult normalizePimMemory(ModuleOp moduleOp, func::FuncOp funcOp) PatternRewriter rewriter(ctx); SmallVector copyWorklist; + SmallVector hostToHostCopies; llvm::SmallPtrSet seenCopyOps; + llvm::SmallPtrSet seenHostToHostCopies; auto addCopyOp = [&](memref::CopyOp copyOp, const StaticValueKnowledge& knowledge) { if (seenCopyOps.insert(copyOp.getOperation()).second) copyWorklist.push_back({copyOp, knowledge}); }; + auto collectCopy = [&](Operation &op, + const StaticValueKnowledge &knowledge) { + if (auto copyOp = dyn_cast(&op)) + addCopyOp(copyOp, knowledge); + if (auto copyOp = dyn_cast(&op); + copyOp + && isHostBackedPimAddress(copyOp.getDeviceSource(), knowledge) + && isHostBackedPimAddress(copyOp.getHostTarget(), knowledge) + && seenHostToHostCopies.insert(copyOp).second) + hostToHostCopies.push_back(copyOp); + }; moduleOp.walk([&](pim::PimCoreOp coreOp) { StaticValueKnowledge knowledge = seedCoreKnowledge(coreOp); (void) walkPimCoreBlockStructurally( coreOp.getBody().front(), knowledge, [&](Operation& op, const StaticValueKnowledge& opKnowledge) { - if (auto copyOp = dyn_cast(&op)) - addCopyOp(copyOp, opKnowledge); + collectCopy(op, opKnowledge); return success(); }); }); @@ -622,8 +634,7 @@ static LogicalResult normalizePimMemory(ModuleOp moduleOp, func::FuncOp funcOp) StaticValueKnowledge knowledge = seedCoreBatchKnowledge(coreBatchOp, lane); (void) walkPimCoreBlockStructurally( coreBatchOp.getBody().front(), knowledge, [&](Operation& op, const StaticValueKnowledge& opKnowledge) { - if (auto copyOp = dyn_cast(&op)) - addCopyOp(copyOp, opKnowledge); + collectCopy(op, opKnowledge); return success(); }); } @@ -631,6 +642,22 @@ static LogicalResult normalizePimMemory(ModuleOp moduleOp, func::FuncOp funcOp) bool hasFailed = false; Value zeroOffset = getOrCreateIndexConstant(rewriter, funcOp, 0); + for (PimMemCopyDevToHostOp copyOp : hostToHostCopies) { + rewriter.setInsertionPoint(copyOp); + auto scratchType = MemRefType::get( + {copyOp.getSize()}, rewriter.getI8Type()); + Value scratch = memref::AllocOp::create( + rewriter, copyOp.getLoc(), scratchType); + auto load = PimMemCopyHostToDevOp::create( + rewriter, copyOp.getLoc(), scratchType, zeroOffset, + copyOp.getDeviceSourceOffset(), scratch, copyOp.getDeviceSource(), + copyOp.getSizeAttr()); + auto store = PimMemCopyDevToHostOp::create( + rewriter, copyOp.getLoc(), copyOp.getHostTarget().getType(), + copyOp.getHostTargetOffset(), zeroOffset, copyOp.getHostTarget(), + load.getOutput(), copyOp.getSizeAttr()); + rewriter.replaceOp(copyOp, store.getOutput()); + } for (const MemRefCopyWorkItem& workItem : copyWorklist) { memref::CopyOp copyOp = workItem.copyOp; rewriter.setInsertionPoint(copyOp); diff --git a/src/PIM/Dialect/Pim/Pim.td b/src/PIM/Dialect/Pim/Pim.td index 80a67d9..f0a7b9a 100644 --- a/src/PIM/Dialect/Pim/Pim.td +++ b/src/PIM/Dialect/Pim/Pim.td @@ -136,7 +136,7 @@ def PimWaitOp : PimOp<"wait", []> { let arguments = (ins Index:$eventRegister, - I32Attr:$waitValue + Index:$waitValue ); let assemblyFormat = [{ diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.cpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.cpp index e685537..72edd54 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.cpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.cpp @@ -242,11 +242,146 @@ static void appendReceive(BoundaryProgram &boundary, target.collection, {slice}, {0, 1}, {target.position}, {lanes}, lanes}); } +struct HostTransferRef { + ExternalTransferFamily *family = nullptr; + size_t index = 0; +}; + +static unsigned getBarrierRoundCount(size_t coreCount) { + unsigned rounds = 0; + for (size_t distance = 1; distance < coreCount; distance *= 2) + ++rounds; + return rounds; +} + +static LogicalResult assignPipelineSynchronization( + DeferredTransferPlan &transfers, + ArrayRef boundaries, + size_t synchronizationRegisterCount) { + bool pipelined = false; + for (ScheduledInfo &scheduled : transfers.scheduled) { + if (scheduled.pipelineStages.empty()) + continue; + pipelined = true; + llvm::append_range(transfers.downstreamCores, scheduled.cores); + for (auto [core, stage] : + llvm::zip_equal(scheduled.cores, scheduled.pipelineStages)) + if (stage == 0) + transfers.stageZeroCores.push_back(core); + } + if (!pipelined) + return success(); + transfers.synchronizationRegisterCount = synchronizationRegisterCount; + llvm::sort(transfers.stageZeroCores); + transfers.stageZeroCores.erase( + llvm::unique(transfers.stageZeroCores), transfers.stageZeroCores.end()); + llvm::sort(transfers.downstreamCores); + transfers.downstreamCores.erase( + llvm::unique(transfers.downstreamCores), + transfers.downstreamCores.end()); + llvm::erase_if(transfers.downstreamCores, [&](int64_t core) { + return llvm::is_contained(transfers.stageZeroCores, core); + }); + + DenseMap> incomingByCore; + DenseMap> eventRegisters; + DenseMap> waitValues; + DenseMap> acknowledgementRegisters; + auto initialize = [&](ExternalTransferFamily &family) { + size_t count = family.targetCores.size(); + eventRegisters.try_emplace(&family, count, 0); + waitValues.try_emplace(&family, count, 0); + acknowledgementRegisters.try_emplace(&family, count, 0); + }; + for (const BoundaryProgram &boundary : boundaries) + for (const BoundaryInstruction &instruction : boundary.instructions) { + auto *receive = std::get_if(&instruction); + if (!receive || receive->slices.empty() + || !receive->slices.front().family->hostRouted) + continue; + for (const ScheduledTransferSlice &slice : receive->slices) { + ExternalTransferFamily &family = *slice.family; + initialize(family); + for (size_t offset = 0; offset < slice.transferCount; ++offset) { + size_t index = slice.familyOffset + offset; + int64_t source = family.sourceCores.valueAt(index); + int64_t target = family.targetCores.valueAt(index); + incomingByCore[target].push_back({&family, index}); + ++transfers.hostAcknowledgementCounts[source]; + } + } + } + + unsigned barrierRounds = getBarrierRoundCount( + transfers.stageZeroCores.size()); + bool stageZeroNeedsAcknowledgements = llvm::any_of( + transfers.stageZeroCores, [&](int64_t core) { + return transfers.hostAcknowledgementCounts.contains(core); + }); + for (auto &[target, incoming] : incomingByCore) { + bool needsAcknowledgementRegister = + transfers.hostAcknowledgementCounts.contains(target); + bool stageZero = llvm::is_contained(transfers.stageZeroCores, target); + size_t reserved = stageZero + ? barrierRounds + (stageZeroNeedsAcknowledgements ? 1 : 0) + : 1 + (needsAcknowledgementRegister ? 1 : 0); + if (reserved >= synchronizationRegisterCount) { + incoming.front().family->requirement->exchange->deferred.emitOpError( + "pipeline synchronization leaves no event register for incoming host transfers"); + return failure(); + } + size_t groupCount = std::min( + incoming.size(), synchronizationRegisterCount - reserved); + // One wait consumes a complete consecutive group of producer signals. + SmallVector groupSizes(groupCount); + for (size_t ordinal = 0; ordinal < incoming.size(); ++ordinal) + ++groupSizes[ordinal * groupCount / incoming.size()]; + SmallVector first(groupCount, true); + for (size_t ordinal = 0; ordinal < incoming.size(); ++ordinal) { + size_t group = ordinal * groupCount / incoming.size(); + HostTransferRef transfer = incoming[ordinal]; + eventRegisters[transfer.family][transfer.index] = group; + acknowledgementRegisters[transfer.family][transfer.index] = + synchronizationRegisterCount - 1; + if (first[group]) { + waitValues[transfer.family][transfer.index] = groupSizes[group]; + first[group] = false; + } + } + } + for (auto &[family, values] : eventRegisters) { + family->eventRegisters = StaticIntSequence::fromValues(values); + family->waitValues = StaticIntSequence::fromValues(waitValues[family]); + family->acknowledgementEventRegisters = + StaticIntSequence::fromValues(acknowledgementRegisters[family]); + } + + if (!transfers.stageZeroCores.empty()) { + size_t reserved = barrierRounds + + (stageZeroNeedsAcknowledgements ? 1 : 0); + if (reserved > synchronizationRegisterCount) + return transfers.scheduled.front().op->emitOpError( + "pipeline stage-zero barrier requires more synchronization registers than the target provides"); + } + if (!transfers.downstreamCores.empty()) { + bool needsAcknowledgements = llvm::any_of( + transfers.downstreamCores, [&](int64_t core) { + return transfers.hostAcknowledgementCounts.contains(core); + }); + if (1 + (needsAcknowledgements ? 1 : 0) + > synchronizationRegisterCount) + return transfers.scheduled.front().op->emitOpError( + "pipeline stage-zero release requires more synchronization registers than the target provides"); + } + return success(); +} + } // namespace FailureOr buildDeferredBoundaryPlan( DeferredTransferPlan &transfers, - const ScheduledCommunicationPlan &schedule) { + const ScheduledCommunicationPlan &schedule, + size_t synchronizationRegisterCount) { DeferredBoundaryPlan result; SmallVector boundaries; DenseMap indices; @@ -373,6 +508,9 @@ FailureOr buildDeferredBoundaryPlan( return std::tie(scheduledOrder[lhs.key.first], lhs.key.second) < std::tie(scheduledOrder[rhs.key.first], rhs.key.second); }); + if (failed(assignPipelineSynchronization( + transfers, boundaries, synchronizationRegisterCount))) + return failure(); result.boundaries = std::move(boundaries); return result; } diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.hpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.hpp index 748374d..2d7db41 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.hpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryPlanning.hpp @@ -53,6 +53,7 @@ struct DeferredBoundaryPlan { }; mlir::FailureOr buildDeferredBoundaryPlan(DeferredTransferPlan& transfers, - const ScheduledCommunicationPlan& schedule); + const ScheduledCommunicationPlan& schedule, + size_t synchronizationRegisterCount); } // namespace onnx_mlir::spatial diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.cpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.cpp index 28c0e14..6ca51c0 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.cpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.cpp @@ -4,6 +4,7 @@ #include "DeferredBoundaryRealization.hpp" #include "DeferredProjectionAnalysis.hpp" #include "DeferredResultRealization.hpp" +#include "DeferredTransferPlanning.hpp" #include "src/Accelerators/PIM/Common/IR/LoopUtils.hpp" #include "src/Accelerators/PIM/Common/IR/StaticIntGrid.hpp" #include "src/Accelerators/PIM/Common/IR/StaticIntSequence.hpp" @@ -21,6 +22,8 @@ struct LogicalTransferMetadataView { StaticIntSequenceChain targetCores; StaticIntSequenceChain hostOffsets; StaticIntSequenceChain eventRegisters; + StaticIntSequenceChain waitValues; + StaticIntSequenceChain acknowledgementEventRegisters; StaticIntSequenceChain targetLanes; StaticIntSequenceChain localOffsets; SmallVector projectionOffsets; @@ -91,6 +94,9 @@ static void appendMetadata(const ScheduledTransferSlice &slice, LogicalTransferM metadata.hostOffsets.append(family.hostOffsets, familyIndex, count); metadata.eventRegisters.append( family.eventRegisters, familyIndex, count); + metadata.waitValues.append(family.waitValues, familyIndex, count); + metadata.acknowledgementEventRegisters.append( + family.acknowledgementEventRegisters, familyIndex, count); } metadata.targetLanes.append(StaticIntSequence::affine(targetLane, 1, count)); if (family.requirement->producerLocalOffsets) @@ -296,13 +302,21 @@ static FailureOr emitReceiveValue(ArrayRef slices if (failed(grids)) return failure(); std::optional hostOffsets; std::optional eventRegisters; + std::optional waitValues; + std::optional acknowledgementEventRegisters; if (slices.front().family->hostRouted) { auto offsets = buildGrid(metadata.hostOffsets); auto events = buildGrid(metadata.eventRegisters); - if (failed(offsets) || failed(events)) + auto waits = buildGrid(metadata.waitValues); + auto acknowledgements = buildGrid( + metadata.acknowledgementEventRegisters); + if (failed(offsets) || failed(events) || failed(waits) + || failed(acknowledgements)) return failure(); hostOffsets = std::move(*offsets); eventRegisters = std::move(*events); + waitValues = std::move(*waits); + acknowledgementEventRegisters = std::move(*acknowledgements); } Value position = lane ? lane : context.constants.getIndex(0); Value row = context.constants.getIndex(0); @@ -319,6 +333,10 @@ static FailureOr emitReceiveValue(ArrayRef slices hostOffsets->emitLookup( row, position, anchor, context.constants, context.rewriter, anchor->getLoc()), eventRegisters->emitLookup( + row, position, anchor, context.constants, context.rewriter, anchor->getLoc()), + waitValues->emitLookup( + row, position, anchor, context.constants, context.rewriter, anchor->getLoc()), + acknowledgementEventRegisters->emitLookup( row, position, anchor, context.constants, context.rewriter, anchor->getLoc())); receive = op; output = op.getOutput(); @@ -387,6 +405,8 @@ static FailureOr emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V std::optional positions; std::optional hostOffsets; std::optional eventRegisters; + std::optional waitValues; + std::optional acknowledgementEventRegisters; bool hostRouted = run.slices.front().family->hostRouted; auto metadataByEntry = buildRectangularReceiveMetadata(run, laneCount); if (succeeded(metadataByEntry)) { @@ -402,10 +422,17 @@ static FailureOr emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V &LogicalTransferMetadataView::hostOffsets); auto events = buildRows( &LogicalTransferMetadataView::eventRegisters); - if (failed(offsets) || failed(events)) + auto waits = buildRows( + &LogicalTransferMetadataView::waitValues); + auto acknowledgements = buildRows( + &LogicalTransferMetadataView::acknowledgementEventRegisters); + if (failed(offsets) || failed(events) || failed(waits) + || failed(acknowledgements)) return failure(); hostOffsets = std::move(*offsets); eventRegisters = std::move(*events); + waitValues = std::move(*waits); + acknowledgementEventRegisters = std::move(*acknowledgements); } SmallVector positionRows; for (unsigned position : run.positions) @@ -456,10 +483,17 @@ static FailureOr emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V &LogicalTransferMetadataView::hostOffsets); auto events = buildGrid( &LogicalTransferMetadataView::eventRegisters); - if (failed(offsets) || failed(events)) + auto waits = buildGrid( + &LogicalTransferMetadataView::waitValues); + auto acknowledgements = buildGrid( + &LogicalTransferMetadataView::acknowledgementEventRegisters); + if (failed(offsets) || failed(events) || failed(waits) + || failed(acknowledgements)) return failure(); hostOffsets = std::move(*offsets); eventRegisters = std::move(*events); + waitValues = std::move(*waits); + acknowledgementEventRegisters = std::move(*acknowledgements); } SmallVector positionColumns; for (const StaticIntSequenceChain &values : positionsByLane) @@ -491,6 +525,10 @@ static FailureOr emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V hostOffsets->emitLookup( entry, runtimeLane, anchor, context.constants, context.rewriter, loc), eventRegisters->emitLookup( + entry, runtimeLane, anchor, context.constants, context.rewriter, loc), + waitValues->emitLookup( + entry, runtimeLane, anchor, context.constants, context.rewriter, loc), + acknowledgementEventRegisters->emitLookup( entry, runtimeLane, anchor, context.constants, context.rewriter, loc)); receive = op; output = op.getOutput(); @@ -1158,9 +1196,199 @@ static LogicalResult emitBoundary(const BoundaryProgram &boundary, ArrayRef stageZeroRank; + for (auto [rank, core] : llvm::enumerate(transfers.stageZeroCores)) + stageZeroRank[core] = rank; + DenseMap downstreamRank; + for (auto [rank, core] : llvm::enumerate(transfers.downstreamCores)) + downstreamRank[core] = rank; + auto getReleaseRegister = [&](int64_t core) { + return acknowledgementRegister + - (transfers.hostAcknowledgementCounts.contains(core) ? 1 : 0); + }; + + for (ScheduledInfo &scheduled : transfers.scheduled) { + Block *block = scheduled.blocks.front(); + context.rewriter.setInsertionPoint(block->getTerminator()); + Location loc = scheduled.op->getLoc(); + Value lane; + if (auto batch = dyn_cast(scheduled.op)) + lane = *batch.getLaneArgument(); + + SmallVector acknowledgementCounts, releaseRegisters; + SmallVector releaseWaitValues, leftTargets, leftRegisters; + SmallVector rightTargets, rightRegisters; + LaneSet barrierLanes, leaderLanes, leftLanes, rightLanes; + for (auto [index, core] : llvm::enumerate(scheduled.cores)) { + acknowledgementCounts.push_back( + transfers.hostAcknowledgementCounts.lookup(core)); + if (stageZeroRank.contains(core)) + barrierLanes = barrierLanes.unite( + LaneSet::range(index, index + 1)); + if (!transfers.stageZeroCores.empty() + && core == transfers.stageZeroCores.front()) + leaderLanes = leaderLanes.unite(LaneSet::range(index, index + 1)); + + auto rank = downstreamRank.find(core); + if (rank == downstreamRank.end()) { + releaseRegisters.push_back(0); + releaseWaitValues.push_back(0); + leftTargets.push_back(core); + leftRegisters.push_back(0); + rightTargets.push_back(core); + rightRegisters.push_back(0); + continue; + } + releaseRegisters.push_back(getReleaseRegister(core)); + releaseWaitValues.push_back(1); + size_t left = 2 * rank->second + 1; + size_t right = left + 1; + if (left < transfers.downstreamCores.size()) { + int64_t child = transfers.downstreamCores[left]; + leftTargets.push_back(child); + leftRegisters.push_back(getReleaseRegister(child)); + leftLanes = leftLanes.unite(LaneSet::range(index, index + 1)); + } else { + leftTargets.push_back(core); + leftRegisters.push_back(0); + } + if (right < transfers.downstreamCores.size()) { + int64_t child = transfers.downstreamCores[right]; + rightTargets.push_back(child); + rightRegisters.push_back(getReleaseRegister(child)); + rightLanes = rightLanes.unite(LaneSet::range(index, index + 1)); + } else { + rightTargets.push_back(core); + rightRegisters.push_back(0); + } + } + Value runtimeLane = lane ? lane : context.constants.getIndex(0); + auto emitForLanes = [&](const LaneSet &active, auto emit) -> LogicalResult { + if (active.empty()) + return success(); + if (!lane) { + if (active.contains(0)) + emit(); + return success(); + } + auto condition = emitLaneCondition( + active, lane, scheduled.cores.size(), scheduled.op, context, loc); + if (failed(condition)) + return failure(); + auto conditional = scf::IfOp::create( + context.rewriter, loc, TypeRange {}, *condition, false); + OpBuilder::InsertionGuard guard(context.rewriter); + context.rewriter.setInsertionPoint( + conditional.getThenRegion().front().getTerminator()); + emit(); + return success(); + }; + Value acknowledgementCount = emitStaticIntLookup( + StaticIntSequence::fromValues(acknowledgementCounts), + runtimeLane, scheduled.op, + context.constants, context.rewriter, loc); + SpatWaitOp::create( + context.rewriter, loc, + context.constants.getIndex(acknowledgementRegister), + acknowledgementCount); + + // Dissemination barrier: every round doubles the covered stage-zero peers. + auto emitBarrier = [&]() { + for (unsigned round = 0; round < barrierRounds; ++round) { + SmallVector targets; + targets.reserve(scheduled.cores.size()); + size_t distance = size_t {1} << round; + for (int64_t core : scheduled.cores) { + auto rank = stageZeroRank.find(core); + targets.push_back(rank == stageZeroRank.end() + ? core + : transfers.stageZeroCores[ + (rank->second + distance) + % transfers.stageZeroCores.size()]); + } + Value target = emitStaticIntLookup( + StaticIntSequence::fromValues(targets), + runtimeLane, scheduled.op, + context.constants, context.rewriter, loc); + Value eventRegister = context.constants.getIndex( + firstBarrierRegister - round); + SpatSyncOp::create( + context.rewriter, loc, target, eventRegister); + SpatWaitOp::create( + context.rewriter, loc, eventRegister, + context.constants.getIndex(1)); + } + }; + if (barrierRounds > 0 + && failed(emitForLanes(barrierLanes, emitBarrier))) + return failure(); + + // Gate downstream restarts so no core advances the simulator input + // iteration ahead of stage zero. + if (!transfers.downstreamCores.empty() + && failed(emitForLanes(leaderLanes, [&]() { + int64_t root = transfers.downstreamCores.front(); + SpatSyncOp::create( + context.rewriter, loc, context.constants.getIndex(root), + context.constants.getIndex(getReleaseRegister(root))); + }))) + return failure(); + + Value releaseRegister = emitStaticIntLookup( + StaticIntSequence::fromValues(releaseRegisters), runtimeLane, + scheduled.op, context.constants, context.rewriter, loc); + Value releaseWaitValue = emitStaticIntLookup( + StaticIntSequence::fromValues(releaseWaitValues), runtimeLane, + scheduled.op, context.constants, context.rewriter, loc); + SpatWaitOp::create( + context.rewriter, loc, releaseRegister, releaseWaitValue); + + auto emitChild = [&](ArrayRef targets, + ArrayRef registers) { + Value target = emitStaticIntLookup( + StaticIntSequence::fromValues(targets), runtimeLane, scheduled.op, + context.constants, context.rewriter, loc); + Value eventRegister = emitStaticIntLookup( + StaticIntSequence::fromValues(registers), runtimeLane, scheduled.op, + context.constants, context.rewriter, loc); + SpatSyncOp::create(context.rewriter, loc, target, eventRegister); + }; + if (failed(emitForLanes(leftLanes, [&]() { + emitChild(leftTargets, leftRegisters); + })) + || failed(emitForLanes(rightLanes, [&]() { + emitChild(rightTargets, rightRegisters); + }))) + return failure(); + } + return success(); +} + } // namespace -LogicalResult realizeDeferredBoundaries(ArrayRef boundaries, ArrayRef results, DeferredEmissionContext &context, +LogicalResult realizeDeferredBoundaries(ArrayRef boundaries, ArrayRef results, + DeferredTransferPlan &transfers, DeferredEmissionContext &context, DeferredReplacementMap &replacements) { ScheduledInfo *scheduled = nullptr; for (const BoundaryProgram &boundary : boundaries) { @@ -1171,7 +1399,7 @@ LogicalResult realizeDeferredBoundaries(ArrayRef boundaries, Ar if (failed(emitBoundary(boundary, results, context, replacements))) return boundary.key.first->op->emitOpError("phase 2 failed to realize a communication boundary"); } - return success(); + return emitCompletionSynchronization(transfers, context); } } // namespace onnx_mlir::spatial diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.hpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.hpp index b41c9a0..00677c4 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.hpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredBoundaryRealization.hpp @@ -42,6 +42,7 @@ using DeferredReplacementMap = mlir::LogicalResult realizeDeferredBoundaries(mlir::ArrayRef boundaries, mlir::ArrayRef results, + DeferredTransferPlan& transfers, DeferredEmissionContext& context, DeferredReplacementMap& replacements); diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationModel.hpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationModel.hpp index 6ac6617..5f446a5 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationModel.hpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationModel.hpp @@ -236,6 +236,9 @@ struct ExternalTransferFamily { StaticIntSequence channelIds = StaticIntSequence::uniform(0, 1); StaticIntSequence hostOffsets = StaticIntSequence::uniform(0, 1); StaticIntSequence eventRegisters = StaticIntSequence::uniform(0, 1); + StaticIntSequence waitValues = StaticIntSequence::uniform(1, 1); + StaticIntSequence acknowledgementEventRegisters = + StaticIntSequence::uniform(0, 1); bool hostRouted = false; }; diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationRealization.cpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationRealization.cpp index a64dbbe..ee60db8 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationRealization.cpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredCommunicationRealization.cpp @@ -232,7 +232,8 @@ LogicalResult realizeDeferredCommunication(func::FuncOp funcOp, auto schedule = scheduleDeferredCommunication(funcOp, *transfers); if (failed(schedule) || failed(verifyPlannedCommunicationDeadlockFree(funcOp, transfers->stepCounts, *schedule))) return funcOp.emitOpError("phase 2 failed to schedule symbolic communication"); - auto boundaries = buildDeferredBoundaryPlan(*transfers, *schedule); + auto boundaries = buildDeferredBoundaryPlan( + *transfers, *schedule, target.synchronizationRegisterCount); if (failed(boundaries)) return funcOp.emitOpError("phase 2 failed to build sparse boundary programs"); @@ -242,7 +243,9 @@ LogicalResult realizeDeferredCommunication(func::FuncOp funcOp, ConstantPool constants(funcOp, rewriter); DeferredEmissionContext context(rewriter, constants); DeferredReplacementMap replacements; - if (failed(realizeDeferredBoundaries(boundaries->boundaries, boundaries->results, context, replacements))) + if (failed(realizeDeferredBoundaries( + boundaries->boundaries, boundaries->results, *transfers, + context, replacements))) return failure(); for (auto [op, replacement] : replacements) { if (op->getResult(0) == replacement) diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.cpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.cpp index a8ebdac..e855295 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.cpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.cpp @@ -322,8 +322,7 @@ static LogicalResult buildRequirementFamilies(DeferredTransferPlan& plan, static LogicalResult buildAvailabilityFamilies( DeferredTransferPlan &plan, DeferredExchangePlan& exchange, - uint64_t& nextChannel, - DenseMap>& eventRegistersByTarget) { + uint64_t& nextChannel) { enum class Availability { Local, Direct, Host }; for (RequirementFamily& requirement : exchange.requirements) { for (LaneInterval interval : requirement.targetLanes.intervals()) { @@ -357,18 +356,6 @@ static LogicalResult buildAvailabilityFamilies( family.channelIds = StaticIntSequence::affine(nextChannel, 1, count); family.hostRouted = runAvailability == Availability::Host; if (family.hostRouted) { - SmallVector eventRegisters; - for (int64_t targetCore : targetCores) { - auto ®isters = eventRegistersByTarget[targetCore]; - auto it = registers.try_emplace( - requirement.producer->core, registers.size()).first; - if (it->second >= kPimEventRegisterCount) - return exchange.deferred.emitOpError( - "pipeline host transfer requires more event registers than the target core provides"); - eventRegisters.push_back(it->second); - } - family.eventRegisters = StaticIntSequence::fromValues( - eventRegisters); auto fragmentType = dyn_cast( requirement.publicationFragmentType); auto fragmentBytes = fragmentType @@ -431,7 +418,6 @@ static LogicalResult buildExchanges(func::FuncOp funcOp, DeferredTransferPlan& p funcOp.walk([&](SpatDeferredCommunicationOp op) { deferredOps.push_back(op); }); GraphBatchPublicationCache publicationCache; uint64_t nextChannel = 0; - DenseMap> eventRegistersByTarget; for (SpatDeferredCommunicationOp deferred : deferredOps) { Operation* targetOp = deferred->getParentOfType(); if (!targetOp) @@ -451,8 +437,7 @@ static LogicalResult buildExchanges(func::FuncOp funcOp, DeferredTransferPlan& p exchange->program = std::move(*program); if (failed(buildRequirementFamilies(plan, *exchange, publicationCache))) return failure(); - if (failed(buildAvailabilityFamilies( - plan, *exchange, nextChannel, eventRegistersByTarget))) + if (failed(buildAvailabilityFamilies(plan, *exchange, nextChannel))) return failure(); plan.exchanges.push_back(std::move(exchange)); } diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.hpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.hpp index 0b26fd3..96d915d 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.hpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/DeferredTransferPlanning.hpp @@ -13,6 +13,10 @@ struct DeferredTransferPlan { llvm::DenseMap> producedByGraph; llvm::SmallVector> exchanges; llvm::SmallVector stepCounts; + llvm::DenseMap hostAcknowledgementCounts; + llvm::SmallVector stageZeroCores; + llvm::SmallVector downstreamCores; + size_t synchronizationRegisterCount = 0; size_t pipelineHostBufferBytes = 0; }; diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/ScheduledSpatialPasses.cpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/ScheduledSpatialPasses.cpp index f6fd9fd..dff6291 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/ScheduledSpatialPasses.cpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/ScheduledSpatialPasses.cpp @@ -89,6 +89,8 @@ struct ScheduleAndRealizeSpatialPass final return; } if (pipelineStages == 0 || target.processorCount % pipelineStages != 0 + || (pipelineStages > 1 + && target.synchronizationRegisterCount == 0) || target.residentWeightCapacity > std::numeric_limits::max() / pipelineStages) { moduleOp.emitError("ScheduleAndRealizeSpatial requires valid pipeline stages and resource counts"); diff --git a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/Scheduling/SchedulingTarget.hpp b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/Scheduling/SchedulingTarget.hpp index d607288..6f2c941 100644 --- a/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/Scheduling/SchedulingTarget.hpp +++ b/src/PIM/Dialect/Spatial/Passes/Transforms/MergeComputeNodes/Scheduling/SchedulingTarget.hpp @@ -23,6 +23,7 @@ struct SchedulingTarget { Cost transferWidthBytes = 8; Cost vectorWidth = 16; Cost vectorLatencyCycles = 4; + size_t synchronizationRegisterCount = 0; Cost matrixRows = 128; Cost matrixColumns = 128; diff --git a/src/PIM/Dialect/Spatial/Spatial.td b/src/PIM/Dialect/Spatial/Spatial.td index 83bc064..81bd576 100644 --- a/src/PIM/Dialect/Spatial/Spatial.td +++ b/src/PIM/Dialect/Spatial/Spatial.td @@ -592,13 +592,15 @@ def SpatHostStoreSyncOp : SpatOp<"host_store_sync", []> { } def SpatHostWaitLoadOp : SpatOp<"host_wait_load", []> { - let summary = "Wait for a producer and load its tensor from host memory"; + let summary = "Wait for producers, load from host memory, and acknowledge consumption"; let arguments = (ins Index:$sourceCoreId, Index:$targetCoreId, Index:$hostOffset, - Index:$eventRegister + Index:$eventRegister, + Index:$waitValue, + Index:$acknowledgementEventRegister ); let results = (outs @@ -607,7 +609,34 @@ def SpatHostWaitLoadOp : SpatOp<"host_wait_load", []> { let assemblyFormat = [{ `from` $sourceCoreId `to` $targetCoreId - `host_offset` $hostOffset `event` $eventRegister attr-dict `:` type($output) + `host_offset` $hostOffset `event` $eventRegister `count` $waitValue + `ack` $acknowledgementEventRegister attr-dict `:` type($output) + }]; +} + +def SpatSyncOp : SpatOp<"sync", []> { + let summary = "Signal a synchronization register on another processor"; + + let arguments = (ins + Index:$targetCoreId, + Index:$eventRegister + ); + + let assemblyFormat = [{ + $targetCoreId `event` $eventRegister attr-dict + }]; +} + +def SpatWaitOp : SpatOp<"wait", []> { + let summary = "Wait for a synchronization register value"; + + let arguments = (ins + Index:$eventRegister, + Index:$waitValue + ); + + let assemblyFormat = [{ + $eventRegister `value` $waitValue attr-dict }]; } diff --git a/validation/operations/validation_results.csv b/validation/operations/validation_results.csv index 8c172cd..93b0945 100644 --- a/validation/operations/validation_results.csv +++ b/validation/operations/validation_results.csv @@ -1,178 +1,178 @@ Operation,Arch,Result (l),Result (t),Compile (l),Host mem (l),Cores mem (l),Cores (l),Xbars (l),Latency (l),Power (l),Energy (l),Compile (t),Host mem (t),Cores mem (t),Cores (t),Xbars (t),Avg latency (t),Throughput (t),Avg power (t),Avg energy (t) -add/after_gemm,arch-a,PASS,FAIL,0.057 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,104.70 mW,815012.96 pJ,0.055 s,0.01 MiB,0.01 MiB,6,4,277000.00 samples/s,0.00 ms,45.81 mW,190085.16 pJ/it -add/basic,arch-a,PASS,PASS,0.047 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -add/broadcast_row,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -add/channel_broadcast_1024,arch-a,PASS,PASS,0.048 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.048 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it -add/leading_dimension_broadcast,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -concat/channel_axis,arch-a,PASS,PASS,0.053 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.16 mW,35718.00 pJ,0.047 s,0.00 MiB,0.00 MiB,1,0,2200000.00 samples/s,0.00 ms,2.16 mW,934.67 pJ/it -concat/negative_axis,arch-a,PASS,PASS,0.047 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.09 mW,81450.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,961000.00 samples/s,0.00 ms,2.09 mW,2108.00 pJ/it -concat/three_inputs_channel_axis,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.15 mW,50328.00 pJ,0.045 s,0.00 MiB,0.00 MiB,1,0,1560000.00 samples/s,0.00 ms,2.15 mW,1332.67 pJ/it -conv/batch_2,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,2,2,0.01 ms,82.62 mW,1131451.48 pJ,0.057 s,0.00 MiB,0.01 MiB,4,2,168000.00 samples/s,0.01 ms,53.33 mW,343254.69 pJ/it -conv/batch_4_pointwise,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.01 MiB,5,4,0.00 ms,116.08 mW,456420.96 pJ,0.060 s,0.00 MiB,0.01 MiB,5,4,486000.00 samples/s,0.00 ms,70.89 mW,160104.45 pJ/it -conv/depthwise_1024_channels,arch-a,PASS,FAIL,0.081 s,0.19 MiB,0.38 MiB,129,128,0.22 ms,178.45 mW,39393966.72 pJ,-,-,-,-,-,-,-,-,- -conv/depthwise_grouped,arch-a,PASS,FAIL,0.055 s,0.01 MiB,0.00 MiB,5,4,0.01 ms,107.78 mW,671878.96 pJ,-,-,-,-,-,-,-,-,- -conv/dilated_3x3,arch-a,PASS,PASS,0.060 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,118.77 mW,1034819.16 pJ,0.067 s,0.01 MiB,0.01 MiB,12,9,189000.00 samples/s,0.01 ms,75.03 mW,435165.28 pJ/it -conv/dynamic,arch-a,PASS,FAIL,0.056 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,92.28 mW,169336.00 pJ,0.057 s,0.00 MiB,0.00 MiB,6,0,661000.00 samples/s,0.00 ms,18.68 mW,30964.00 pJ/it -conv/explicit_padding,arch-a,PASS,FAIL,0.062 s,0.01 MiB,0.02 MiB,17,16,0.01 ms,145.34 mW,1454397.84 pJ,-,-,-,-,-,-,-,-,- -conv/grouped_many_groups,arch-a,PASS,FAIL,0.486 s,0.05 MiB,0.09 MiB,65,64,0.18 ms,142.21 mW,25867112.36 pJ,0.500 s,0.11 MiB,0.79 MiB,127,64,569.00 samples/s,1.76 ms,141.19 mW,252570125.00 pJ/it -conv/grouped_two_groups,arch-a,PASS,FAIL,0.063 s,0.00 MiB,0.00 MiB,3,2,0.01 ms,101.46 mW,543914.48 pJ,0.061 s,0.00 MiB,0.01 MiB,9,2,327000.00 samples/s,0.00 ms,116.36 mW,453237.70 pJ/it -conv/huge_pointwise_1024,arch-a,PASS,FAIL,0.160 s,0.01 MiB,0.11 MiB,73,64,0.02 ms,249.55 mW,3896647.36 pJ,0.176 s,0.04 MiB,0.11 MiB,74,64,35300.00 samples/s,0.03 ms,136.81 mW,4031965.75 pJ/it -conv/huge_pointwise_1024_dynamic,arch-a,PASS,FAIL,0.101 s,8.04 MiB,12.61 MiB,168,0,2.63 ms,169.52 mW,445489032.00 pJ,-,-,-,-,-,-,-,-,- -conv/input_224_7x7_stride2,arch-a,PASS,FAIL,1.124 s,24.14 MiB,61.87 MiB,168,169,38.41 ms,185.26 mW,7116544212.12 pJ,-,-,-,-,-,-,-,-,- -conv/kernel_2x2,arch-a,PASS,FAIL,0.064 s,0.00 MiB,0.00 MiB,1,1,0.00 ms,83.83 mW,360568.24 pJ,0.099 s,0.00 MiB,0.00 MiB,3,1,380000.00 samples/s,0.00 ms,52.64 mW,151421.99 pJ/it -conv/kernel_3x3,arch-a,PASS,FAIL,0.057 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,123.80 mW,889640.16 pJ,-,-,-,-,-,-,-,-,- -conv/kernel_equals_input_spatial,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,2,2,0.00 ms,89.61 mW,415689.48 pJ,0.059 s,0.00 MiB,0.00 MiB,4,2,464000.00 samples/s,0.00 ms,68.91 mW,166273.89 pJ/it -conv/large_input_channels_1x1,arch-a,PASS,PASS,0.087 s,0.01 MiB,0.02 MiB,9,8,0.01 ms,117.82 mW,901121.92 pJ,0.087 s,0.01 MiB,0.02 MiB,10,8,306000.00 samples/s,0.00 ms,91.39 mW,360779.57 pJ/it -conv/large_output_channels_1x1,arch-a,PASS,PASS,0.088 s,0.01 MiB,0.02 MiB,17,8,0.01 ms,128.44 mW,1139415.92 pJ,0.089 s,0.01 MiB,0.02 MiB,18,8,207000.00 samples/s,0.00 ms,73.39 mW,358350.06 pJ/it -conv/large_spatial,arch-a,PASS,FAIL,0.060 s,0.01 MiB,0.04 MiB,37,36,0.02 ms,172.07 mW,2928344.64 pJ,-,-,-,-,-,-,-,-,- -conv/multi_channel,arch-a,PASS,FAIL,0.056 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,105.68 mW,685040.72 pJ,0.057 s,0.00 MiB,0.00 MiB,4,3,178000.00 samples/s,0.01 ms,32.10 mW,185757.05 pJ/it -conv/non_square_kernel_1x3,arch-a,PASS,PASS,0.066 s,0.00 MiB,0.00 MiB,3,2,0.01 ms,99.35 mW,679752.48 pJ,0.054 s,0.00 MiB,0.00 MiB,3,2,163000.00 samples/s,0.01 ms,13.04 mW,81630.31 pJ/it -conv/non_square_kernel_3x1,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,3,2,0.01 ms,95.89 mW,1292976.48 pJ,0.065 s,0.00 MiB,0.00 MiB,3,2,77500.00 samples/s,0.01 ms,9.04 mW,117499.65 pJ/it -conv/non_uniform_stride,arch-a,PASS,FAIL,0.056 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,104.05 mW,790874.72 pJ,0.056 s,0.00 MiB,0.00 MiB,4,3,161000.00 samples/s,0.01 ms,30.89 mW,198689.55 pJ/it -conv/output_channel_grouping_minimal,arch-a,PASS,FAIL,0.083 s,0.10 MiB,0.34 MiB,131,128,0.26 ms,170.73 mW,44125916.72 pJ,-,-,-,-,-,-,-,-,- -conv/pointwise_1x1,arch-a,PASS,FAIL,0.052 s,0.00 MiB,0.00 MiB,1,1,0.01 ms,80.24 mW,987244.24 pJ,0.055 s,0.00 MiB,0.00 MiB,3,1,135000.00 samples/s,0.01 ms,47.15 mW,371973.57 pJ/it -conv/pointwise_tiled_chain,arch-a,PASS,PASS,0.699 s,0.01 MiB,0.04 MiB,20,80,0.04 ms,153.88 mW,6445455.20 pJ,0.634 s,0.05 MiB,0.08 MiB,22,80,14300.00 samples/s,0.07 ms,71.96 mW,5297594.20 pJ/it -conv/real_asymmetric_padding,arch-a,PASS,FAIL,0.063 s,0.01 MiB,0.03 MiB,29,28,0.01 ms,153.67 mW,2221606.72 pJ,-,-,-,-,-,-,-,-,- -conv/relu_conv_store,arch-a,PASS,FAIL,0.094 s,0.16 MiB,0.67 MiB,168,184,0.56 ms,183.08 mW,103057892.80 pJ,-,-,-,-,-,-,-,-,- -conv/same_lower_3x3,arch-a,PASS,FAIL,0.061 s,0.01 MiB,0.02 MiB,26,25,0.01 ms,166.15 mW,2215009.00 pJ,-,-,-,-,-,-,-,-,- -conv/same_padding_3x3,arch-a,PASS,FAIL,0.059 s,0.01 MiB,0.02 MiB,26,25,0.01 ms,166.15 mW,2215009.00 pJ,-,-,-,-,-,-,-,-,- -conv/strategy_depthwise_16,arch-a,PASS,FAIL,0.092 s,0.06 MiB,0.35 MiB,168,168,0.34 ms,197.94 mW,66331479.08 pJ,-,-,-,-,-,-,-,-,- -conv/strategy_input_k_tiled,arch-a,PASS,FAIL,0.084 s,0.08 MiB,0.27 MiB,109,108,0.35 ms,170.81 mW,60422605.92 pJ,-,-,-,-,-,-,-,-,- -conv/strategy_output_channel_tiled,arch-a,PASS,FAIL,0.071 s,0.03 MiB,0.16 MiB,74,72,0.09 ms,155.74 mW,14244739.28 pJ,-,-,-,-,-,-,-,-,- -conv/strategy_streamed_packed,arch-a,PASS,FAIL,0.184 s,3.34 MiB,7.89 MiB,168,168,9.35 ms,179.86 mW,1682364509.56 pJ,-,-,-,-,-,-,-,-,- -conv/strategy_streamed_patch,arch-a,PASS,FAIL,0.098 s,0.34 MiB,1.32 MiB,168,168,1.90 ms,181.91 mW,346476645.64 pJ,-,-,-,-,-,-,-,-,- -conv/strategy_tiled_2d,arch-a,PASS,FAIL,0.117 s,0.11 MiB,0.44 MiB,168,168,0.42 ms,182.13 mW,75690907.84 pJ,-,-,-,-,-,-,-,-,- -conv/stride_2,arch-a,PASS,FAIL,0.059 s,0.01 MiB,0.00 MiB,5,4,0.01 ms,110.78 mW,580154.96 pJ,-,-,-,-,-,-,-,-,- -conv/with_bias_3x3,arch-a,PASS,FAIL,0.057 s,0.00 MiB,0.01 MiB,4,3,0.01 ms,104.16 mW,776220.72 pJ,0.057 s,0.00 MiB,0.01 MiB,4,3,165000.00 samples/s,0.01 ms,30.99 mW,196092.89 pJ/it -conv/with_constant,arch-a,PASS,FAIL,0.057 s,0.00 MiB,0.00 MiB,1,1,0.01 ms,81.74 mW,541270.24 pJ,0.059 s,0.00 MiB,0.00 MiB,4,1,232000.00 samples/s,0.00 ms,92.34 mW,438607.24 pJ/it -conv/without_kernel_shape_attr,arch-a,PASS,FAIL,0.055 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,123.80 mW,889640.16 pJ,-,-,-,-,-,-,-,-,- -conv/yolo11n_depthwise_head,arch-a,PASS,FAIL,2.274 s,8.66 MiB,34.24 MiB,168,255,42.70 ms,200.52 mW,8562449708.00 pJ,-,-,-,-,-,-,-,-,- -conv/yolo11n_heavy,arch-a,PASS,FAIL,0.478 s,4.82 MiB,19.10 MiB,161,800,8.54 ms,350.86 mW,2994764012.00 pJ,-,-,-,-,-,-,-,-,- -conv/yolo11n_stem,arch-a,PASS,FAIL,0.975 s,12.86 MiB,37.59 MiB,168,488,14.24 ms,301.23 mW,4289558753.00 pJ,-,-,-,-,-,-,-,-,- -div/after_gemm,arch-a,PASS,FAIL,0.056 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,104.70 mW,815012.96 pJ,0.056 s,0.01 MiB,0.01 MiB,6,4,277000.00 samples/s,0.00 ms,45.81 mW,190085.16 pJ/it -div/basic,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -div/channel_broadcast_1024,arch-a,PASS,PASS,0.051 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.055 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it -div/leading_dimension_broadcast,arch-a,PASS,PASS,0.053 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -div/runtime_scalar_rhs,arch-a,PASS,PASS,0.048 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.051 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it -div/scalar_constant,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.059 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -gather/3d_input_axis1,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.08 mW,45990.00 pJ,0.053 s,0.00 MiB,0.00 MiB,1,0,1700000.00 samples/s,0.00 ms,2.08 mW,1174.67 pJ/it -gather/axis0_matrix_indices,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.07 mW,54414.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,1440000.00 samples/s,0.00 ms,2.07 mW,1390.67 pJ/it -gather/axis1,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.06 mW,62526.00 pJ,0.053 s,0.00 MiB,0.00 MiB,1,0,1250000.00 samples/s,0.00 ms,2.06 mW,1598.67 pJ/it -gather/negative_axis,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.03 mW,112134.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,697000.00 samples/s,0.00 ms,2.03 mW,2870.67 pJ/it -gather/negative_indices,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.13 mW,29376.00 pJ,0.058 s,0.00 MiB,0.00 MiB,1,0,2670000.00 samples/s,0.00 ms,2.12 mW,748.67 pJ/it -gemm/alpha_beta,arch-a,PASS,FAIL,0.059 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,105.27 mW,784908.96 pJ,0.061 s,0.01 MiB,0.01 MiB,6,4,304000.00 samples/s,0.00 ms,48.12 mW,184972.16 pJ/it -gemm/bias_rank2_broadcast,arch-a,PASS,FAIL,0.061 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,105.98 mW,749484.96 pJ,0.058 s,0.01 MiB,0.01 MiB,6,4,351000.00 samples/s,0.00 ms,52.58 mW,176636.66 pJ/it -gemm/dynamic,arch-a,PASS,FAIL,0.053 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.48 mW,221475.00 pJ,0.056 s,0.00 MiB,0.00 MiB,5,0,785000.00 samples/s,0.00 ms,20.31 mW,27813.50 pJ/it -gemm/dynamic_alpha,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.42 mW,298198.00 pJ,0.056 s,0.00 MiB,0.00 MiB,5,0,612000.00 samples/s,0.00 ms,20.35 mW,37289.67 pJ/it -gemm/dynamic_beta,arch-a,PASS,FAIL,0.056 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.32 mW,398595.00 pJ,0.056 s,0.00 MiB,0.00 MiB,5,0,359000.00 samples/s,0.00 ms,20.22 mW,60212.83 pJ/it -gemm/dynamic_bias,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.45 mW,243703.00 pJ,0.055 s,0.00 MiB,0.00 MiB,5,0,785000.00 samples/s,0.00 ms,20.32 mW,28385.00 pJ/it -gemm/dynamic_bias_alpha_beta,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.00 MiB,5,0,0.01 ms,91.28 mW,513811.00 pJ,0.056 s,0.00 MiB,0.00 MiB,5,0,247000.00 samples/s,0.00 ms,20.20 mW,85611.50 pJ/it -gemm/dynamic_transpose_b,arch-a,PASS,FAIL,0.053 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.38 mW,118883.00 pJ,0.055 s,0.00 MiB,0.00 MiB,5,0,1340000.00 samples/s,0.00 ms,20.55 mW,16541.00 pJ/it -gemm/huge_1024,arch-a,PASS,FAIL,0.144 s,0.01 MiB,0.10 MiB,73,64,0.02 ms,215.04 mW,3767885.36 pJ,0.167 s,0.03 MiB,0.10 MiB,73,64,14900.00 samples/s,0.07 ms,154.31 mW,10866697.65 pJ/it -gemm/large,arch-a,PASS,FAIL,0.058 s,0.02 MiB,0.03 MiB,17,16,0.01 ms,140.15 mW,1573768.84 pJ,0.063 s,0.02 MiB,0.03 MiB,17,16,142000.00 samples/s,0.01 ms,118.27 mW,830693.99 pJ/it -gemm/large_k_small_n,arch-a,PASS,FAIL,0.084 s,0.01 MiB,0.01 MiB,9,8,0.00 ms,133.48 mW,633769.92 pJ,0.089 s,0.01 MiB,0.01 MiB,9,8,439000.00 samples/s,0.00 ms,125.25 mW,329671.91 pJ/it -gemm/non_square,arch-a,PASS,FAIL,0.060 s,0.00 MiB,0.01 MiB,5,4,0.00 ms,118.96 mW,419565.96 pJ,0.060 s,0.00 MiB,0.01 MiB,5,4,486000.00 samples/s,0.00 ms,70.69 mW,160313.79 pJ/it -gemm/scalar_bias,arch-a,PASS,FAIL,0.059 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,105.98 mW,749484.96 pJ,0.056 s,0.01 MiB,0.01 MiB,6,4,351000.00 samples/s,0.00 ms,52.58 mW,176636.66 pJ/it -gemm/small,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,2,2,0.00 ms,90.14 mW,398436.48 pJ,0.055 s,0.00 MiB,0.00 MiB,4,2,464000.00 samples/s,0.00 ms,69.74 mW,162693.89 pJ/it -gemm/small_k_large_n,arch-a,PASS,PASS,0.092 s,0.01 MiB,0.02 MiB,17,8,0.01 ms,131.01 mW,1043061.92 pJ,0.089 s,0.01 MiB,0.02 MiB,18,8,248000.00 samples/s,0.00 ms,82.00 mW,345641.89 pJ/it -gemm/square_weights,arch-a,PASS,FAIL,0.076 s,0.03 MiB,0.08 MiB,42,40,0.02 ms,151.77 mW,3284393.60 pJ,-,-,-,-,-,-,-,-,- -gemm/transpose_a,arch-a,PASS,FAIL,0.056 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,109.14 mW,628868.96 pJ,0.057 s,0.00 MiB,0.01 MiB,6,4,424000.00 samples/s,0.00 ms,58.98 mW,162091.12 pJ/it -gemm/transpose_a_and_b,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,109.14 mW,628868.96 pJ,0.056 s,0.00 MiB,0.01 MiB,6,4,424000.00 samples/s,0.00 ms,58.98 mW,162091.12 pJ/it -gemm/transpose_b,arch-a,PASS,FAIL,0.061 s,0.00 MiB,0.01 MiB,5,4,0.00 ms,118.96 mW,419565.96 pJ,0.059 s,0.00 MiB,0.01 MiB,5,4,486000.00 samples/s,0.00 ms,70.69 mW,160313.79 pJ/it -gemm/transpose_b_with_bias,arch-a,PASS,FAIL,0.064 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,110.55 mW,557818.96 pJ,0.057 s,0.01 MiB,0.01 MiB,5,4,339000.00 samples/s,0.00 ms,55.18 mW,180359.12 pJ/it -gemm/with_bias,arch-a,PASS,FAIL,0.050 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,108.77 mW,604966.96 pJ,0.055 s,0.01 MiB,0.01 MiB,5,4,288000.00 samples/s,0.00 ms,52.44 mW,186098.45 pJ/it -gemv/all_constant,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,0,0,0.00 ms,2.00 mW,0.00 pJ,0.052 s,0.00 MiB,0.00 MiB,0,0,0.00 samples/s,0.00 ms,2.00 mW,0.00 pJ/it -gemv/constant_weight,arch-a,PASS,FAIL,0.062 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,111.15 mW,573535.96 pJ,0.063 s,0.00 MiB,0.01 MiB,8,4,412000.00 samples/s,0.00 ms,86.05 mW,242243.79 pJ/it -gemv/non_uniform_bias,arch-a,PASS,FAIL,0.063 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,109.82 mW,609371.96 pJ,0.063 s,0.00 MiB,0.01 MiB,8,4,376000.00 samples/s,0.00 ms,82.45 mW,254539.29 pJ/it -gemv/scalar_bias,arch-a,PASS,FAIL,0.063 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,109.82 mW,609371.96 pJ,0.064 s,0.00 MiB,0.01 MiB,8,4,376000.00 samples/s,0.00 ms,82.45 mW,254539.29 pJ/it -gemv/uniform_bias,arch-a,PASS,FAIL,0.064 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,109.82 mW,609371.96 pJ,0.063 s,0.00 MiB,0.01 MiB,8,4,376000.00 samples/s,0.00 ms,82.45 mW,254539.29 pJ/it -matmul/basic,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,2,2,0.00 ms,90.14 mW,398436.48 pJ,0.056 s,0.00 MiB,0.00 MiB,4,2,464000.00 samples/s,0.00 ms,69.74 mW,162693.89 pJ/it -matmul/batched_3d,arch-a,PASS,FAIL,0.058 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,108.59 mW,646972.96 pJ,0.059 s,0.00 MiB,0.01 MiB,6,4,438000.00 samples/s,0.00 ms,59.21 mW,161865.62 pJ/it -matmul/batched_3d_dynamic,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,92.19 mW,167975.00 pJ,0.054 s,0.00 MiB,0.00 MiB,5,0,1140000.00 samples/s,0.00 ms,17.43 mW,16336.83 pJ/it -matmul/batched_left_constant,arch-a,PASS,FAIL,0.061 s,0.00 MiB,0.02 MiB,9,8,0.01 ms,114.39 mW,1009105.92 pJ,-,-,-,-,-,-,-,-,- -matmul/batched_lhs_broadcast,arch-a,PASS,FAIL,0.057 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,109.39 mW,621440.96 pJ,0.071 s,0.00 MiB,0.01 MiB,6,4,441000.00 samples/s,0.00 ms,60.34 mW,160658.62 pJ/it -matmul/batched_rhs_broadcast,arch-a,PASS,FAIL,0.056 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,108.59 mW,646972.96 pJ,0.056 s,0.00 MiB,0.01 MiB,6,4,438000.00 samples/s,0.00 ms,59.21 mW,161865.62 pJ/it -matmul/dynamic,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.42 mW,148195.00 pJ,0.058 s,0.00 MiB,0.00 MiB,5,0,1310000.00 samples/s,0.00 ms,20.49 mW,18009.67 pJ/it -matmul/huge_1024,arch-a,PASS,FAIL,0.151 s,0.01 MiB,0.10 MiB,73,64,0.02 ms,215.04 mW,3767885.36 pJ,0.172 s,0.03 MiB,0.10 MiB,73,64,14900.00 samples/s,0.07 ms,154.31 mW,10866697.65 pJ/it -matmul/left_constant,arch-a,PASS,FAIL,0.058 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,108.86 mW,637168.96 pJ,0.064 s,0.00 MiB,0.01 MiB,6,4,424000.00 samples/s,0.00 ms,58.67 mW,162346.12 pJ/it -matmul/matrix_vector,arch-a,PASS,FAIL,0.102 s,0.52 MiB,0.78 MiB,168,173,0.38 ms,202.13 mW,77751814.88 pJ,-,-,-,-,-,-,-,-,- -matmul/vector_matrix,arch-a,PASS,FAIL,0.085 s,0.01 MiB,0.01 MiB,9,8,0.01 ms,118.68 mW,879301.92 pJ,-,-,-,-,-,-,-,-,- -matmul/yolo_attention,arch-a,PASS,FAIL,0.483 s,1.02 MiB,43.44 MiB,168,0,8.15 ms,170.00 mW,1385775865.00 pJ,-,-,-,-,-,-,-,-,- -mul/after_conv,arch-a,PASS,FAIL,0.074 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,107.64 mW,586955.72 pJ,0.062 s,0.00 MiB,0.00 MiB,4,3,220000.00 samples/s,0.00 ms,34.96 mW,162998.05 pJ/it -mul/after_conv_scalar_constant,arch-a,PASS,FAIL,0.063 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,107.64 mW,586955.72 pJ,0.061 s,0.00 MiB,0.00 MiB,4,3,220000.00 samples/s,0.00 ms,34.96 mW,162998.05 pJ/it -mul/basic,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -mul/channel_broadcast_1024,arch-a,PASS,PASS,0.049 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.049 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it -mul/leading_dimension_broadcast,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.053 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -mul/scalar_constant,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -pool/avg_basic,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,931506.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,84000.00 samples/s,0.01 ms,2.02 mW,24067.00 pJ/it -pool/avg_ceil_mode,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.03 mW,340146.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,230000.00 samples/s,0.00 ms,2.03 mW,8810.67 pJ/it -pool/avg_explicit_padding,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.03 mW,688356.00 pJ,0.058 s,0.00 MiB,0.00 MiB,1,0,114000.00 samples/s,0.01 ms,2.03 mW,17809.00 pJ/it -pool/avg_include_pad,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,663612.00 pJ,0.058 s,0.00 MiB,0.00 MiB,1,0,118000.00 samples/s,0.01 ms,2.02 mW,17081.00 pJ/it -pool/avg_large_channels,arch-a,PASS,PASS,0.064 s,0.04 MiB,0.02 MiB,1,0,0.24 ms,78.00 mW,18399156.00 pJ,0.060 s,0.04 MiB,0.02 MiB,1,0,4250.00 samples/s,0.24 ms,2.00 mW,471428.00 pJ/it -pool/avg_non_uniform_stride,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,1132254.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,69100.00 samples/s,0.01 ms,2.02 mW,29191.00 pJ/it -pool/avg_real_asymmetric_padding,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.03 ms,78.02 mW,1966692.00 pJ,0.057 s,0.00 MiB,0.00 MiB,1,0,39700.00 samples/s,0.03 ms,2.02 mW,50961.00 pJ/it -pool/max_after_conv,arch-a,PASS,FAIL,0.059 s,0.00 MiB,0.00 MiB,5,4,0.01 ms,99.12 mW,1210689.96 pJ,0.061 s,0.00 MiB,0.00 MiB,5,4,142000.00 samples/s,0.01 ms,34.60 mW,273954.62 pJ/it -pool/max_basic,arch-a,PASS,PASS,0.053 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.06 mW,324744.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,241000.00 samples/s,0.00 ms,2.06 mW,8532.67 pJ/it -pool/max_ceil_mode,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.07 mW,151464.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,516000.00 samples/s,0.00 ms,2.07 mW,3972.67 pJ/it -pool/max_global_style_kernel_equals_input,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.01 mW,658626.00 pJ,0.056 s,0.00 MiB,0.00 MiB,1,0,119000.00 samples/s,0.01 ms,2.01 mW,16871.00 pJ/it -pool/max_non_square_kernel,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,1063068.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,73600.00 samples/s,0.01 ms,2.02 mW,27417.00 pJ/it -pool/max_real_asymmetric_padding,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.03 mW,814992.00 pJ,0.058 s,0.00 MiB,0.00 MiB,1,0,96100.00 samples/s,0.01 ms,2.03 mW,21173.00 pJ/it -pool/max_same_upper,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.04 mW,625068.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,125000.00 samples/s,0.01 ms,2.04 mW,16233.00 pJ/it -pool/max_stride2_multichannel,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.02 ms,78.02 mW,1247274.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,62700.00 samples/s,0.02 ms,2.02 mW,32153.00 pJ/it -reduce_mean/4d_spatial,arch-a,PASS,FAIL,0.053 s,0.00 MiB,0.00 MiB,3,0,0.00 ms,92.45 mW,29676.00 pJ,0.055 s,0.00 MiB,0.00 MiB,3,0,2560000.00 samples/s,0.00 ms,4.38 mW,1667.33 pJ/it -reduce_mean/4d_spatial_keepdims_0,arch-a,PASS,FAIL,0.052 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,94.35 mW,61801.00 pJ,0.053 s,0.00 MiB,0.00 MiB,4,0,2390000.00 samples/s,0.00 ms,19.52 mW,9025.83 pJ/it -reduce_mean/after_conv,arch-a,PASS,FAIL,0.059 s,0.00 MiB,0.00 MiB,5,3,0.01 ms,106.95 mW,571332.72 pJ,0.063 s,0.00 MiB,0.00 MiB,5,3,220000.00 samples/s,0.00 ms,21.90 mW,102726.72 pJ/it -reduce_mean/all_axes_keepdims_0,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.24 mW,30982.00 pJ,0.052 s,0.00 MiB,0.00 MiB,2,0,4520000.00 samples/s,0.00 ms,3.41 mW,775.00 pJ/it -reduce_mean/all_axes_keepdims_1,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it -reduce_mean/basic,arch-a,PASS,FAIL,0.052 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,93.51 mW,34881.00 pJ,0.053 s,0.00 MiB,0.00 MiB,4,0,2780000.00 samples/s,0.00 ms,5.56 mW,1904.50 pJ/it -reduce_mean/channel_axis_nchw,arch-a,PASS,FAIL,0.052 s,0.03 MiB,0.02 MiB,4,0,0.16 ms,93.60 mW,15436518.00 pJ,0.055 s,0.03 MiB,0.08 MiB,4,0,16000.00 samples/s,0.06 ms,5.00 mW,323993.33 pJ/it -reduce_mean/keepdims_0,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.40 mW,68368.00 pJ,0.054 s,0.00 MiB,0.00 MiB,5,0,1880000.00 samples/s,0.00 ms,20.60 mW,11458.17 pJ/it -reduce_mean/large_dimension_1024,arch-a,PASS,PASS,0.053 s,0.01 MiB,0.00 MiB,1,0,0.00 ms,78.02 mW,217278.00 pJ,0.052 s,0.01 MiB,0.00 MiB,1,0,359000.00 samples/s,0.00 ms,2.02 mW,5274.00 pJ/it -reduce_mean/legacy_axes_1_2_keepdims_1,arch-a,PASS,FAIL,0.052 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.35 mW,21505.00 pJ,0.052 s,0.00 MiB,0.00 MiB,2,0,3860000.00 samples/s,0.00 ms,3.37 mW,798.00 pJ/it -reduce_mean/legacy_axis1_keepdims_0,arch-a,PASS,FAIL,0.071 s,0.00 MiB,0.00 MiB,9,0,0.00 ms,92.50 mW,183708.00 pJ,0.061 s,0.00 MiB,0.00 MiB,9,0,1010000.00 samples/s,0.00 ms,38.63 mW,41198.50 pJ/it -reduce_mean/legacy_axis1_keepdims_1,arch-a,PASS,FAIL,0.053 s,0.00 MiB,0.00 MiB,8,0,0.00 ms,94.56 mW,129830.00 pJ,0.054 s,0.00 MiB,0.00 MiB,8,0,1390000.00 samples/s,0.00 ms,9.56 mW,6733.50 pJ/it -reduce_mean/legacy_empty_axes_noop,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it -reduce_mean/legacy_nchw_spatial,arch-a,PASS,FAIL,0.054 s,0.00 MiB,0.00 MiB,3,0,0.00 ms,92.45 mW,29676.00 pJ,0.056 s,0.00 MiB,0.00 MiB,3,0,1960000.00 samples/s,0.00 ms,4.28 mW,2167.33 pJ/it -reduce_mean/legacy_negative_axis,arch-a,PASS,FAIL,0.051 s,0.00 MiB,0.00 MiB,6,0,0.00 ms,93.52 mW,51717.00 pJ,0.057 s,0.00 MiB,0.00 MiB,6,0,1850000.00 samples/s,0.00 ms,7.57 mW,3828.83 pJ/it -reduce_mean/legacy_reduce_all_keepdims_1,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it -reduce_mean/negative_axis,arch-a,PASS,FAIL,0.058 s,0.00 MiB,0.00 MiB,6,0,0.00 ms,93.52 mW,51717.00 pJ,0.054 s,0.00 MiB,0.00 MiB,6,0,1850000.00 samples/s,0.00 ms,7.57 mW,3828.83 pJ/it -relu/4d,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.18 mW,40734.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,1930000.00 samples/s,0.00 ms,2.18 mW,1014.00 pJ/it -relu/after_conv,arch-a,PASS,FAIL,0.058 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,107.89 mW,577437.72 pJ,0.060 s,0.00 MiB,0.00 MiB,4,3,220000.00 samples/s,0.00 ms,34.98 mW,162801.39 pJ/it -relu/after_gemm,arch-a,PASS,FAIL,0.061 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,105.16 mW,790056.96 pJ,0.059 s,0.01 MiB,0.01 MiB,6,4,291000.00 samples/s,0.00 ms,47.08 mW,187063.49 pJ/it -relu/basic,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it -reshape/4d_to_2d_flatten,arch-a,PASS,PASS,0.047 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.28 mW,20196.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,3910000.00 samples/s,0.00 ms,2.28 mW,488.00 pJ/it -reshape/infer_dim_minus_one,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,12684.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,6250000.00 samples/s,0.00 ms,2.30 mW,308.00 pJ/it -reshape/same_rank,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,12684.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,6250000.00 samples/s,0.00 ms,2.30 mW,308.00 pJ/it -reshape/zero_copies_input_dim,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,12684.00 pJ,0.056 s,0.00 MiB,0.00 MiB,1,0,6250000.00 samples/s,0.00 ms,2.30 mW,308.00 pJ/it -resize/height_only,arch-a,PASS,FAIL,0.054 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,93.55 mW,64833.00 pJ,0.055 s,0.00 MiB,0.00 MiB,4,0,2430000.00 samples/s,0.00 ms,5.46 mW,2298.25 pJ/it -resize/nearest_2x,arch-a,PASS,FAIL,0.055 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,93.57 mW,109761.00 pJ,0.051 s,0.00 MiB,0.00 MiB,4,0,1760000.00 samples/s,0.00 ms,5.33 mW,3085.12 pJ/it -resize/nearest_downsample,arch-a,PASS,FAIL,0.054 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.45 mW,33925.00 pJ,0.052 s,0.00 MiB,0.00 MiB,2,0,2420000.00 samples/s,0.00 ms,3.22 mW,1262.50 pJ/it -resize/non_uniform_scales,arch-a,PASS,FAIL,0.054 s,0.00 MiB,0.00 MiB,6,0,0.00 ms,93.58 mW,164037.00 pJ,0.055 s,0.00 MiB,0.00 MiB,6,0,1750000.00 samples/s,0.00 ms,7.49 mW,4551.90 pJ/it -resize/width_only,arch-a,PASS,FAIL,0.051 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.50 mW,53029.00 pJ,0.052 s,0.00 MiB,0.00 MiB,2,0,1750000.00 samples/s,0.00 ms,3.16 mW,1735.50 pJ/it -resize/with_sizes,arch-a,PASS,FAIL,0.054 s,0.00 MiB,0.00 MiB,3,0,0.00 ms,92.54 mW,73756.00 pJ,0.056 s,0.00 MiB,0.00 MiB,3,0,1930000.00 samples/s,0.00 ms,4.27 mW,2196.00 pJ/it -sigmoid/4d,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.18 mW,40734.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,1930000.00 samples/s,0.00 ms,2.18 mW,1014.00 pJ/it -sigmoid/after_gemm,arch-a,PASS,FAIL,0.056 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,105.16 mW,790056.96 pJ,0.058 s,0.01 MiB,0.01 MiB,6,4,291000.00 samples/s,0.00 ms,47.08 mW,187063.49 pJ/it -sigmoid/basic,arch-a,PASS,PASS,0.053 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it -slice/2d_basic,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,18948.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,4170000.00 samples/s,0.00 ms,2.30 mW,491.67 pJ/it -slice/after_conv,arch-a,PASS,FAIL,0.062 s,0.00 MiB,0.01 MiB,7,6,0.01 ms,118.19 mW,1335082.88 pJ,0.069 s,0.00 MiB,0.01 MiB,7,6,130000.00 samples/s,0.01 ms,58.48 mW,484364.44 pJ/it -slice/default_axes,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,18948.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,4170000.00 samples/s,0.00 ms,2.30 mW,491.67 pJ/it -slice/large_channel_1024,arch-a,PASS,PASS,0.051 s,0.01 MiB,0.00 MiB,1,0,0.00 ms,78.14 mW,221304.00 pJ,0.050 s,0.01 MiB,0.00 MiB,1,0,353000.00 samples/s,0.00 ms,2.14 mW,5058.00 pJ/it -slice/nchw_spatial_crop,arch-a,PASS,PASS,0.053 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.24 mW,101868.00 pJ,0.047 s,0.00 MiB,0.00 MiB,1,0,769000.00 samples/s,0.00 ms,2.24 mW,2851.67 pJ/it -slice/negative_axis,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,44004.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,1790000.00 samples/s,0.00 ms,2.30 mW,1227.67 pJ/it -slice/negative_indices,arch-a,PASS,PASS,0.048 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,25212.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.30 mW,675.67 pJ/it -slice/step2,arch-a,PASS,PASS,0.053 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.29 mW,159876.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,490000.00 samples/s,0.00 ms,2.29 mW,4619.67 pJ/it -softmax/3d_last_axis,arch-a,PASS,PASS,0.052 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.053 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED -softmax/basic,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.053 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED -softmax/channel_axis,arch-a,PASS,FAIL,0.051 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.052 s,0.00 MiB,0.00 MiB,3,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED -softmax/large_dimension_1024,arch-a,PASS,PASS,0.049 s,0.01 MiB,0.01 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.052 s,0.01 MiB,0.01 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED -softmax/negative_axis,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.049 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED -split/basic,arch-a,PASS,PASS,0.048 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,31554.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,2490000.00 samples/s,0.00 ms,2.30 mW,861.67 pJ/it -split/equal_three_way,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,44160.00 pJ,0.052 s,0.00 MiB,0.00 MiB,1,0,1780000.00 samples/s,0.00 ms,2.30 mW,1231.67 pJ/it -split/negative_axis,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.29 mW,84786.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,925000.00 samples/s,0.00 ms,2.29 mW,2413.67 pJ/it -split/uneven_channel_axis_4d,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,18948.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,4170000.00 samples/s,0.00 ms,2.30 mW,491.67 pJ/it -sub/after_gemm,arch-a,PASS,FAIL,0.058 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,104.70 mW,815012.96 pJ,0.057 s,0.01 MiB,0.01 MiB,6,4,277000.00 samples/s,0.00 ms,45.81 mW,190085.16 pJ/it -sub/basic,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.048 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -sub/broadcast_row,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it -sub/channel_broadcast_1024,arch-a,PASS,PASS,0.058 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.053 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it -sub/constant_lhs_broadcast,arch-a,PASS,PASS,0.049 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25188.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,656.67 pJ/it -sub/leading_dimension_broadcast,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +add/after_gemm,arch-a,PASS,PASS,0.058 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,104.70 mW,815012.96 pJ,0.057 s,0.01 MiB,0.01 MiB,6,4,145000.00 samples/s,0.01 ms,31.45 mW,216167.21 pJ/it +add/basic,arch-a,PASS,PASS,0.048 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +add/broadcast_row,arch-a,PASS,PASS,0.048 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +add/channel_broadcast_1024,arch-a,PASS,PASS,0.049 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.051 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it +add/leading_dimension_broadcast,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.049 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +concat/channel_axis,arch-a,PASS,PASS,0.048 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.16 mW,35718.00 pJ,0.050 s,0.00 MiB,0.00 MiB,1,0,2200000.00 samples/s,0.00 ms,2.16 mW,934.67 pJ/it +concat/negative_axis,arch-a,PASS,PASS,0.050 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.09 mW,81450.00 pJ,0.051 s,0.00 MiB,0.00 MiB,1,0,961000.00 samples/s,0.00 ms,2.09 mW,2108.00 pJ/it +concat/three_inputs_channel_axis,arch-a,PASS,PASS,0.048 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.15 mW,50328.00 pJ,0.047 s,0.00 MiB,0.00 MiB,1,0,1560000.00 samples/s,0.00 ms,2.15 mW,1332.67 pJ/it +conv/batch_2,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,2,2,0.01 ms,82.62 mW,1131451.48 pJ,0.062 s,0.00 MiB,0.01 MiB,4,2,129000.00 samples/s,0.01 ms,51.25 mW,406238.48 pJ/it +conv/batch_4_pointwise,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.01 MiB,5,4,0.00 ms,116.08 mW,456420.96 pJ,0.061 s,0.00 MiB,0.01 MiB,5,4,243000.00 samples/s,0.00 ms,44.13 mW,180813.46 pJ/it +conv/depthwise_1024_channels,arch-a,PASS,PASS,0.080 s,0.19 MiB,0.38 MiB,129,128,0.22 ms,178.45 mW,39393966.72 pJ,0.141 s,0.36 MiB,0.48 MiB,87,128,3620.00 samples/s,0.28 ms,131.43 mW,37256350.26 pJ/it +conv/depthwise_grouped,arch-a,PASS,PASS,0.056 s,0.01 MiB,0.00 MiB,5,4,0.01 ms,107.78 mW,671878.96 pJ,0.061 s,0.01 MiB,0.00 MiB,7,4,235000.00 samples/s,0.00 ms,53.10 mW,227356.96 pJ/it +conv/dilated_3x3,arch-a,PASS,PASS,0.061 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,118.77 mW,1034819.16 pJ,0.071 s,0.01 MiB,0.01 MiB,12,9,119000.00 samples/s,0.01 ms,61.00 mW,511357.16 pJ/it +conv/dynamic,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,92.28 mW,169336.00 pJ,0.057 s,0.00 MiB,0.00 MiB,6,0,784000.00 samples/s,0.00 ms,18.61 mW,26517.00 pJ/it +conv/explicit_padding,arch-a,PASS,PASS,0.060 s,0.01 MiB,0.02 MiB,17,16,0.01 ms,145.34 mW,1454397.84 pJ,0.064 s,0.01 MiB,0.02 MiB,19,16,153000.00 samples/s,0.01 ms,109.61 mW,715669.59 pJ/it +conv/grouped_many_groups,arch-a,PASS,PASS,0.498 s,0.05 MiB,0.09 MiB,65,64,0.18 ms,142.21 mW,25867112.36 pJ,0.547 s,0.11 MiB,0.79 MiB,127,64,3750.00 samples/s,0.27 ms,141.11 mW,43353235.67 pJ/it +conv/grouped_two_groups,arch-a,PASS,PASS,0.064 s,0.00 MiB,0.00 MiB,3,2,0.01 ms,101.46 mW,543914.48 pJ,0.066 s,0.00 MiB,0.01 MiB,9,2,146000.00 samples/s,0.01 ms,108.34 mW,741101.98 pJ/it +conv/huge_pointwise_1024,arch-a,PASS,PASS,0.166 s,0.01 MiB,0.11 MiB,73,64,0.02 ms,249.55 mW,3896647.36 pJ,0.182 s,0.04 MiB,0.11 MiB,74,64,33300.00 samples/s,0.03 ms,133.89 mW,4052259.07 pJ/it +conv/huge_pointwise_1024_dynamic,arch-a,PASS,PASS,0.084 s,8.04 MiB,12.61 MiB,168,0,2.63 ms,169.52 mW,445489032.00 pJ,0.263 s,11.49 MiB,10.61 MiB,127,0,213.00 samples/s,4.70 ms,164.24 mW,811591564.70 pJ/it +conv/input_224_7x7_stride2,arch-a,PASS,PASS,0.775 s,24.14 MiB,61.87 MiB,168,169,38.41 ms,185.26 mW,7116544212.12 pJ,1.142 s,46.43 MiB,73.41 MiB,126,153,27.30 samples/s,36.66 ms,177.05 mW,6915042527.00 pJ/it +conv/kernel_2x2,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,1,0.00 ms,83.83 mW,360568.24 pJ,0.055 s,0.00 MiB,0.00 MiB,3,1,334000.00 samples/s,0.00 ms,51.45 mW,171905.91 pJ/it +conv/kernel_3x3,arch-a,PASS,PASS,0.060 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,123.80 mW,889640.16 pJ,0.063 s,0.01 MiB,0.01 MiB,12,9,219000.00 samples/s,0.00 ms,83.71 mW,382318.91 pJ/it +conv/kernel_equals_input_spatial,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,2,2,0.00 ms,89.61 mW,415689.48 pJ,0.057 s,0.00 MiB,0.00 MiB,4,2,293000.00 samples/s,0.00 ms,59.39 mW,204713.48 pJ/it +conv/large_input_channels_1x1,arch-a,PASS,PASS,0.096 s,0.01 MiB,0.02 MiB,9,8,0.01 ms,117.82 mW,901121.92 pJ,0.092 s,0.01 MiB,0.02 MiB,10,8,132000.00 samples/s,0.01 ms,59.24 mW,447909.92 pJ/it +conv/large_output_channels_1x1,arch-a,PASS,PASS,0.089 s,0.01 MiB,0.02 MiB,17,8,0.01 ms,128.44 mW,1139415.92 pJ,0.095 s,0.01 MiB,0.02 MiB,18,8,123000.00 samples/s,0.01 ms,43.92 mW,355735.17 pJ/it +conv/large_spatial,arch-a,PASS,PASS,0.059 s,0.01 MiB,0.04 MiB,37,36,0.02 ms,172.07 mW,2928344.64 pJ,0.078 s,0.01 MiB,0.04 MiB,39,36,88500.00 samples/s,0.01 ms,169.91 mW,1920027.89 pJ/it +conv/multi_channel,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,105.68 mW,685040.72 pJ,0.060 s,0.00 MiB,0.00 MiB,4,3,146000.00 samples/s,0.01 ms,30.09 mW,205787.97 pJ/it +conv/non_square_kernel_1x3,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,3,2,0.01 ms,99.35 mW,679752.48 pJ,0.059 s,0.00 MiB,0.00 MiB,3,2,141000.00 samples/s,0.01 ms,12.12 mW,85739.48 pJ/it +conv/non_square_kernel_3x1,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,3,2,0.01 ms,95.89 mW,1292976.48 pJ,0.061 s,0.00 MiB,0.00 MiB,3,2,72900.00 samples/s,0.01 ms,8.83 mW,121109.48 pJ/it +conv/non_uniform_stride,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,104.05 mW,790874.72 pJ,0.059 s,0.00 MiB,0.00 MiB,4,3,131000.00 samples/s,0.01 ms,29.05 mW,221084.97 pJ/it +conv/output_channel_grouping_minimal,arch-a,PASS,PASS,0.089 s,0.10 MiB,0.34 MiB,131,128,0.26 ms,170.73 mW,44125916.72 pJ,0.181 s,0.18 MiB,0.33 MiB,131,128,3910.00 samples/s,0.26 ms,181.50 mW,48146979.72 pJ/it +conv/pointwise_1x1,arch-a,PASS,PASS,0.071 s,0.00 MiB,0.00 MiB,1,1,0.01 ms,80.24 mW,987244.24 pJ,0.084 s,0.00 MiB,0.00 MiB,3,1,131000.00 samples/s,0.01 ms,47.08 mW,380210.74 pJ/it +conv/pointwise_tiled_chain,arch-a,PASS,PASS,0.819 s,0.01 MiB,0.04 MiB,20,80,0.04 ms,153.88 mW,6445455.20 pJ,0.777 s,0.05 MiB,0.08 MiB,22,80,12500.00 samples/s,0.08 ms,69.67 mW,5573378.45 pJ/it +conv/real_asymmetric_padding,arch-a,PASS,PASS,0.074 s,0.01 MiB,0.03 MiB,29,28,0.01 ms,153.67 mW,2221606.72 pJ,0.087 s,0.00 MiB,0.03 MiB,31,28,104000.00 samples/s,0.01 ms,135.38 mW,1295814.97 pJ/it +conv/relu_conv_store,arch-a,PASS,PASS,0.102 s,0.16 MiB,0.67 MiB,168,184,0.56 ms,183.08 mW,103057892.80 pJ,0.291 s,0.32 MiB,0.67 MiB,168,166,1640.00 samples/s,0.61 ms,182.39 mW,113644022.20 pJ/it +conv/same_lower_3x3,arch-a,PASS,PASS,0.069 s,0.01 MiB,0.02 MiB,26,25,0.01 ms,166.15 mW,2215009.00 pJ,0.088 s,0.01 MiB,0.03 MiB,28,25,114000.00 samples/s,0.01 ms,134.46 mW,1180460.00 pJ/it +conv/same_padding_3x3,arch-a,PASS,PASS,0.062 s,0.01 MiB,0.02 MiB,26,25,0.01 ms,166.15 mW,2215009.00 pJ,0.083 s,0.01 MiB,0.03 MiB,28,25,114000.00 samples/s,0.01 ms,134.46 mW,1180460.00 pJ/it +conv/strategy_depthwise_16,arch-a,PASS,PASS,0.093 s,0.06 MiB,0.35 MiB,168,168,0.34 ms,197.94 mW,66331479.08 pJ,0.298 s,0.15 MiB,0.37 MiB,168,168,2890.00 samples/s,0.35 ms,196.87 mW,70672344.81 pJ/it +conv/strategy_input_k_tiled,arch-a,PASS,PASS,0.079 s,0.08 MiB,0.27 MiB,109,108,0.35 ms,170.81 mW,60422605.92 pJ,0.120 s,0.16 MiB,0.30 MiB,85,101,3520.00 samples/s,0.28 ms,138.29 mW,40167697.42 pJ/it +conv/strategy_output_channel_tiled,arch-a,PASS,PASS,0.079 s,0.03 MiB,0.16 MiB,74,72,0.09 ms,155.74 mW,14244739.28 pJ,0.146 s,0.08 MiB,0.25 MiB,111,72,12000.00 samples/s,0.08 ms,137.73 mW,12695085.91 pJ/it +conv/strategy_streamed_packed,arch-a,PASS,PASS,0.168 s,3.34 MiB,7.89 MiB,168,168,9.35 ms,179.86 mW,1682364509.56 pJ,0.453 s,5.38 MiB,7.87 MiB,127,126,119.00 samples/s,8.39 ms,175.52 mW,1616768905.00 pJ/it +conv/strategy_streamed_patch,arch-a,PASS,PASS,0.110 s,0.34 MiB,1.32 MiB,168,168,1.90 ms,181.91 mW,346476645.64 pJ,0.416 s,0.84 MiB,1.29 MiB,127,126,525.00 samples/s,1.90 ms,176.18 mW,359355537.30 pJ/it +conv/strategy_tiled_2d,arch-a,PASS,PASS,0.170 s,0.11 MiB,0.44 MiB,168,168,0.42 ms,182.13 mW,75690907.84 pJ,0.235 s,0.28 MiB,0.45 MiB,130,168,3010.00 samples/s,0.33 ms,178.45 mW,62153061.01 pJ/it +conv/stride_2,arch-a,PASS,PASS,0.060 s,0.01 MiB,0.00 MiB,5,4,0.01 ms,110.78 mW,580154.96 pJ,0.061 s,0.01 MiB,0.00 MiB,7,4,297000.00 samples/s,0.00 ms,48.26 mW,163092.63 pJ/it +conv/with_bias_3x3,arch-a,PASS,PASS,0.069 s,0.00 MiB,0.01 MiB,4,3,0.01 ms,104.16 mW,776220.72 pJ,0.066 s,0.00 MiB,0.01 MiB,4,3,128000.00 samples/s,0.01 ms,28.71 mW,224217.97 pJ/it +conv/with_constant,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,1,1,0.01 ms,81.74 mW,541270.24 pJ,0.067 s,0.00 MiB,0.00 MiB,4,1,138000.00 samples/s,0.01 ms,90.41 mW,664255.74 pJ/it +conv/without_kernel_shape_attr,arch-a,PASS,PASS,0.064 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,123.80 mW,889640.16 pJ,0.066 s,0.01 MiB,0.01 MiB,12,9,219000.00 samples/s,0.00 ms,83.71 mW,382318.91 pJ/it +conv/yolo11n_depthwise_head,arch-a,PASS,PASS,2.447 s,8.66 MiB,34.24 MiB,168,255,42.70 ms,200.52 mW,8562449708.00 pJ,3.011 s,22.90 MiB,34.20 MiB,168,216,19.40 samples/s,51.59 ms,195.15 mW,10205156420.00 pJ/it +conv/yolo11n_heavy,arch-a,PASS,PASS,0.585 s,4.82 MiB,19.10 MiB,161,800,8.54 ms,350.86 mW,2994764012.00 pJ,1.897 s,10.40 MiB,20.59 MiB,161,800,83.80 samples/s,11.93 ms,299.23 mW,3739084612.00 pJ/it +conv/yolo11n_stem,arch-a,PASS,PASS,0.996 s,12.86 MiB,37.59 MiB,168,488,14.24 ms,301.23 mW,4289558753.00 pJ,1.726 s,22.34 MiB,32.79 MiB,168,362,23.80 samples/s,42.04 ms,214.78 mW,9030156087.00 pJ/it +div/after_gemm,arch-a,PASS,PASS,0.065 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,104.70 mW,815012.96 pJ,0.071 s,0.01 MiB,0.01 MiB,6,4,145000.00 samples/s,0.01 ms,31.45 mW,216167.21 pJ/it +div/basic,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.057 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +div/channel_broadcast_1024,arch-a,PASS,PASS,0.060 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.056 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it +div/leading_dimension_broadcast,arch-a,PASS,PASS,0.067 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +div/runtime_scalar_rhs,arch-a,PASS,PASS,0.057 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.055 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it +div/scalar_constant,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +gather/3d_input_axis1,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.08 mW,45990.00 pJ,0.056 s,0.00 MiB,0.00 MiB,1,0,1700000.00 samples/s,0.00 ms,2.08 mW,1174.67 pJ/it +gather/axis0_matrix_indices,arch-a,PASS,PASS,0.083 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.07 mW,54414.00 pJ,0.072 s,0.00 MiB,0.00 MiB,1,0,1440000.00 samples/s,0.00 ms,2.07 mW,1390.67 pJ/it +gather/axis1,arch-a,PASS,PASS,0.064 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.06 mW,62526.00 pJ,0.066 s,0.00 MiB,0.00 MiB,1,0,1250000.00 samples/s,0.00 ms,2.06 mW,1598.67 pJ/it +gather/negative_axis,arch-a,PASS,PASS,0.078 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.03 mW,112134.00 pJ,0.064 s,0.00 MiB,0.00 MiB,1,0,697000.00 samples/s,0.00 ms,2.03 mW,2870.67 pJ/it +gather/negative_indices,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.13 mW,29376.00 pJ,0.062 s,0.00 MiB,0.00 MiB,1,0,2670000.00 samples/s,0.00 ms,2.12 mW,748.67 pJ/it +gemm/alpha_beta,arch-a,PASS,PASS,0.068 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,105.27 mW,784908.96 pJ,0.070 s,0.01 MiB,0.01 MiB,6,4,153000.00 samples/s,0.01 ms,32.18 mW,210663.21 pJ/it +gemm/bias_rank2_broadcast,arch-a,PASS,PASS,0.063 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,105.98 mW,749484.96 pJ,0.063 s,0.01 MiB,0.01 MiB,6,4,168000.00 samples/s,0.01 ms,33.68 mW,200469.21 pJ/it +gemm/dynamic,arch-a,PASS,PASS,0.065 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.48 mW,221475.00 pJ,0.062 s,0.00 MiB,0.00 MiB,5,0,471000.00 samples/s,0.00 ms,20.30 mW,43105.75 pJ/it +gemm/dynamic_alpha,arch-a,PASS,PASS,0.064 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.42 mW,298198.00 pJ,0.063 s,0.00 MiB,0.00 MiB,5,0,337000.00 samples/s,0.00 ms,20.28 mW,60117.75 pJ/it +gemm/dynamic_beta,arch-a,PASS,PASS,0.070 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.32 mW,398595.00 pJ,0.059 s,0.00 MiB,0.00 MiB,5,0,246000.00 samples/s,0.00 ms,20.21 mW,82201.75 pJ/it +gemm/dynamic_bias,arch-a,PASS,PASS,0.066 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.45 mW,243703.00 pJ,0.063 s,0.00 MiB,0.00 MiB,5,0,422000.00 samples/s,0.00 ms,20.28 mW,48009.75 pJ/it +gemm/dynamic_bias_alpha_beta,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,5,0,0.01 ms,91.28 mW,513811.00 pJ,0.077 s,0.00 MiB,0.00 MiB,5,0,188000.00 samples/s,0.01 ms,20.20 mW,107673.75 pJ/it +gemm/dynamic_transpose_b,arch-a,PASS,PASS,0.064 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.38 mW,118883.00 pJ,0.065 s,0.00 MiB,0.00 MiB,5,0,781000.00 samples/s,0.00 ms,20.51 mW,26151.50 pJ/it +gemm/huge_1024,arch-a,PASS,PASS,0.182 s,0.01 MiB,0.10 MiB,73,64,0.02 ms,215.04 mW,3767885.36 pJ,0.220 s,0.03 MiB,0.10 MiB,73,64,36900.00 samples/s,0.03 ms,148.63 mW,4053069.50 pJ/it +gemm/large,arch-a,PASS,PASS,0.074 s,0.02 MiB,0.03 MiB,17,16,0.01 ms,140.15 mW,1573768.84 pJ,0.082 s,0.02 MiB,0.03 MiB,17,16,88800.00 samples/s,0.01 ms,84.59 mW,942235.51 pJ/it +gemm/large_k_small_n,arch-a,PASS,PASS,0.142 s,0.01 MiB,0.01 MiB,9,8,0.00 ms,133.48 mW,633769.92 pJ,0.119 s,0.01 MiB,0.01 MiB,9,8,194000.00 samples/s,0.01 ms,76.91 mW,390598.09 pJ/it +gemm/non_square,arch-a,PASS,PASS,0.069 s,0.00 MiB,0.01 MiB,5,4,0.00 ms,118.96 mW,419565.96 pJ,0.069 s,0.00 MiB,0.01 MiB,5,4,270000.00 samples/s,0.00 ms,46.78 mW,172713.46 pJ/it +gemm/scalar_bias,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,105.98 mW,749484.96 pJ,0.066 s,0.01 MiB,0.01 MiB,6,4,168000.00 samples/s,0.01 ms,33.68 mW,200469.21 pJ/it +gemm/small,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,2,2,0.00 ms,90.14 mW,398436.48 pJ,0.059 s,0.00 MiB,0.00 MiB,4,2,327000.00 samples/s,0.00 ms,61.13 mW,188023.48 pJ/it +gemm/small_k_large_n,arch-a,PASS,PASS,0.112 s,0.01 MiB,0.02 MiB,17,8,0.01 ms,131.01 mW,1043061.92 pJ,0.100 s,0.01 MiB,0.02 MiB,18,8,141000.00 samples/s,0.01 ms,47.48 mW,336507.17 pJ/it +gemm/square_weights,arch-a,PASS,PASS,0.080 s,0.03 MiB,0.08 MiB,42,40,0.02 ms,151.77 mW,3284393.60 pJ,0.100 s,0.03 MiB,0.09 MiB,44,40,51800.00 samples/s,0.02 ms,115.71 mW,2278356.60 pJ/it +gemm/transpose_a,arch-a,PASS,PASS,0.063 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,109.14 mW,628868.96 pJ,0.062 s,0.00 MiB,0.01 MiB,6,4,212000.00 samples/s,0.00 ms,38.03 mW,179501.21 pJ/it +gemm/transpose_a_and_b,arch-a,PASS,PASS,0.070 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,109.14 mW,628868.96 pJ,0.080 s,0.00 MiB,0.01 MiB,6,4,212000.00 samples/s,0.00 ms,38.03 mW,179501.21 pJ/it +gemm/transpose_b,arch-a,PASS,PASS,0.065 s,0.00 MiB,0.01 MiB,5,4,0.00 ms,118.96 mW,419565.96 pJ,0.069 s,0.00 MiB,0.01 MiB,5,4,270000.00 samples/s,0.00 ms,46.78 mW,172713.46 pJ/it +gemm/transpose_b_with_bias,arch-a,PASS,PASS,0.064 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,110.55 mW,557818.96 pJ,0.071 s,0.01 MiB,0.01 MiB,5,4,191000.00 samples/s,0.01 ms,38.98 mW,203117.46 pJ/it +gemm/with_bias,arch-a,PASS,PASS,0.064 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,108.77 mW,604966.96 pJ,0.062 s,0.01 MiB,0.01 MiB,5,4,175000.00 samples/s,0.01 ms,37.33 mW,213443.71 pJ/it +gemv/all_constant,arch-a,PASS,PASS,0.071 s,0.00 MiB,0.00 MiB,0,0,0.00 ms,2.00 mW,0.00 pJ,0.061 s,0.00 MiB,0.00 MiB,0,0,0.00 samples/s,0.00 ms,2.00 mW,0.00 pJ/it +gemv/constant_weight,arch-a,PASS,PASS,0.100 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,111.15 mW,573535.96 pJ,0.079 s,0.00 MiB,0.01 MiB,8,4,235000.00 samples/s,0.00 ms,68.14 mW,293181.96 pJ/it +gemv/non_uniform_bias,arch-a,PASS,PASS,0.080 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,109.82 mW,609371.96 pJ,0.081 s,0.00 MiB,0.01 MiB,8,4,215000.00 samples/s,0.00 ms,66.23 mW,310779.96 pJ/it +gemv/scalar_bias,arch-a,PASS,PASS,0.092 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,109.82 mW,609371.96 pJ,0.095 s,0.00 MiB,0.01 MiB,8,4,215000.00 samples/s,0.00 ms,66.23 mW,310779.96 pJ/it +gemv/uniform_bias,arch-a,PASS,PASS,0.090 s,0.00 MiB,0.01 MiB,6,4,0.01 ms,109.82 mW,609371.96 pJ,0.149 s,0.00 MiB,0.01 MiB,8,4,215000.00 samples/s,0.00 ms,66.23 mW,310779.96 pJ/it +matmul/basic,arch-a,PASS,PASS,0.089 s,0.00 MiB,0.00 MiB,2,2,0.00 ms,90.14 mW,398436.48 pJ,0.071 s,0.00 MiB,0.00 MiB,4,2,327000.00 samples/s,0.00 ms,61.13 mW,188023.48 pJ/it +matmul/batched_3d,arch-a,PASS,PASS,0.099 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,108.59 mW,646972.96 pJ,0.086 s,0.00 MiB,0.01 MiB,6,4,207000.00 samples/s,0.00 ms,37.52 mW,181507.21 pJ/it +matmul/batched_3d_dynamic,arch-a,PASS,PASS,0.065 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,92.19 mW,167975.00 pJ,0.065 s,0.00 MiB,0.00 MiB,5,0,736000.00 samples/s,0.00 ms,17.42 mW,23971.67 pJ/it +matmul/batched_left_constant,arch-a,PASS,PASS,0.069 s,0.00 MiB,0.02 MiB,9,8,0.01 ms,114.39 mW,1009105.92 pJ,0.070 s,0.01 MiB,0.02 MiB,11,8,133000.00 samples/s,0.01 ms,58.19 mW,441494.75 pJ/it +matmul/batched_lhs_broadcast,arch-a,PASS,PASS,0.065 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,109.39 mW,621440.96 pJ,0.071 s,0.00 MiB,0.01 MiB,6,4,217000.00 samples/s,0.00 ms,38.52 mW,177665.21 pJ/it +matmul/batched_rhs_broadcast,arch-a,PASS,PASS,0.065 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,108.59 mW,646972.96 pJ,0.065 s,0.00 MiB,0.01 MiB,6,4,207000.00 samples/s,0.00 ms,37.52 mW,181507.21 pJ/it +matmul/dynamic,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.42 mW,148195.00 pJ,0.080 s,0.00 MiB,0.00 MiB,5,0,628000.00 samples/s,0.00 ms,20.41 mW,32505.75 pJ/it +matmul/huge_1024,arch-a,PASS,PASS,0.188 s,0.01 MiB,0.10 MiB,73,64,0.02 ms,215.04 mW,3767885.36 pJ,0.224 s,0.03 MiB,0.10 MiB,73,64,36900.00 samples/s,0.03 ms,148.63 mW,4053069.50 pJ/it +matmul/left_constant,arch-a,PASS,PASS,0.076 s,0.00 MiB,0.01 MiB,5,4,0.01 ms,108.86 mW,637168.96 pJ,0.068 s,0.00 MiB,0.01 MiB,6,4,208000.00 samples/s,0.00 ms,37.62 mW,180976.21 pJ/it +matmul/matrix_vector,arch-a,PASS,PASS,0.120 s,0.52 MiB,0.78 MiB,168,173,0.38 ms,202.13 mW,77751814.88 pJ,0.384 s,0.97 MiB,0.72 MiB,127,173,2250.00 samples/s,0.44 ms,193.72 mW,92630594.79 pJ/it +matmul/vector_matrix,arch-a,PASS,PASS,0.099 s,0.01 MiB,0.01 MiB,9,8,0.01 ms,118.68 mW,879301.92 pJ,0.104 s,0.01 MiB,0.01 MiB,9,8,132000.00 samples/s,0.01 ms,45.10 mW,342617.42 pJ/it +matmul/yolo_attention,arch-a,PASS,PASS,0.526 s,1.02 MiB,43.44 MiB,168,0,8.15 ms,170.00 mW,1385775865.00 pJ,0.796 s,13.76 MiB,43.56 MiB,136,0,65.40 samples/s,15.29 ms,166.46 mW,2545338467.00 pJ/it +mul/after_conv,arch-a,PASS,PASS,0.072 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,107.64 mW,586955.72 pJ,0.072 s,0.00 MiB,0.00 MiB,4,3,183000.00 samples/s,0.01 ms,32.66 mW,178132.97 pJ/it +mul/after_conv_scalar_constant,arch-a,PASS,PASS,0.120 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,107.64 mW,586955.72 pJ,0.160 s,0.00 MiB,0.00 MiB,4,3,183000.00 samples/s,0.01 ms,32.66 mW,178132.97 pJ/it +mul/basic,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.086 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +mul/channel_broadcast_1024,arch-a,PASS,PASS,0.063 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.061 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it +mul/leading_dimension_broadcast,arch-a,PASS,PASS,0.064 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.059 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +mul/scalar_constant,arch-a,PASS,PASS,0.065 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.066 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +pool/avg_basic,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,931506.00 pJ,0.063 s,0.00 MiB,0.00 MiB,1,0,84000.00 samples/s,0.01 ms,2.02 mW,24067.00 pJ/it +pool/avg_ceil_mode,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.03 mW,340146.00 pJ,0.057 s,0.00 MiB,0.00 MiB,1,0,230000.00 samples/s,0.00 ms,2.03 mW,8810.67 pJ/it +pool/avg_explicit_padding,arch-a,PASS,PASS,0.125 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.03 mW,688356.00 pJ,0.077 s,0.00 MiB,0.00 MiB,1,0,114000.00 samples/s,0.01 ms,2.03 mW,17809.00 pJ/it +pool/avg_include_pad,arch-a,PASS,PASS,0.064 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,663612.00 pJ,0.059 s,0.00 MiB,0.00 MiB,1,0,118000.00 samples/s,0.01 ms,2.02 mW,17081.00 pJ/it +pool/avg_large_channels,arch-a,PASS,PASS,0.069 s,0.04 MiB,0.02 MiB,1,0,0.24 ms,78.00 mW,18399156.00 pJ,0.067 s,0.04 MiB,0.02 MiB,1,0,4250.00 samples/s,0.24 ms,2.00 mW,471428.00 pJ/it +pool/avg_non_uniform_stride,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,1132254.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,69100.00 samples/s,0.01 ms,2.02 mW,29191.00 pJ/it +pool/avg_real_asymmetric_padding,arch-a,PASS,PASS,0.070 s,0.00 MiB,0.00 MiB,1,0,0.03 ms,78.02 mW,1966692.00 pJ,0.073 s,0.00 MiB,0.00 MiB,1,0,39700.00 samples/s,0.03 ms,2.02 mW,50961.00 pJ/it +pool/max_after_conv,arch-a,PASS,PASS,0.069 s,0.00 MiB,0.00 MiB,5,4,0.01 ms,99.12 mW,1210689.96 pJ,0.074 s,0.00 MiB,0.00 MiB,5,4,81600.00 samples/s,0.01 ms,28.10 mW,344619.71 pJ/it +pool/max_basic,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.06 mW,324744.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,241000.00 samples/s,0.00 ms,2.06 mW,8532.67 pJ/it +pool/max_ceil_mode,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.07 mW,151464.00 pJ,0.059 s,0.00 MiB,0.00 MiB,1,0,516000.00 samples/s,0.00 ms,2.07 mW,3972.67 pJ/it +pool/max_global_style_kernel_equals_input,arch-a,PASS,PASS,0.066 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.01 mW,658626.00 pJ,0.063 s,0.00 MiB,0.00 MiB,1,0,119000.00 samples/s,0.01 ms,2.01 mW,16871.00 pJ/it +pool/max_non_square_kernel,arch-a,PASS,PASS,0.070 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.02 mW,1063068.00 pJ,0.063 s,0.00 MiB,0.00 MiB,1,0,73600.00 samples/s,0.01 ms,2.02 mW,27417.00 pJ/it +pool/max_real_asymmetric_padding,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.03 mW,814992.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,96100.00 samples/s,0.01 ms,2.03 mW,21173.00 pJ/it +pool/max_same_upper,arch-a,PASS,PASS,0.066 s,0.00 MiB,0.00 MiB,1,0,0.01 ms,78.04 mW,625068.00 pJ,0.067 s,0.00 MiB,0.00 MiB,1,0,125000.00 samples/s,0.01 ms,2.04 mW,16233.00 pJ/it +pool/max_stride2_multichannel,arch-a,PASS,PASS,0.067 s,0.00 MiB,0.00 MiB,1,0,0.02 ms,78.02 mW,1247274.00 pJ,0.074 s,0.00 MiB,0.00 MiB,1,0,62700.00 samples/s,0.02 ms,2.02 mW,32153.00 pJ/it +reduce_mean/4d_spatial,arch-a,PASS,PASS,0.068 s,0.00 MiB,0.00 MiB,3,0,0.00 ms,92.45 mW,29676.00 pJ,0.068 s,0.00 MiB,0.00 MiB,3,0,2310000.00 samples/s,0.00 ms,4.54 mW,1959.17 pJ/it +reduce_mean/4d_spatial_keepdims_0,arch-a,PASS,PASS,0.072 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,94.35 mW,61801.00 pJ,0.070 s,0.00 MiB,0.00 MiB,4,0,1210000.00 samples/s,0.00 ms,19.43 mW,16020.25 pJ/it +reduce_mean/after_conv,arch-a,PASS,PASS,0.071 s,0.00 MiB,0.00 MiB,5,3,0.01 ms,106.95 mW,571332.72 pJ,0.075 s,0.00 MiB,0.00 MiB,5,3,183000.00 samples/s,0.01 ms,19.71 mW,107526.72 pJ/it +reduce_mean/all_axes_keepdims_0,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.24 mW,30982.00 pJ,0.063 s,0.00 MiB,0.00 MiB,2,0,2530000.00 samples/s,0.00 ms,3.31 mW,1260.00 pJ/it +reduce_mean/all_axes_keepdims_1,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.067 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it +reduce_mean/basic,arch-a,PASS,PASS,0.068 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,93.51 mW,34881.00 pJ,0.061 s,0.00 MiB,0.00 MiB,4,0,2600000.00 samples/s,0.00 ms,5.85 mW,2235.67 pJ/it +reduce_mean/channel_axis_nchw,arch-a,PASS,PASS,0.061 s,0.03 MiB,0.02 MiB,4,0,0.16 ms,93.60 mW,15436518.00 pJ,0.062 s,0.03 MiB,0.08 MiB,4,0,12900.00 samples/s,0.08 ms,5.00 mW,388853.50 pJ/it +reduce_mean/keepdims_0,arch-a,PASS,PASS,0.067 s,0.00 MiB,0.00 MiB,5,0,0.00 ms,91.40 mW,68368.00 pJ,0.056 s,0.00 MiB,0.00 MiB,5,0,1300000.00 samples/s,0.00 ms,20.71 mW,16115.50 pJ/it +reduce_mean/large_dimension_1024,arch-a,PASS,PASS,0.057 s,0.01 MiB,0.00 MiB,1,0,0.00 ms,78.02 mW,217278.00 pJ,0.056 s,0.01 MiB,0.00 MiB,1,0,359000.00 samples/s,0.00 ms,2.02 mW,5274.00 pJ/it +reduce_mean/legacy_axes_1_2_keepdims_1,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.35 mW,21505.00 pJ,0.058 s,0.00 MiB,0.00 MiB,2,0,3620000.00 samples/s,0.00 ms,3.45 mW,898.00 pJ/it +reduce_mean/legacy_axis1_keepdims_0,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,9,0,0.00 ms,92.50 mW,183708.00 pJ,0.065 s,0.00 MiB,0.00 MiB,9,0,679000.00 samples/s,0.00 ms,38.84 mW,57998.17 pJ/it +reduce_mean/legacy_axis1_keepdims_1,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,8,0,0.00 ms,94.56 mW,129830.00 pJ,0.066 s,0.00 MiB,0.00 MiB,8,0,1340000.00 samples/s,0.00 ms,10.15 mW,7594.50 pJ/it +reduce_mean/legacy_empty_axes_noop,arch-a,PASS,PASS,0.051 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it +reduce_mean/legacy_nchw_spatial,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,3,0,0.00 ms,92.45 mW,29676.00 pJ,0.058 s,0.00 MiB,0.00 MiB,3,0,1720000.00 samples/s,0.00 ms,4.40 mW,2552.75 pJ/it +reduce_mean/legacy_negative_axis,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,6,0,0.00 ms,93.52 mW,51717.00 pJ,0.060 s,0.00 MiB,0.00 MiB,6,0,1760000.00 samples/s,0.00 ms,8.07 mW,4588.50 pJ/it +reduce_mean/legacy_reduce_all_keepdims_1,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.054 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it +reduce_mean/negative_axis,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,6,0,0.00 ms,93.52 mW,51717.00 pJ,0.058 s,0.00 MiB,0.00 MiB,6,0,1760000.00 samples/s,0.00 ms,8.07 mW,4588.50 pJ/it +relu/4d,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.18 mW,40734.00 pJ,0.053 s,0.00 MiB,0.00 MiB,1,0,1930000.00 samples/s,0.00 ms,2.18 mW,1014.00 pJ/it +relu/after_conv,arch-a,PASS,PASS,0.063 s,0.00 MiB,0.00 MiB,4,3,0.01 ms,107.89 mW,577437.72 pJ,0.067 s,0.00 MiB,0.00 MiB,4,3,187000.00 samples/s,0.01 ms,32.91 mW,176189.97 pJ/it +relu/after_gemm,arch-a,PASS,PASS,0.069 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,105.16 mW,790056.96 pJ,0.074 s,0.01 MiB,0.01 MiB,6,4,151000.00 samples/s,0.01 ms,32.04 mW,211536.21 pJ/it +relu/basic,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.057 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it +reshape/4d_to_2d_flatten,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.28 mW,20196.00 pJ,0.061 s,0.00 MiB,0.00 MiB,1,0,3910000.00 samples/s,0.00 ms,2.28 mW,488.00 pJ/it +reshape/infer_dim_minus_one,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,12684.00 pJ,0.058 s,0.00 MiB,0.00 MiB,1,0,6250000.00 samples/s,0.00 ms,2.30 mW,308.00 pJ/it +reshape/same_rank,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,12684.00 pJ,0.058 s,0.00 MiB,0.00 MiB,1,0,6250000.00 samples/s,0.00 ms,2.30 mW,308.00 pJ/it +reshape/zero_copies_input_dim,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,12684.00 pJ,0.056 s,0.00 MiB,0.00 MiB,1,0,6250000.00 samples/s,0.00 ms,2.30 mW,308.00 pJ/it +resize/height_only,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,93.55 mW,64833.00 pJ,0.063 s,0.00 MiB,0.00 MiB,4,0,1880000.00 samples/s,0.00 ms,5.60 mW,2986.00 pJ/it +resize/nearest_2x,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,4,0,0.00 ms,93.57 mW,109761.00 pJ,0.059 s,0.00 MiB,0.00 MiB,4,0,1450000.00 samples/s,0.00 ms,5.46 mW,3776.00 pJ/it +resize/nearest_downsample,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.45 mW,33925.00 pJ,0.059 s,0.00 MiB,0.00 MiB,2,0,2330000.00 samples/s,0.00 ms,3.28 mW,1360.50 pJ/it +resize/non_uniform_scales,arch-a,PASS,PASS,0.063 s,0.00 MiB,0.00 MiB,6,0,0.00 ms,93.58 mW,164037.00 pJ,0.069 s,0.00 MiB,0.00 MiB,6,0,1250000.00 samples/s,0.00 ms,7.76 mW,6207.25 pJ/it +resize/width_only,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,2,0,0.00 ms,79.50 mW,53029.00 pJ,0.059 s,0.00 MiB,0.00 MiB,2,0,1700000.00 samples/s,0.00 ms,3.20 mW,1833.50 pJ/it +resize/with_sizes,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,3,0,0.00 ms,92.54 mW,73756.00 pJ,0.068 s,0.00 MiB,0.00 MiB,3,0,1700000.00 samples/s,0.00 ms,4.39 mW,2586.75 pJ/it +sigmoid/4d,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.18 mW,40734.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,1930000.00 samples/s,0.00 ms,2.18 mW,1014.00 pJ/it +sigmoid/after_gemm,arch-a,PASS,PASS,0.063 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,105.16 mW,790056.96 pJ,0.062 s,0.01 MiB,0.01 MiB,6,4,151000.00 samples/s,0.01 ms,32.04 mW,211536.21 pJ/it +sigmoid/basic,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,17286.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,4570000.00 samples/s,0.00 ms,2.22 mW,437.33 pJ/it +slice/2d_basic,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,18948.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,4170000.00 samples/s,0.00 ms,2.30 mW,491.67 pJ/it +slice/after_conv,arch-a,PASS,PASS,0.067 s,0.00 MiB,0.01 MiB,7,6,0.01 ms,118.19 mW,1335082.88 pJ,0.074 s,0.00 MiB,0.01 MiB,7,6,87400.00 samples/s,0.01 ms,47.90 mW,547806.13 pJ/it +slice/default_axes,arch-a,PASS,PASS,0.055 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,18948.00 pJ,0.054 s,0.00 MiB,0.00 MiB,1,0,4170000.00 samples/s,0.00 ms,2.30 mW,491.67 pJ/it +slice/large_channel_1024,arch-a,PASS,PASS,0.059 s,0.01 MiB,0.00 MiB,1,0,0.00 ms,78.14 mW,221304.00 pJ,0.052 s,0.01 MiB,0.00 MiB,1,0,353000.00 samples/s,0.00 ms,2.14 mW,5058.00 pJ/it +slice/nchw_spatial_crop,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.24 mW,101868.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,769000.00 samples/s,0.00 ms,2.24 mW,2851.67 pJ/it +slice/negative_axis,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,44004.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,1790000.00 samples/s,0.00 ms,2.30 mW,1227.67 pJ/it +slice/negative_indices,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,25212.00 pJ,0.054 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.30 mW,675.67 pJ/it +slice/step2,arch-a,PASS,PASS,0.054 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.29 mW,159876.00 pJ,0.053 s,0.00 MiB,0.00 MiB,1,0,490000.00 samples/s,0.00 ms,2.29 mW,4619.67 pJ/it +softmax/3d_last_axis,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.056 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED +softmax/basic,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.058 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED +softmax/channel_axis,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.067 s,0.00 MiB,0.00 MiB,3,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED +softmax/large_dimension_1024,arch-a,PASS,PASS,0.059 s,0.01 MiB,0.01 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.054 s,0.01 MiB,0.01 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED +softmax/negative_axis,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,0.060 s,0.00 MiB,0.00 MiB,1,0,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED,UNSUPPORTED +split/basic,arch-a,PASS,PASS,0.114 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,31554.00 pJ,0.067 s,0.00 MiB,0.00 MiB,1,0,2490000.00 samples/s,0.00 ms,2.30 mW,861.67 pJ/it +split/equal_three_way,arch-a,PASS,PASS,0.060 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,44160.00 pJ,0.073 s,0.00 MiB,0.00 MiB,1,0,1780000.00 samples/s,0.00 ms,2.30 mW,1231.67 pJ/it +split/negative_axis,arch-a,PASS,PASS,0.061 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.29 mW,84786.00 pJ,0.059 s,0.00 MiB,0.00 MiB,1,0,925000.00 samples/s,0.00 ms,2.29 mW,2413.67 pJ/it +split/uneven_channel_axis_4d,arch-a,PASS,PASS,0.058 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.30 mW,18948.00 pJ,0.060 s,0.00 MiB,0.00 MiB,1,0,4170000.00 samples/s,0.00 ms,2.30 mW,491.67 pJ/it +sub/after_gemm,arch-a,PASS,PASS,0.065 s,0.01 MiB,0.01 MiB,5,4,0.01 ms,104.70 mW,815012.96 pJ,0.065 s,0.01 MiB,0.01 MiB,6,4,145000.00 samples/s,0.01 ms,31.45 mW,216167.21 pJ/it +sub/basic,arch-a,PASS,PASS,0.062 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.055 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +sub/broadcast_row,arch-a,PASS,PASS,0.059 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.077 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it +sub/channel_broadcast_1024,arch-a,PASS,PASS,0.064 s,0.02 MiB,0.01 MiB,1,0,0.01 ms,78.12 mW,540030.00 pJ,0.058 s,0.02 MiB,0.01 MiB,1,0,145000.00 samples/s,0.01 ms,2.11 mW,13388.67 pJ/it +sub/constant_lhs_broadcast,arch-a,PASS,PASS,0.057 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25188.00 pJ,0.061 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,656.67 pJ/it +sub/leading_dimension_broadcast,arch-a,PASS,PASS,0.056 s,0.00 MiB,0.00 MiB,1,0,0.00 ms,78.22 mW,25266.00 pJ,0.057 s,0.00 MiB,0.00 MiB,1,0,3120000.00 samples/s,0.00 ms,2.23 mW,658.67 pJ/it