full ops throughput validation now passes
This commit is contained in:
@@ -695,13 +695,16 @@ void PimCodeGen::codeGenSendOp(pim::PimSendOp sendOp, const StaticValueKnowledge
|
|||||||
void PimCodeGen::codeGenWaitOp(
|
void PimCodeGen::codeGenWaitOp(
|
||||||
pim::PimWaitOp waitOp, const StaticValueKnowledge& knowledge) const {
|
pim::PimWaitOp waitOp, const StaticValueKnowledge& knowledge) const {
|
||||||
auto eventRegister = indexOf(waitOp.getEventRegister(), knowledge);
|
auto eventRegister = indexOf(waitOp.getEventRegister(), knowledge);
|
||||||
assert(succeeded(eventRegister)
|
auto waitValue = indexOf(waitOp.getWaitValue(), knowledge);
|
||||||
&& "pim.wait event register must be statically resolvable during codegen");
|
assert(succeeded(eventRegister) && succeeded(waitValue)
|
||||||
|
&& "pim.wait operands must be statically resolvable during codegen");
|
||||||
|
if (*waitValue == 0)
|
||||||
|
return;
|
||||||
pim_binary::InstructionRecord instruction;
|
pim_binary::InstructionRecord instruction;
|
||||||
instruction.opcode = pim_binary::Opcode::wait;
|
instruction.opcode = pim_binary::Opcode::wait;
|
||||||
instruction.generic1 = pim::checkedI32OrCrash(
|
instruction.generic1 = pim::checkedI32OrCrash(
|
||||||
*eventRegister, "wait event register");
|
*eventRegister, "wait event register");
|
||||||
instruction.generic2 = waitOp.getWaitValue();
|
instruction.generic2 = pim::checkedI32OrCrash(*waitValue, "wait value");
|
||||||
emitInstruction(instruction);
|
emitInstruction(instruction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "src/Accelerators/PIM/Common/PimCommon.hpp"
|
||||||
#include "src/Accelerators/PIM/Compiler/PimCompilerOptions.hpp"
|
#include "src/Accelerators/PIM/Compiler/PimCompilerOptions.hpp"
|
||||||
#include "src/Accelerators/PIM/Compiler/PimCompilerUtils.hpp"
|
#include "src/Accelerators/PIM/Compiler/PimCompilerUtils.hpp"
|
||||||
#include "src/Accelerators/PIM/Conversion/ONNXToSpatial/ONNXToSpatialOptions.hpp"
|
#include "src/Accelerators/PIM/Conversion/ONNXToSpatial/ONNXToSpatialOptions.hpp"
|
||||||
@@ -78,6 +79,7 @@ spatial::SchedulingTarget getDefaultPimSchedulingTarget() {
|
|||||||
target.residentWeightCapacity = crossbarCountInCore.getValue();
|
target.residentWeightCapacity = crossbarCountInCore.getValue();
|
||||||
target.matrixRows = crossbarSize.getValue();
|
target.matrixRows = crossbarSize.getValue();
|
||||||
target.matrixColumns = crossbarSize.getValue();
|
target.matrixColumns = crossbarSize.getValue();
|
||||||
|
target.synchronizationRegisterCount = kPimEventRegisterCount;
|
||||||
|
|
||||||
setDefaultPimInterProcessorLatencies(target);
|
setDefaultPimInterProcessorLatencies(target);
|
||||||
return target;
|
return target;
|
||||||
|
|||||||
@@ -368,11 +368,14 @@ LogicalResult raptor::SpatialToPimPass::lowerComputeOp(spatial::SpatScheduledCom
|
|||||||
return failure();
|
return failure();
|
||||||
PimWaitOp::create(
|
PimWaitOp::create(
|
||||||
rewriter, receiveOp->getLoc(), hostWaitLoad.getEventRegister(),
|
rewriter, receiveOp->getLoc(), hostWaitLoad.getEventRegister(),
|
||||||
rewriter.getI32IntegerAttr(1));
|
hostWaitLoad.getWaitValue());
|
||||||
received = PimMemCopyHostToDevOp::create(
|
received = PimMemCopyHostToDevOp::create(
|
||||||
rewriter, receiveOp->getLoc(), outputBuffer.getType(), zero,
|
rewriter, receiveOp->getLoc(), outputBuffer.getType(), zero,
|
||||||
hostWaitLoad.getHostOffset(), outputBuffer, *hostBuffer, *sizeAttr)
|
hostWaitLoad.getHostOffset(), outputBuffer, *hostBuffer, *sizeAttr)
|
||||||
.getOutput();
|
.getOutput();
|
||||||
|
PimSyncOp::create(
|
||||||
|
rewriter, receiveOp->getLoc(), hostWaitLoad.getSourceCoreId(),
|
||||||
|
hostWaitLoad.getAcknowledgementEventRegister());
|
||||||
} else {
|
} else {
|
||||||
received = PimReceiveOp::create(
|
received = PimReceiveOp::create(
|
||||||
rewriter, receiveOp->getLoc(), outputBuffer.getType(), outputBuffer,
|
rewriter, receiveOp->getLoc(), outputBuffer.getType(), outputBuffer,
|
||||||
|
|||||||
@@ -147,15 +147,42 @@ struct HostWaitLoadLowering : OpRewritePattern<spatial::SpatHostWaitLoadOp> {
|
|||||||
return failure();
|
return failure();
|
||||||
auto wait = pim::PimWaitOp::create(
|
auto wait = pim::PimWaitOp::create(
|
||||||
rewriter, op.getLoc(), op.getEventRegister(),
|
rewriter, op.getLoc(), op.getEventRegister(),
|
||||||
rewriter.getI32IntegerAttr(1));
|
op.getWaitValue());
|
||||||
copyRaptorDebugAttrs(op.getOperation(), wait.getOperation());
|
copyRaptorDebugAttrs(op.getOperation(), wait.getOperation());
|
||||||
return pim::PimMemCopyHostToDevOp::create(
|
Value output = pim::PimMemCopyHostToDevOp::create(
|
||||||
rewriter, op.getLoc(), outputBuffer.getType(), zero,
|
rewriter, op.getLoc(), outputBuffer.getType(), zero,
|
||||||
op.getHostOffset(), outputBuffer, *hostBuffer, sizeAttr).getOutput();
|
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<spatial::SpatSyncOp> {
|
||||||
|
using OpRewritePattern::OpRewritePattern;
|
||||||
|
|
||||||
|
LogicalResult matchAndRewrite(spatial::SpatSyncOp op,
|
||||||
|
PatternRewriter& rewriter) const override {
|
||||||
|
rewriter.replaceOpWithNewOp<pim::PimSyncOp>(
|
||||||
|
op, op.getTargetCoreId(), op.getEventRegister());
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WaitLowering : OpRewritePattern<spatial::SpatWaitOp> {
|
||||||
|
using OpRewritePattern::OpRewritePattern;
|
||||||
|
|
||||||
|
LogicalResult matchAndRewrite(spatial::SpatWaitOp op,
|
||||||
|
PatternRewriter& rewriter) const override {
|
||||||
|
rewriter.replaceOpWithNewOp<pim::PimWaitOp>(
|
||||||
|
op, op.getEventRegister(), op.getWaitValue());
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct ExtractRowsLowering : OpRewritePattern<spatial::SpatExtractRowsOp> {
|
struct ExtractRowsLowering : OpRewritePattern<spatial::SpatExtractRowsOp> {
|
||||||
using OpRewritePattern::OpRewritePattern;
|
using OpRewritePattern::OpRewritePattern;
|
||||||
|
|
||||||
@@ -200,7 +227,8 @@ struct ConcatLowering : OpRewritePattern<spatial::SpatConcatOp> {
|
|||||||
void populateChannelLoweringPatterns(RewritePatternSet& patterns) {
|
void populateChannelLoweringPatterns(RewritePatternSet& patterns) {
|
||||||
patterns.add<ChannelSendLowering, ChannelReceiveLowering,
|
patterns.add<ChannelSendLowering, ChannelReceiveLowering,
|
||||||
HostStoreSyncLowering, HostWaitLoadLowering,
|
HostStoreSyncLowering, HostWaitLoadLowering,
|
||||||
ExtractRowsLowering, ConcatLowering>(patterns.getContext());
|
SyncLowering, WaitLowering, ExtractRowsLowering,
|
||||||
|
ConcatLowering>(patterns.getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace onnx_mlir
|
} // namespace onnx_mlir
|
||||||
|
|||||||
@@ -128,6 +128,8 @@ void onnx_mlir::raptor::SpatialToPimPass::runOnOperation() {
|
|||||||
spatial::SpatChannelSendOp,
|
spatial::SpatChannelSendOp,
|
||||||
spatial::SpatHostStoreSyncOp,
|
spatial::SpatHostStoreSyncOp,
|
||||||
spatial::SpatHostWaitLoadOp,
|
spatial::SpatHostWaitLoadOp,
|
||||||
|
spatial::SpatSyncOp,
|
||||||
|
spatial::SpatWaitOp,
|
||||||
spatial::SpatExtractRowsOp>();
|
spatial::SpatExtractRowsOp>();
|
||||||
|
|
||||||
RewritePatternSet initialPatterns(ctx);
|
RewritePatternSet initialPatterns(ctx);
|
||||||
@@ -223,6 +225,8 @@ void onnx_mlir::raptor::SpatialToPimPass::runOnOperation() {
|
|||||||
spatial::SpatChannelSendOp,
|
spatial::SpatChannelSendOp,
|
||||||
spatial::SpatHostStoreSyncOp,
|
spatial::SpatHostStoreSyncOp,
|
||||||
spatial::SpatHostWaitLoadOp,
|
spatial::SpatHostWaitLoadOp,
|
||||||
|
spatial::SpatSyncOp,
|
||||||
|
spatial::SpatWaitOp,
|
||||||
spatial::SpatExtractRowsOp>();
|
spatial::SpatExtractRowsOp>();
|
||||||
|
|
||||||
SmallVector<pim::PimCoreOp> coreOps;
|
SmallVector<pim::PimCoreOp> coreOps;
|
||||||
@@ -274,6 +278,8 @@ void onnx_mlir::raptor::SpatialToPimPass::runOnOperation() {
|
|||||||
spatial::SpatChannelSendOp,
|
spatial::SpatChannelSendOp,
|
||||||
spatial::SpatHostStoreSyncOp,
|
spatial::SpatHostStoreSyncOp,
|
||||||
spatial::SpatHostWaitLoadOp,
|
spatial::SpatHostWaitLoadOp,
|
||||||
|
spatial::SpatSyncOp,
|
||||||
|
spatial::SpatWaitOp,
|
||||||
spatial::SpatExtractRowsOp>();
|
spatial::SpatExtractRowsOp>();
|
||||||
|
|
||||||
RewritePatternSet communicationPatterns(ctx);
|
RewritePatternSet communicationPatterns(ctx);
|
||||||
|
|||||||
@@ -302,12 +302,19 @@ static FailureOr<int64_t> getShapedByteSize(MemRefType type) {
|
|||||||
return static_cast<int64_t>(*byteSize);
|
return static_cast<int64_t>(*byteSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FailureOr<SmallVector<int64_t>>
|
struct LogicalCopyShape {
|
||||||
|
SmallVector<int64_t> dimensions;
|
||||||
|
Type elementType;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool isPackedByteBuffer(MemRefType type) {
|
||||||
|
return type.getRank() == 1 && type.getElementType().isInteger(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FailureOr<LogicalCopyShape>
|
||||||
inferLogicalCopyShape(MemRefType targetType, MemRefType sourceType, int64_t size) {
|
inferLogicalCopyShape(MemRefType targetType, MemRefType sourceType, int64_t size) {
|
||||||
if (!targetType.hasStaticShape() || !sourceType.hasStaticShape())
|
if (!targetType.hasStaticShape() || !sourceType.hasStaticShape())
|
||||||
return failure();
|
return failure();
|
||||||
if (targetType.getElementType() != sourceType.getElementType() || targetType.getRank() != sourceType.getRank())
|
|
||||||
return failure();
|
|
||||||
|
|
||||||
auto targetBytes = getShapedByteSize(targetType);
|
auto targetBytes = getShapedByteSize(targetType);
|
||||||
auto sourceBytes = getShapedByteSize(sourceType);
|
auto sourceBytes = getShapedByteSize(sourceType);
|
||||||
@@ -316,18 +323,37 @@ inferLogicalCopyShape(MemRefType targetType, MemRefType sourceType, int64_t size
|
|||||||
|
|
||||||
bool targetMatches = *targetBytes == size;
|
bool targetMatches = *targetBytes == size;
|
||||||
bool sourceMatches = *sourceBytes == 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<int64_t>(logicalType.getShape()),
|
||||||
|
logicalType.getElementType()};
|
||||||
return failure();
|
return failure();
|
||||||
if (targetMatches)
|
}
|
||||||
return SmallVector<int64_t>(targetType.getShape().begin(), targetType.getShape().end());
|
if (targetMatches && isPackedByteBuffer(sourceType))
|
||||||
if (sourceMatches)
|
return LogicalCopyShape {
|
||||||
return SmallVector<int64_t>(sourceType.getShape().begin(), sourceType.getShape().end());
|
SmallVector<int64_t>(targetType.getShape()),
|
||||||
|
targetType.getElementType()};
|
||||||
|
if (sourceMatches && isPackedByteBuffer(targetType))
|
||||||
|
return LogicalCopyShape {
|
||||||
|
SmallVector<int64_t>(sourceType.getShape()),
|
||||||
|
sourceType.getElementType()};
|
||||||
return failure();
|
return failure();
|
||||||
}
|
}
|
||||||
|
|
||||||
static FailureOr<int64_t> getContiguousSuffixRank(Value value, ArrayRef<int64_t> copyShape) {
|
static FailureOr<int64_t> getContiguousSuffixRank(
|
||||||
|
Value value, ArrayRef<int64_t> copyShape, Type elementType = {}) {
|
||||||
auto type = dyn_cast<MemRefType>(value.getType());
|
auto type = dyn_cast<MemRefType>(value.getType());
|
||||||
|
if (type && elementType && isPackedByteBuffer(type))
|
||||||
|
return copyShape.size();
|
||||||
if (!type || !type.hasStaticShape() || !hasByteSizedElementType(type.getElementType())
|
if (!type || !type.hasStaticShape() || !hasByteSizedElementType(type.getElementType())
|
||||||
|
|| (elementType && type.getElementType() != elementType)
|
||||||
|| type.getRank() != static_cast<int64_t>(copyShape.size()))
|
|| type.getRank() != static_cast<int64_t>(copyShape.size()))
|
||||||
return failure();
|
return failure();
|
||||||
if (llvm::any_of(copyShape, [](int64_t dim) { return dim <= 0; }))
|
if (llvm::any_of(copyShape, [](int64_t dim) { return dim <= 0; }))
|
||||||
@@ -351,6 +377,30 @@ static FailureOr<int64_t> getContiguousSuffixRank(Value value, ArrayRef<int64_t>
|
|||||||
return contiguousSuffixRank;
|
return contiguousSuffixRank;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FailureOr<SmallVector<int64_t>> getOuterByteStrides(
|
||||||
|
Value value, const LogicalCopyShape ©Shape, size_t outerRank) {
|
||||||
|
auto type = cast<MemRefType>(value.getType());
|
||||||
|
SmallVector<int64_t> 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<int64_t>(
|
||||||
|
getElementTypeSizeInBytes(copyShape.elementType));
|
||||||
|
SmallVector<int64_t> result;
|
||||||
|
for (int64_t stride : ArrayRef<int64_t>(strides).take_front(outerRank)) {
|
||||||
|
auto byteStride = checkedPositiveMul(stride, elementByteWidth);
|
||||||
|
if (failed(byteStride))
|
||||||
|
return failure();
|
||||||
|
result.push_back(*byteStride);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static FailureOr<CopyEndpointPlan> analyzeCopyEndpoint(Value value, Value initialByteOffset, MemRefType logicalType) {
|
static FailureOr<CopyEndpointPlan> analyzeCopyEndpoint(Value value, Value initialByteOffset, MemRefType logicalType) {
|
||||||
if (!logicalType.hasStaticShape() || !hasByteSizedElementType(logicalType.getElementType()))
|
if (!logicalType.hasStaticShape() || !hasByteSizedElementType(logicalType.getElementType()))
|
||||||
return failure();
|
return failure();
|
||||||
@@ -448,8 +498,10 @@ analyzeCopyRewrite(Value target, Value source, Value targetOffset, Value sourceO
|
|||||||
if (failed(logicalCopyShape))
|
if (failed(logicalCopyShape))
|
||||||
return failure();
|
return failure();
|
||||||
|
|
||||||
auto targetSuffixRank = getContiguousSuffixRank(target, *logicalCopyShape);
|
auto targetSuffixRank = getContiguousSuffixRank(
|
||||||
auto sourceSuffixRank = getContiguousSuffixRank(source, *logicalCopyShape);
|
target, logicalCopyShape->dimensions, logicalCopyShape->elementType);
|
||||||
|
auto sourceSuffixRank = getContiguousSuffixRank(
|
||||||
|
source, logicalCopyShape->dimensions, logicalCopyShape->elementType);
|
||||||
if (failed(targetSuffixRank) || failed(sourceSuffixRank))
|
if (failed(targetSuffixRank) || failed(sourceSuffixRank))
|
||||||
return failure();
|
return failure();
|
||||||
|
|
||||||
@@ -458,23 +510,24 @@ analyzeCopyRewrite(Value target, Value source, Value targetOffset, Value sourceO
|
|||||||
plan.source = *sourcePlan;
|
plan.source = *sourcePlan;
|
||||||
|
|
||||||
int64_t contiguousSuffixRank = std::min(*targetSuffixRank, *sourceSuffixRank);
|
int64_t contiguousSuffixRank = std::min(*targetSuffixRank, *sourceSuffixRank);
|
||||||
if (contiguousSuffixRank == static_cast<int64_t>(logicalCopyShape->size())) {
|
if (contiguousSuffixRank
|
||||||
|
== static_cast<int64_t>(logicalCopyShape->dimensions.size())) {
|
||||||
plan.kind = CopyRewritePlan::Kind::Direct;
|
plan.kind = CopyRewritePlan::Kind::Direct;
|
||||||
plan.directBytes = size;
|
plan.directBytes = size;
|
||||||
return plan;
|
return plan;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto targetStrides = getProvenMemRefStrides(target);
|
int64_t elementByteWidth = static_cast<int64_t>(
|
||||||
auto sourceStrides = getProvenMemRefStrides(source);
|
getElementTypeSizeInBytes(logicalCopyShape->elementType));
|
||||||
if (failed(targetStrides) || failed(sourceStrides))
|
|
||||||
return failure();
|
|
||||||
|
|
||||||
int64_t elementByteWidth = static_cast<int64_t>(getElementTypeSizeInBytes(targetType.getElementType()));
|
|
||||||
plan.kind = CopyRewritePlan::Kind::Loop;
|
plan.kind = CopyRewritePlan::Kind::Loop;
|
||||||
plan.loop.targetBaseOffset = plan.target.offset;
|
plan.loop.targetBaseOffset = plan.target.offset;
|
||||||
plan.loop.sourceBaseOffset = plan.source.offset;
|
plan.loop.sourceBaseOffset = plan.source.offset;
|
||||||
plan.loop.outerShape.assign(logicalCopyShape->begin(), logicalCopyShape->end() - contiguousSuffixRank);
|
plan.loop.outerShape.assign(
|
||||||
SmallVector<int64_t> chunkShape(logicalCopyShape->end() - contiguousSuffixRank, logicalCopyShape->end());
|
logicalCopyShape->dimensions.begin(),
|
||||||
|
logicalCopyShape->dimensions.end() - contiguousSuffixRank);
|
||||||
|
SmallVector<int64_t> chunkShape(
|
||||||
|
logicalCopyShape->dimensions.end() - contiguousSuffixRank,
|
||||||
|
logicalCopyShape->dimensions.end());
|
||||||
auto outerElements = checkedPositiveProduct(plan.loop.outerShape);
|
auto outerElements = checkedPositiveProduct(plan.loop.outerShape);
|
||||||
auto chunkElements = checkedPositiveProduct(chunkShape);
|
auto chunkElements = checkedPositiveProduct(chunkShape);
|
||||||
auto chunkBytes = failed(chunkElements)
|
auto chunkBytes = failed(chunkElements)
|
||||||
@@ -484,18 +537,14 @@ analyzeCopyRewrite(Value target, Value source, Value targetOffset, Value sourceO
|
|||||||
return failure();
|
return failure();
|
||||||
plan.loop.outerElements = *outerElements;
|
plan.loop.outerElements = *outerElements;
|
||||||
plan.loop.chunkBytes = *chunkBytes;
|
plan.loop.chunkBytes = *chunkBytes;
|
||||||
for (int64_t stride : ArrayRef<int64_t>(*targetStrides).take_front(plan.loop.outerShape.size())) {
|
auto targetStrides = getOuterByteStrides(
|
||||||
auto byteStride = checkedPositiveMul(stride, elementByteWidth);
|
target, *logicalCopyShape, plan.loop.outerShape.size());
|
||||||
if (failed(byteStride))
|
auto sourceStrides = getOuterByteStrides(
|
||||||
return failure();
|
source, *logicalCopyShape, plan.loop.outerShape.size());
|
||||||
plan.loop.targetOuterByteStrides.push_back(*byteStride);
|
if (failed(targetStrides) || failed(sourceStrides))
|
||||||
}
|
return failure();
|
||||||
for (int64_t stride : ArrayRef<int64_t>(*sourceStrides).take_front(plan.loop.outerShape.size())) {
|
plan.loop.targetOuterByteStrides = std::move(*targetStrides);
|
||||||
auto byteStride = checkedPositiveMul(stride, elementByteWidth);
|
plan.loop.sourceOuterByteStrides = std::move(*sourceStrides);
|
||||||
if (failed(byteStride))
|
|
||||||
return failure();
|
|
||||||
plan.loop.sourceOuterByteStrides.push_back(*byteStride);
|
|
||||||
}
|
|
||||||
if (plan.loop.chunkBytes <= 0)
|
if (plan.loop.chunkBytes <= 0)
|
||||||
return failure();
|
return failure();
|
||||||
return plan;
|
return plan;
|
||||||
|
|||||||
@@ -602,18 +602,30 @@ static LogicalResult normalizePimMemory(ModuleOp moduleOp, func::FuncOp funcOp)
|
|||||||
PatternRewriter rewriter(ctx);
|
PatternRewriter rewriter(ctx);
|
||||||
|
|
||||||
SmallVector<MemRefCopyWorkItem> copyWorklist;
|
SmallVector<MemRefCopyWorkItem> copyWorklist;
|
||||||
|
SmallVector<PimMemCopyDevToHostOp> hostToHostCopies;
|
||||||
llvm::SmallPtrSet<Operation*, 16> seenCopyOps;
|
llvm::SmallPtrSet<Operation*, 16> seenCopyOps;
|
||||||
|
llvm::SmallPtrSet<Operation*, 4> seenHostToHostCopies;
|
||||||
auto addCopyOp = [&](memref::CopyOp copyOp, const StaticValueKnowledge& knowledge) {
|
auto addCopyOp = [&](memref::CopyOp copyOp, const StaticValueKnowledge& knowledge) {
|
||||||
if (seenCopyOps.insert(copyOp.getOperation()).second)
|
if (seenCopyOps.insert(copyOp.getOperation()).second)
|
||||||
copyWorklist.push_back({copyOp, knowledge});
|
copyWorklist.push_back({copyOp, knowledge});
|
||||||
};
|
};
|
||||||
|
auto collectCopy = [&](Operation &op,
|
||||||
|
const StaticValueKnowledge &knowledge) {
|
||||||
|
if (auto copyOp = dyn_cast<memref::CopyOp>(&op))
|
||||||
|
addCopyOp(copyOp, knowledge);
|
||||||
|
if (auto copyOp = dyn_cast<PimMemCopyDevToHostOp>(&op);
|
||||||
|
copyOp
|
||||||
|
&& isHostBackedPimAddress(copyOp.getDeviceSource(), knowledge)
|
||||||
|
&& isHostBackedPimAddress(copyOp.getHostTarget(), knowledge)
|
||||||
|
&& seenHostToHostCopies.insert(copyOp).second)
|
||||||
|
hostToHostCopies.push_back(copyOp);
|
||||||
|
};
|
||||||
|
|
||||||
moduleOp.walk([&](pim::PimCoreOp coreOp) {
|
moduleOp.walk([&](pim::PimCoreOp coreOp) {
|
||||||
StaticValueKnowledge knowledge = seedCoreKnowledge(coreOp);
|
StaticValueKnowledge knowledge = seedCoreKnowledge(coreOp);
|
||||||
(void) walkPimCoreBlockStructurally(
|
(void) walkPimCoreBlockStructurally(
|
||||||
coreOp.getBody().front(), knowledge, [&](Operation& op, const StaticValueKnowledge& opKnowledge) {
|
coreOp.getBody().front(), knowledge, [&](Operation& op, const StaticValueKnowledge& opKnowledge) {
|
||||||
if (auto copyOp = dyn_cast<memref::CopyOp>(&op))
|
collectCopy(op, opKnowledge);
|
||||||
addCopyOp(copyOp, opKnowledge);
|
|
||||||
return success();
|
return success();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -622,8 +634,7 @@ static LogicalResult normalizePimMemory(ModuleOp moduleOp, func::FuncOp funcOp)
|
|||||||
StaticValueKnowledge knowledge = seedCoreBatchKnowledge(coreBatchOp, lane);
|
StaticValueKnowledge knowledge = seedCoreBatchKnowledge(coreBatchOp, lane);
|
||||||
(void) walkPimCoreBlockStructurally(
|
(void) walkPimCoreBlockStructurally(
|
||||||
coreBatchOp.getBody().front(), knowledge, [&](Operation& op, const StaticValueKnowledge& opKnowledge) {
|
coreBatchOp.getBody().front(), knowledge, [&](Operation& op, const StaticValueKnowledge& opKnowledge) {
|
||||||
if (auto copyOp = dyn_cast<memref::CopyOp>(&op))
|
collectCopy(op, opKnowledge);
|
||||||
addCopyOp(copyOp, opKnowledge);
|
|
||||||
return success();
|
return success();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -631,6 +642,22 @@ static LogicalResult normalizePimMemory(ModuleOp moduleOp, func::FuncOp funcOp)
|
|||||||
|
|
||||||
bool hasFailed = false;
|
bool hasFailed = false;
|
||||||
Value zeroOffset = getOrCreateIndexConstant(rewriter, funcOp, 0);
|
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) {
|
for (const MemRefCopyWorkItem& workItem : copyWorklist) {
|
||||||
memref::CopyOp copyOp = workItem.copyOp;
|
memref::CopyOp copyOp = workItem.copyOp;
|
||||||
rewriter.setInsertionPoint(copyOp);
|
rewriter.setInsertionPoint(copyOp);
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ def PimWaitOp : PimOp<"wait", []> {
|
|||||||
|
|
||||||
let arguments = (ins
|
let arguments = (ins
|
||||||
Index:$eventRegister,
|
Index:$eventRegister,
|
||||||
I32Attr:$waitValue
|
Index:$waitValue
|
||||||
);
|
);
|
||||||
|
|
||||||
let assemblyFormat = [{
|
let assemblyFormat = [{
|
||||||
|
|||||||
+139
-1
@@ -242,11 +242,146 @@ static void appendReceive(BoundaryProgram &boundary,
|
|||||||
target.collection, {slice}, {0, 1}, {target.position}, {lanes}, lanes});
|
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<BoundaryProgram> 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<int64_t, SmallVector<HostTransferRef>> incomingByCore;
|
||||||
|
DenseMap<ExternalTransferFamily *, SmallVector<int64_t>> eventRegisters;
|
||||||
|
DenseMap<ExternalTransferFamily *, SmallVector<int64_t>> waitValues;
|
||||||
|
DenseMap<ExternalTransferFamily *, SmallVector<int64_t>> 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<EmitReceiveAssemblyRun>(&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<size_t> groupSizes(groupCount);
|
||||||
|
for (size_t ordinal = 0; ordinal < incoming.size(); ++ordinal)
|
||||||
|
++groupSizes[ordinal * groupCount / incoming.size()];
|
||||||
|
SmallVector<bool> 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
|
} // namespace
|
||||||
|
|
||||||
FailureOr<DeferredBoundaryPlan> buildDeferredBoundaryPlan(
|
FailureOr<DeferredBoundaryPlan> buildDeferredBoundaryPlan(
|
||||||
DeferredTransferPlan &transfers,
|
DeferredTransferPlan &transfers,
|
||||||
const ScheduledCommunicationPlan &schedule) {
|
const ScheduledCommunicationPlan &schedule,
|
||||||
|
size_t synchronizationRegisterCount) {
|
||||||
DeferredBoundaryPlan result;
|
DeferredBoundaryPlan result;
|
||||||
SmallVector<BoundaryProgram> boundaries;
|
SmallVector<BoundaryProgram> boundaries;
|
||||||
DenseMap<BoundaryKey, unsigned> indices;
|
DenseMap<BoundaryKey, unsigned> indices;
|
||||||
@@ -373,6 +508,9 @@ FailureOr<DeferredBoundaryPlan> buildDeferredBoundaryPlan(
|
|||||||
return std::tie(scheduledOrder[lhs.key.first], lhs.key.second)
|
return std::tie(scheduledOrder[lhs.key.first], lhs.key.second)
|
||||||
< std::tie(scheduledOrder[rhs.key.first], rhs.key.second);
|
< std::tie(scheduledOrder[rhs.key.first], rhs.key.second);
|
||||||
});
|
});
|
||||||
|
if (failed(assignPipelineSynchronization(
|
||||||
|
transfers, boundaries, synchronizationRegisterCount)))
|
||||||
|
return failure();
|
||||||
result.boundaries = std::move(boundaries);
|
result.boundaries = std::move(boundaries);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -53,6 +53,7 @@ struct DeferredBoundaryPlan {
|
|||||||
};
|
};
|
||||||
|
|
||||||
mlir::FailureOr<DeferredBoundaryPlan> buildDeferredBoundaryPlan(DeferredTransferPlan& transfers,
|
mlir::FailureOr<DeferredBoundaryPlan> buildDeferredBoundaryPlan(DeferredTransferPlan& transfers,
|
||||||
const ScheduledCommunicationPlan& schedule);
|
const ScheduledCommunicationPlan& schedule,
|
||||||
|
size_t synchronizationRegisterCount);
|
||||||
|
|
||||||
} // namespace onnx_mlir::spatial
|
} // namespace onnx_mlir::spatial
|
||||||
|
|||||||
+233
-5
@@ -4,6 +4,7 @@
|
|||||||
#include "DeferredBoundaryRealization.hpp"
|
#include "DeferredBoundaryRealization.hpp"
|
||||||
#include "DeferredProjectionAnalysis.hpp"
|
#include "DeferredProjectionAnalysis.hpp"
|
||||||
#include "DeferredResultRealization.hpp"
|
#include "DeferredResultRealization.hpp"
|
||||||
|
#include "DeferredTransferPlanning.hpp"
|
||||||
#include "src/Accelerators/PIM/Common/IR/LoopUtils.hpp"
|
#include "src/Accelerators/PIM/Common/IR/LoopUtils.hpp"
|
||||||
#include "src/Accelerators/PIM/Common/IR/StaticIntGrid.hpp"
|
#include "src/Accelerators/PIM/Common/IR/StaticIntGrid.hpp"
|
||||||
#include "src/Accelerators/PIM/Common/IR/StaticIntSequence.hpp"
|
#include "src/Accelerators/PIM/Common/IR/StaticIntSequence.hpp"
|
||||||
@@ -21,6 +22,8 @@ struct LogicalTransferMetadataView {
|
|||||||
StaticIntSequenceChain targetCores;
|
StaticIntSequenceChain targetCores;
|
||||||
StaticIntSequenceChain hostOffsets;
|
StaticIntSequenceChain hostOffsets;
|
||||||
StaticIntSequenceChain eventRegisters;
|
StaticIntSequenceChain eventRegisters;
|
||||||
|
StaticIntSequenceChain waitValues;
|
||||||
|
StaticIntSequenceChain acknowledgementEventRegisters;
|
||||||
StaticIntSequenceChain targetLanes;
|
StaticIntSequenceChain targetLanes;
|
||||||
StaticIntSequenceChain localOffsets;
|
StaticIntSequenceChain localOffsets;
|
||||||
SmallVector<StaticIntSequenceChain> projectionOffsets;
|
SmallVector<StaticIntSequenceChain> projectionOffsets;
|
||||||
@@ -91,6 +94,9 @@ static void appendMetadata(const ScheduledTransferSlice &slice, LogicalTransferM
|
|||||||
metadata.hostOffsets.append(family.hostOffsets, familyIndex, count);
|
metadata.hostOffsets.append(family.hostOffsets, familyIndex, count);
|
||||||
metadata.eventRegisters.append(
|
metadata.eventRegisters.append(
|
||||||
family.eventRegisters, familyIndex, count);
|
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));
|
metadata.targetLanes.append(StaticIntSequence::affine(targetLane, 1, count));
|
||||||
if (family.requirement->producerLocalOffsets)
|
if (family.requirement->producerLocalOffsets)
|
||||||
@@ -296,13 +302,21 @@ static FailureOr<Value> emitReceiveValue(ArrayRef<ScheduledTransferSlice> slices
|
|||||||
if (failed(grids)) return failure();
|
if (failed(grids)) return failure();
|
||||||
std::optional<StaticIntGrid> hostOffsets;
|
std::optional<StaticIntGrid> hostOffsets;
|
||||||
std::optional<StaticIntGrid> eventRegisters;
|
std::optional<StaticIntGrid> eventRegisters;
|
||||||
|
std::optional<StaticIntGrid> waitValues;
|
||||||
|
std::optional<StaticIntGrid> acknowledgementEventRegisters;
|
||||||
if (slices.front().family->hostRouted) {
|
if (slices.front().family->hostRouted) {
|
||||||
auto offsets = buildGrid(metadata.hostOffsets);
|
auto offsets = buildGrid(metadata.hostOffsets);
|
||||||
auto events = buildGrid(metadata.eventRegisters);
|
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();
|
return failure();
|
||||||
hostOffsets = std::move(*offsets);
|
hostOffsets = std::move(*offsets);
|
||||||
eventRegisters = std::move(*events);
|
eventRegisters = std::move(*events);
|
||||||
|
waitValues = std::move(*waits);
|
||||||
|
acknowledgementEventRegisters = std::move(*acknowledgements);
|
||||||
}
|
}
|
||||||
Value position = lane ? lane : context.constants.getIndex(0);
|
Value position = lane ? lane : context.constants.getIndex(0);
|
||||||
Value row = context.constants.getIndex(0);
|
Value row = context.constants.getIndex(0);
|
||||||
@@ -319,6 +333,10 @@ static FailureOr<Value> emitReceiveValue(ArrayRef<ScheduledTransferSlice> slices
|
|||||||
hostOffsets->emitLookup(
|
hostOffsets->emitLookup(
|
||||||
row, position, anchor, context.constants, context.rewriter, anchor->getLoc()),
|
row, position, anchor, context.constants, context.rewriter, anchor->getLoc()),
|
||||||
eventRegisters->emitLookup(
|
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()));
|
row, position, anchor, context.constants, context.rewriter, anchor->getLoc()));
|
||||||
receive = op;
|
receive = op;
|
||||||
output = op.getOutput();
|
output = op.getOutput();
|
||||||
@@ -387,6 +405,8 @@ static FailureOr<Value> emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V
|
|||||||
std::optional<StaticIntGrid> positions;
|
std::optional<StaticIntGrid> positions;
|
||||||
std::optional<StaticIntGrid> hostOffsets;
|
std::optional<StaticIntGrid> hostOffsets;
|
||||||
std::optional<StaticIntGrid> eventRegisters;
|
std::optional<StaticIntGrid> eventRegisters;
|
||||||
|
std::optional<StaticIntGrid> waitValues;
|
||||||
|
std::optional<StaticIntGrid> acknowledgementEventRegisters;
|
||||||
bool hostRouted = run.slices.front().family->hostRouted;
|
bool hostRouted = run.slices.front().family->hostRouted;
|
||||||
auto metadataByEntry = buildRectangularReceiveMetadata(run, laneCount);
|
auto metadataByEntry = buildRectangularReceiveMetadata(run, laneCount);
|
||||||
if (succeeded(metadataByEntry)) {
|
if (succeeded(metadataByEntry)) {
|
||||||
@@ -402,10 +422,17 @@ static FailureOr<Value> emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V
|
|||||||
&LogicalTransferMetadataView::hostOffsets);
|
&LogicalTransferMetadataView::hostOffsets);
|
||||||
auto events = buildRows(
|
auto events = buildRows(
|
||||||
&LogicalTransferMetadataView::eventRegisters);
|
&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();
|
return failure();
|
||||||
hostOffsets = std::move(*offsets);
|
hostOffsets = std::move(*offsets);
|
||||||
eventRegisters = std::move(*events);
|
eventRegisters = std::move(*events);
|
||||||
|
waitValues = std::move(*waits);
|
||||||
|
acknowledgementEventRegisters = std::move(*acknowledgements);
|
||||||
}
|
}
|
||||||
SmallVector<StaticIntSequence> positionRows;
|
SmallVector<StaticIntSequence> positionRows;
|
||||||
for (unsigned position : run.positions)
|
for (unsigned position : run.positions)
|
||||||
@@ -456,10 +483,17 @@ static FailureOr<Value> emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V
|
|||||||
&LogicalTransferMetadataView::hostOffsets);
|
&LogicalTransferMetadataView::hostOffsets);
|
||||||
auto events = buildGrid(
|
auto events = buildGrid(
|
||||||
&LogicalTransferMetadataView::eventRegisters);
|
&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();
|
return failure();
|
||||||
hostOffsets = std::move(*offsets);
|
hostOffsets = std::move(*offsets);
|
||||||
eventRegisters = std::move(*events);
|
eventRegisters = std::move(*events);
|
||||||
|
waitValues = std::move(*waits);
|
||||||
|
acknowledgementEventRegisters = std::move(*acknowledgements);
|
||||||
}
|
}
|
||||||
SmallVector<StaticIntSequence> positionColumns;
|
SmallVector<StaticIntSequence> positionColumns;
|
||||||
for (const StaticIntSequenceChain &values : positionsByLane)
|
for (const StaticIntSequenceChain &values : positionsByLane)
|
||||||
@@ -491,6 +525,10 @@ static FailureOr<Value> emitReceiveAssembly(const EmitReceiveAssemblyRun &run, V
|
|||||||
hostOffsets->emitLookup(
|
hostOffsets->emitLookup(
|
||||||
entry, runtimeLane, anchor, context.constants, context.rewriter, loc),
|
entry, runtimeLane, anchor, context.constants, context.rewriter, loc),
|
||||||
eventRegisters->emitLookup(
|
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));
|
entry, runtimeLane, anchor, context.constants, context.rewriter, loc));
|
||||||
receive = op;
|
receive = op;
|
||||||
output = op.getOutput();
|
output = op.getOutput();
|
||||||
@@ -1158,9 +1196,199 @@ static LogicalResult emitBoundary(const BoundaryProgram &boundary, ArrayRef<Defe
|
|||||||
return failed(values) ? failure() : replaceResults(exchanges, *values, replacements);
|
return failed(values) ? failure() : replaceResults(exchanges, *values, replacements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned getBarrierRoundCount(size_t coreCount) {
|
||||||
|
unsigned rounds = 0;
|
||||||
|
for (size_t distance = 1; distance < coreCount; distance *= 2)
|
||||||
|
++rounds;
|
||||||
|
return rounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LogicalResult emitCompletionSynchronization(
|
||||||
|
DeferredTransferPlan &transfers, DeferredEmissionContext &context) {
|
||||||
|
if (transfers.synchronizationRegisterCount == 0)
|
||||||
|
return success();
|
||||||
|
size_t acknowledgementRegister =
|
||||||
|
transfers.synchronizationRegisterCount - 1;
|
||||||
|
unsigned barrierRounds = getBarrierRoundCount(
|
||||||
|
transfers.stageZeroCores.size());
|
||||||
|
bool stageZeroNeedsAcknowledgements = llvm::any_of(
|
||||||
|
transfers.stageZeroCores, [&](int64_t core) {
|
||||||
|
return transfers.hostAcknowledgementCounts.contains(core);
|
||||||
|
});
|
||||||
|
size_t firstBarrierRegister = acknowledgementRegister
|
||||||
|
- (stageZeroNeedsAcknowledgements ? 1 : 0);
|
||||||
|
DenseMap<int64_t, unsigned> stageZeroRank;
|
||||||
|
for (auto [rank, core] : llvm::enumerate(transfers.stageZeroCores))
|
||||||
|
stageZeroRank[core] = rank;
|
||||||
|
DenseMap<int64_t, unsigned> 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<SpatScheduledComputeBatch>(scheduled.op))
|
||||||
|
lane = *batch.getLaneArgument();
|
||||||
|
|
||||||
|
SmallVector<int64_t> acknowledgementCounts, releaseRegisters;
|
||||||
|
SmallVector<int64_t> releaseWaitValues, leftTargets, leftRegisters;
|
||||||
|
SmallVector<int64_t> 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<int64_t> 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<int64_t> targets,
|
||||||
|
ArrayRef<int64_t> 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
|
} // namespace
|
||||||
|
|
||||||
LogicalResult realizeDeferredBoundaries(ArrayRef<BoundaryProgram> boundaries, ArrayRef<DeferredResultPlan> results, DeferredEmissionContext &context,
|
LogicalResult realizeDeferredBoundaries(ArrayRef<BoundaryProgram> boundaries, ArrayRef<DeferredResultPlan> results,
|
||||||
|
DeferredTransferPlan &transfers, DeferredEmissionContext &context,
|
||||||
DeferredReplacementMap &replacements) {
|
DeferredReplacementMap &replacements) {
|
||||||
ScheduledInfo *scheduled = nullptr;
|
ScheduledInfo *scheduled = nullptr;
|
||||||
for (const BoundaryProgram &boundary : boundaries) {
|
for (const BoundaryProgram &boundary : boundaries) {
|
||||||
@@ -1171,7 +1399,7 @@ LogicalResult realizeDeferredBoundaries(ArrayRef<BoundaryProgram> boundaries, Ar
|
|||||||
if (failed(emitBoundary(boundary, results, context, replacements)))
|
if (failed(emitBoundary(boundary, results, context, replacements)))
|
||||||
return boundary.key.first->op->emitOpError("phase 2 failed to realize a communication boundary");
|
return boundary.key.first->op->emitOpError("phase 2 failed to realize a communication boundary");
|
||||||
}
|
}
|
||||||
return success();
|
return emitCompletionSynchronization(transfers, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace onnx_mlir::spatial
|
} // namespace onnx_mlir::spatial
|
||||||
|
|||||||
+1
@@ -42,6 +42,7 @@ using DeferredReplacementMap =
|
|||||||
|
|
||||||
mlir::LogicalResult realizeDeferredBoundaries(mlir::ArrayRef<BoundaryProgram> boundaries,
|
mlir::LogicalResult realizeDeferredBoundaries(mlir::ArrayRef<BoundaryProgram> boundaries,
|
||||||
mlir::ArrayRef<DeferredResultPlan> results,
|
mlir::ArrayRef<DeferredResultPlan> results,
|
||||||
|
DeferredTransferPlan& transfers,
|
||||||
DeferredEmissionContext& context,
|
DeferredEmissionContext& context,
|
||||||
DeferredReplacementMap& replacements);
|
DeferredReplacementMap& replacements);
|
||||||
|
|
||||||
|
|||||||
+3
@@ -236,6 +236,9 @@ struct ExternalTransferFamily {
|
|||||||
StaticIntSequence channelIds = StaticIntSequence::uniform(0, 1);
|
StaticIntSequence channelIds = StaticIntSequence::uniform(0, 1);
|
||||||
StaticIntSequence hostOffsets = StaticIntSequence::uniform(0, 1);
|
StaticIntSequence hostOffsets = StaticIntSequence::uniform(0, 1);
|
||||||
StaticIntSequence eventRegisters = 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;
|
bool hostRouted = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -232,7 +232,8 @@ LogicalResult realizeDeferredCommunication(func::FuncOp funcOp,
|
|||||||
auto schedule = scheduleDeferredCommunication(funcOp, *transfers);
|
auto schedule = scheduleDeferredCommunication(funcOp, *transfers);
|
||||||
if (failed(schedule) || failed(verifyPlannedCommunicationDeadlockFree(funcOp, transfers->stepCounts, *schedule)))
|
if (failed(schedule) || failed(verifyPlannedCommunicationDeadlockFree(funcOp, transfers->stepCounts, *schedule)))
|
||||||
return funcOp.emitOpError("phase 2 failed to schedule symbolic communication");
|
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))
|
if (failed(boundaries))
|
||||||
return funcOp.emitOpError("phase 2 failed to build sparse boundary programs");
|
return funcOp.emitOpError("phase 2 failed to build sparse boundary programs");
|
||||||
|
|
||||||
@@ -242,7 +243,9 @@ LogicalResult realizeDeferredCommunication(func::FuncOp funcOp,
|
|||||||
ConstantPool constants(funcOp, rewriter);
|
ConstantPool constants(funcOp, rewriter);
|
||||||
DeferredEmissionContext context(rewriter, constants);
|
DeferredEmissionContext context(rewriter, constants);
|
||||||
DeferredReplacementMap replacements;
|
DeferredReplacementMap replacements;
|
||||||
if (failed(realizeDeferredBoundaries(boundaries->boundaries, boundaries->results, context, replacements)))
|
if (failed(realizeDeferredBoundaries(
|
||||||
|
boundaries->boundaries, boundaries->results, *transfers,
|
||||||
|
context, replacements)))
|
||||||
return failure();
|
return failure();
|
||||||
for (auto [op, replacement] : replacements) {
|
for (auto [op, replacement] : replacements) {
|
||||||
if (op->getResult(0) == replacement)
|
if (op->getResult(0) == replacement)
|
||||||
|
|||||||
+2
-17
@@ -322,8 +322,7 @@ static LogicalResult buildRequirementFamilies(DeferredTransferPlan& plan,
|
|||||||
static LogicalResult buildAvailabilityFamilies(
|
static LogicalResult buildAvailabilityFamilies(
|
||||||
DeferredTransferPlan &plan,
|
DeferredTransferPlan &plan,
|
||||||
DeferredExchangePlan& exchange,
|
DeferredExchangePlan& exchange,
|
||||||
uint64_t& nextChannel,
|
uint64_t& nextChannel) {
|
||||||
DenseMap<int64_t, DenseMap<int64_t, unsigned>>& eventRegistersByTarget) {
|
|
||||||
enum class Availability { Local, Direct, Host };
|
enum class Availability { Local, Direct, Host };
|
||||||
for (RequirementFamily& requirement : exchange.requirements) {
|
for (RequirementFamily& requirement : exchange.requirements) {
|
||||||
for (LaneInterval interval : requirement.targetLanes.intervals()) {
|
for (LaneInterval interval : requirement.targetLanes.intervals()) {
|
||||||
@@ -357,18 +356,6 @@ static LogicalResult buildAvailabilityFamilies(
|
|||||||
family.channelIds = StaticIntSequence::affine(nextChannel, 1, count);
|
family.channelIds = StaticIntSequence::affine(nextChannel, 1, count);
|
||||||
family.hostRouted = runAvailability == Availability::Host;
|
family.hostRouted = runAvailability == Availability::Host;
|
||||||
if (family.hostRouted) {
|
if (family.hostRouted) {
|
||||||
SmallVector<int64_t> 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<ShapedType>(
|
auto fragmentType = dyn_cast<ShapedType>(
|
||||||
requirement.publicationFragmentType);
|
requirement.publicationFragmentType);
|
||||||
auto fragmentBytes = fragmentType
|
auto fragmentBytes = fragmentType
|
||||||
@@ -431,7 +418,6 @@ static LogicalResult buildExchanges(func::FuncOp funcOp, DeferredTransferPlan& p
|
|||||||
funcOp.walk([&](SpatDeferredCommunicationOp op) { deferredOps.push_back(op); });
|
funcOp.walk([&](SpatDeferredCommunicationOp op) { deferredOps.push_back(op); });
|
||||||
GraphBatchPublicationCache publicationCache;
|
GraphBatchPublicationCache publicationCache;
|
||||||
uint64_t nextChannel = 0;
|
uint64_t nextChannel = 0;
|
||||||
DenseMap<int64_t, DenseMap<int64_t, unsigned>> eventRegistersByTarget;
|
|
||||||
for (SpatDeferredCommunicationOp deferred : deferredOps) {
|
for (SpatDeferredCommunicationOp deferred : deferredOps) {
|
||||||
Operation* targetOp = deferred->getParentOfType<SpatScheduledCompute>();
|
Operation* targetOp = deferred->getParentOfType<SpatScheduledCompute>();
|
||||||
if (!targetOp)
|
if (!targetOp)
|
||||||
@@ -451,8 +437,7 @@ static LogicalResult buildExchanges(func::FuncOp funcOp, DeferredTransferPlan& p
|
|||||||
exchange->program = std::move(*program);
|
exchange->program = std::move(*program);
|
||||||
if (failed(buildRequirementFamilies(plan, *exchange, publicationCache)))
|
if (failed(buildRequirementFamilies(plan, *exchange, publicationCache)))
|
||||||
return failure();
|
return failure();
|
||||||
if (failed(buildAvailabilityFamilies(
|
if (failed(buildAvailabilityFamilies(plan, *exchange, nextChannel)))
|
||||||
plan, *exchange, nextChannel, eventRegistersByTarget)))
|
|
||||||
return failure();
|
return failure();
|
||||||
plan.exchanges.push_back(std::move(exchange));
|
plan.exchanges.push_back(std::move(exchange));
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -13,6 +13,10 @@ struct DeferredTransferPlan {
|
|||||||
llvm::DenseMap<int64_t, llvm::SmallVector<ProducedValue*>> producedByGraph;
|
llvm::DenseMap<int64_t, llvm::SmallVector<ProducedValue*>> producedByGraph;
|
||||||
llvm::SmallVector<std::unique_ptr<DeferredExchangePlan>> exchanges;
|
llvm::SmallVector<std::unique_ptr<DeferredExchangePlan>> exchanges;
|
||||||
llvm::SmallVector<unsigned> stepCounts;
|
llvm::SmallVector<unsigned> stepCounts;
|
||||||
|
llvm::DenseMap<int64_t, unsigned> hostAcknowledgementCounts;
|
||||||
|
llvm::SmallVector<int64_t> stageZeroCores;
|
||||||
|
llvm::SmallVector<int64_t> downstreamCores;
|
||||||
|
size_t synchronizationRegisterCount = 0;
|
||||||
size_t pipelineHostBufferBytes = 0;
|
size_t pipelineHostBufferBytes = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ struct ScheduleAndRealizeSpatialPass final
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pipelineStages == 0 || target.processorCount % pipelineStages != 0
|
if (pipelineStages == 0 || target.processorCount % pipelineStages != 0
|
||||||
|
|| (pipelineStages > 1
|
||||||
|
&& target.synchronizationRegisterCount == 0)
|
||||||
|| target.residentWeightCapacity
|
|| target.residentWeightCapacity
|
||||||
> std::numeric_limits<size_t>::max() / pipelineStages) {
|
> std::numeric_limits<size_t>::max() / pipelineStages) {
|
||||||
moduleOp.emitError("ScheduleAndRealizeSpatial requires valid pipeline stages and resource counts");
|
moduleOp.emitError("ScheduleAndRealizeSpatial requires valid pipeline stages and resource counts");
|
||||||
|
|||||||
+1
@@ -23,6 +23,7 @@ struct SchedulingTarget {
|
|||||||
Cost transferWidthBytes = 8;
|
Cost transferWidthBytes = 8;
|
||||||
Cost vectorWidth = 16;
|
Cost vectorWidth = 16;
|
||||||
Cost vectorLatencyCycles = 4;
|
Cost vectorLatencyCycles = 4;
|
||||||
|
size_t synchronizationRegisterCount = 0;
|
||||||
|
|
||||||
Cost matrixRows = 128;
|
Cost matrixRows = 128;
|
||||||
Cost matrixColumns = 128;
|
Cost matrixColumns = 128;
|
||||||
|
|||||||
@@ -592,13 +592,15 @@ def SpatHostStoreSyncOp : SpatOp<"host_store_sync", []> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def SpatHostWaitLoadOp : SpatOp<"host_wait_load", []> {
|
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
|
let arguments = (ins
|
||||||
Index:$sourceCoreId,
|
Index:$sourceCoreId,
|
||||||
Index:$targetCoreId,
|
Index:$targetCoreId,
|
||||||
Index:$hostOffset,
|
Index:$hostOffset,
|
||||||
Index:$eventRegister
|
Index:$eventRegister,
|
||||||
|
Index:$waitValue,
|
||||||
|
Index:$acknowledgementEventRegister
|
||||||
);
|
);
|
||||||
|
|
||||||
let results = (outs
|
let results = (outs
|
||||||
@@ -607,7 +609,34 @@ def SpatHostWaitLoadOp : SpatOp<"host_wait_load", []> {
|
|||||||
|
|
||||||
let assemblyFormat = [{
|
let assemblyFormat = [{
|
||||||
`from` $sourceCoreId `to` $targetCoreId
|
`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
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
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/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.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/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.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/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.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/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.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
|
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.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/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.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/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.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
|
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.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_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,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/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,FAIL,0.081 s,0.19 MiB,0.38 MiB,129,128,0.22 ms,178.45 mW,39393966.72 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.055 s,0.01 MiB,0.00 MiB,5,4,0.01 ms,107.78 mW,671878.96 pJ,-,-,-,-,-,-,-,-,-
|
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.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/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,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/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,FAIL,0.062 s,0.01 MiB,0.02 MiB,17,16,0.01 ms,145.34 mW,1454397.84 pJ,-,-,-,-,-,-,-,-,-
|
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,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_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,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/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,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,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,FAIL,0.101 s,8.04 MiB,12.61 MiB,168,0,2.63 ms,169.52 mW,445489032.00 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,1.124 s,24.14 MiB,61.87 MiB,168,169,38.41 ms,185.26 mW,7116544212.12 pJ,-,-,-,-,-,-,-,-,-
|
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,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_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,FAIL,0.057 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,123.80 mW,889640.16 pJ,-,-,-,-,-,-,-,-,-
|
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.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/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.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_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.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_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,FAIL,0.060 s,0.01 MiB,0.04 MiB,37,36,0.02 ms,172.07 mW,2928344.64 pJ,-,-,-,-,-,-,-,-,-
|
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,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/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.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_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.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_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,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/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,FAIL,0.083 s,0.10 MiB,0.34 MiB,131,128,0.26 ms,170.73 mW,44125916.72 pJ,-,-,-,-,-,-,-,-,-
|
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,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_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.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/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,FAIL,0.063 s,0.01 MiB,0.03 MiB,29,28,0.01 ms,153.67 mW,2221606.72 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.094 s,0.16 MiB,0.67 MiB,168,184,0.56 ms,183.08 mW,103057892.80 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.061 s,0.01 MiB,0.02 MiB,26,25,0.01 ms,166.15 mW,2215009.00 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.059 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,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,FAIL,0.092 s,0.06 MiB,0.35 MiB,168,168,0.34 ms,197.94 mW,66331479.08 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.084 s,0.08 MiB,0.27 MiB,109,108,0.35 ms,170.81 mW,60422605.92 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.071 s,0.03 MiB,0.16 MiB,74,72,0.09 ms,155.74 mW,14244739.28 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.184 s,3.34 MiB,7.89 MiB,168,168,9.35 ms,179.86 mW,1682364509.56 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.098 s,0.34 MiB,1.32 MiB,168,168,1.90 ms,181.91 mW,346476645.64 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.117 s,0.11 MiB,0.44 MiB,168,168,0.42 ms,182.13 mW,75690907.84 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.059 s,0.01 MiB,0.00 MiB,5,4,0.01 ms,110.78 mW,580154.96 pJ,-,-,-,-,-,-,-,-,-
|
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,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_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,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/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,FAIL,0.055 s,0.01 MiB,0.01 MiB,10,9,0.01 ms,123.80 mW,889640.16 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,2.274 s,8.66 MiB,34.24 MiB,168,255,42.70 ms,200.52 mW,8562449708.00 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.478 s,4.82 MiB,19.10 MiB,161,800,8.54 ms,350.86 mW,2994764012.00 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.975 s,12.86 MiB,37.59 MiB,168,488,14.24 ms,301.23 mW,4289558753.00 pJ,-,-,-,-,-,-,-,-,-
|
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,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/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.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/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.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/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.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/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.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/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.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
|
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.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/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.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/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.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/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.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_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.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
|
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,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/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,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/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,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,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,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_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,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_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,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,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,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_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,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/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,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/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,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,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,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/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,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/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,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/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.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,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.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/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,FAIL,0.076 s,0.03 MiB,0.08 MiB,42,40,0.02 ms,151.77 mW,3284393.60 pJ,-,-,-,-,-,-,-,-,-
|
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,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,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,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_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,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,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,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/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,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
|
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.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/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,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/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,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/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,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/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,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
|
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.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/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,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,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.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_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,FAIL,0.061 s,0.00 MiB,0.02 MiB,9,8,0.01 ms,114.39 mW,1009105.92 pJ,-,-,-,-,-,-,-,-,-
|
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,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_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,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/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,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/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,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/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,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/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,FAIL,0.102 s,0.52 MiB,0.78 MiB,168,173,0.38 ms,202.13 mW,77751814.88 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.085 s,0.01 MiB,0.01 MiB,9,8,0.01 ms,118.68 mW,879301.92 pJ,-,-,-,-,-,-,-,-,-
|
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,FAIL,0.483 s,1.02 MiB,43.44 MiB,168,0,8.15 ms,170.00 mW,1385775865.00 pJ,-,-,-,-,-,-,-,-,-
|
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,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,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,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/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.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/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.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/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.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/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.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
|
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.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_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.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_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.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_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.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_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.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_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.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_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.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/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,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_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.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_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.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_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.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_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.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_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.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_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.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_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.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
|
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,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,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,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/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,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/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.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_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.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/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,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/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,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/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,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/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.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/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,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_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,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_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,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_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.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_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,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_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,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_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.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/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,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
|
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.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/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,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_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,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/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.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
|
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.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/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.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/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.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/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.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
|
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,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/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,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_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,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/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,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/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,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/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,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
|
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.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/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,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/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.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
|
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.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/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,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/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.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/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.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/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.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/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.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_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.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/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.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
|
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.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/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.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/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,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/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.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/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.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
|
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.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/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.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/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.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/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.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
|
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,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/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.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/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.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/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.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/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.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/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.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
|
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
|
||||||
|
|||||||
|
Reference in New Issue
Block a user