This commit is contained in:
@@ -26,68 +26,6 @@ namespace spatial {
|
||||
|
||||
namespace {
|
||||
|
||||
inline LogicalResult mvmOpVerifySize2(SpatMVMOp* emitter,
|
||||
ArrayRef<int64_t>& matrixShape,
|
||||
ArrayRef<int64_t>& vectorShape,
|
||||
ArrayRef<int64_t>& outputShape) {
|
||||
if (matrixShape.size() != 2 || vectorShape.size() != 2 || outputShape.size() != 2)
|
||||
return emitter->emitError("matrix, vector and output must have rank 2");
|
||||
|
||||
int64_t N = matrixShape[0];
|
||||
int64_t M = matrixShape[1];
|
||||
if (N <= 0 || M <= 0)
|
||||
return emitter->emitError("matrix shape must be (N, M) with N > 0 and M > 0");
|
||||
|
||||
int64_t vectorM = vectorShape[0];
|
||||
int64_t vector1 = vectorShape[1];
|
||||
if (vectorM != M || vector1 != 1)
|
||||
return emitter->emitError("vector shape must be (M, 1)");
|
||||
|
||||
int64_t outputN = outputShape[0];
|
||||
int64_t output1 = outputShape[1];
|
||||
if (outputN != N || output1 != 1)
|
||||
return emitter->emitError("output shape must be (N, 1)");
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
inline LogicalResult mvmOpVerifySize4(SpatMVMOp* emitter,
|
||||
ArrayRef<int64_t>& matrixShape,
|
||||
ArrayRef<int64_t>& vectorShape,
|
||||
ArrayRef<int64_t>& outputShape) {
|
||||
if (matrixShape.size() != 4 || vectorShape.size() != 4 || outputShape.size() != 4)
|
||||
return emitter->emitError("matrix, vector and output must have rank 4");
|
||||
|
||||
int64_t N = matrixShape[0];
|
||||
int64_t M = matrixShape[1];
|
||||
int64_t matrix1First = matrixShape[2];
|
||||
int64_t matrix1Second = matrixShape[3];
|
||||
if (N <= 0 || M <= 0 || matrix1First != 1 || matrix1Second != 1)
|
||||
return emitter->emitError("matrix shape must be (N, M, 1, 1) with N > 0 and M > 0");
|
||||
|
||||
int64_t vector1First = vectorShape[0];
|
||||
int64_t vectorM = vectorShape[1];
|
||||
int64_t vector1Second = vectorShape[2];
|
||||
int64_t vector1Third = vectorShape[3];
|
||||
if (vector1First != 1 || vectorM != M || vector1Second != 1 || vector1Third != 1) {
|
||||
if (vector1First == 1 && vector1Second == 1 && vector1Third == 1 && ignoreConcatError == true) {
|
||||
// This is ok, it was caused by the simplification of the concat error.
|
||||
}
|
||||
else {
|
||||
return emitter->emitError("vector shape must be (1, M, 1, 1)");
|
||||
}
|
||||
}
|
||||
|
||||
int64_t output1First = outputShape[0];
|
||||
int64_t outputN = outputShape[1];
|
||||
int64_t output1Second = outputShape[2];
|
||||
int64_t output1Third = outputShape[3];
|
||||
if (output1First != 1 || outputN != N || output1Second != 1 || output1Third != 1)
|
||||
return emitter->emitError("output shape must be (1, N, 1, 1)");
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
static FailureOr<ArrayRef<int64_t>> getWeightShapeForWeightedOp(Value weight) {
|
||||
auto shapedType = dyn_cast<ShapedType>(weight.getType());
|
||||
if (!shapedType)
|
||||
@@ -287,21 +225,6 @@ static LogicalResult verifyBatchBody(SpatComputeBatch batchOp, Block& block) {
|
||||
|
||||
} // namespace
|
||||
|
||||
LogicalResult SpatMVMOp::verify() {
|
||||
auto matrixShapeOpt = getWeightShapeForWeightedOp(getWeight());
|
||||
if (failed(matrixShapeOpt))
|
||||
return emitError("weight must be a shaped value");
|
||||
auto matrixShape = *matrixShapeOpt;
|
||||
auto vectorShape = getInput().getType().getShape();
|
||||
auto outputShape = getOutput().getType().getShape();
|
||||
|
||||
if (matrixShape.size() == 2)
|
||||
return mvmOpVerifySize2(this, matrixShape, vectorShape, outputShape);
|
||||
if (matrixShape.size() == 4)
|
||||
return mvmOpVerifySize4(this, matrixShape, vectorShape, outputShape);
|
||||
return emitError("matrix rank must be 2 or 4");
|
||||
}
|
||||
|
||||
LogicalResult SpatVMMOp::verify() {
|
||||
auto matrixShapeOpt = getWeightShapeForWeightedOp(getWeight());
|
||||
if (failed(matrixShapeOpt))
|
||||
|
||||
Reference in New Issue
Block a user