109 lines
3.7 KiB
C++
109 lines
3.7 KiB
C++
//
|
|
// BinaryAddToEltwise.cpp
|
|
// MNNConverter
|
|
//
|
|
// Created by MNN on 2020/08/02.
|
|
// Copyright © 2018, Alibaba Group Holding Limited
|
|
//
|
|
|
|
#include "../TemplateMerge.hpp"
|
|
#include "MNN/expr/MathOp.hpp"
|
|
#include "MNN/expr/NeuralNetWorkOp.hpp"
|
|
#include "MNN_generated.h"
|
|
|
|
namespace MNN {
|
|
namespace Express {
|
|
|
|
static auto gRegister = []() {
|
|
auto match = [](EXPRP expr) {
|
|
if (nullptr == expr->get()) {
|
|
return false;
|
|
}
|
|
if (expr->get()->type() != OpType_BinaryOp) {
|
|
return false;
|
|
}
|
|
auto binaryOp = expr->get();
|
|
auto binaryParams = binaryOp->main_as_BinaryOp();
|
|
if (binaryParams->opType() != BinaryOpOperation_ADD) {
|
|
return false;
|
|
}
|
|
|
|
auto leftConvertVar = expr->inputs()[0];
|
|
auto leftConvertExpr = leftConvertVar->expr().first;
|
|
if (leftConvertExpr->get() == nullptr) {
|
|
return false;
|
|
}
|
|
if (leftConvertExpr->get()->type() != OpType_ConvertTensor) {
|
|
return false;
|
|
}
|
|
|
|
auto leftMoreConvertExpr = leftConvertExpr->inputs()[0]->expr().first;
|
|
while (!leftMoreConvertExpr->get() && leftMoreConvertExpr->get()->type() == OpType_ConvertTensor) {
|
|
leftConvertExpr = leftMoreConvertExpr;
|
|
leftMoreConvertExpr = leftConvertExpr->inputs()[0]->expr().first;
|
|
}
|
|
|
|
auto leftInt8ToFloatVar = leftConvertExpr->inputs()[0];
|
|
auto leftInt8ToFloatExpr = leftInt8ToFloatVar->expr().first;
|
|
if (leftInt8ToFloatExpr->get() == nullptr) {
|
|
return false;
|
|
}
|
|
if (leftInt8ToFloatExpr->get()->type() != OpType_Int8ToFloat) {
|
|
return false;
|
|
}
|
|
|
|
auto rightConvertVar = expr->inputs()[1];
|
|
auto rightConvertExpr = rightConvertVar->expr().first;
|
|
if (rightConvertExpr->get() == nullptr) {
|
|
return false;
|
|
}
|
|
if (rightConvertExpr->get()->type() != OpType_ConvertTensor) {
|
|
return false;
|
|
}
|
|
|
|
auto rightMoreConvertExpr = rightConvertExpr->inputs()[0]->expr().first;
|
|
while (!rightMoreConvertExpr->get() && rightMoreConvertExpr->get()->type() == OpType_ConvertTensor) {
|
|
rightConvertExpr = rightMoreConvertExpr;
|
|
rightMoreConvertExpr = rightConvertExpr->inputs()[0]->expr().first;
|
|
}
|
|
|
|
auto rightInt8ToFloatVar = rightConvertExpr->inputs()[0];
|
|
auto rightInt8ToFloatExpr = rightInt8ToFloatVar->expr().first;
|
|
if (rightInt8ToFloatExpr->get() == nullptr) {
|
|
return false;
|
|
}
|
|
if (rightInt8ToFloatExpr->get()->type() != OpType_Int8ToFloat) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
auto transform = [](EXPRP expr) {
|
|
auto leftConvertVar = expr->inputs()[0];
|
|
auto leftConvertExpr = leftConvertVar->expr().first;
|
|
auto leftConvertOp = leftConvertExpr->get();
|
|
|
|
auto leftInt8ToFloatVar = leftConvertExpr->inputs()[0];
|
|
auto leftInt8ToFloatExpr = leftConvertVar->expr().first;
|
|
|
|
auto rightConvertVar = expr->inputs()[1];
|
|
auto rightConvertExpr = rightConvertVar->expr().first;
|
|
auto rightConvertOp = rightConvertExpr->get();
|
|
|
|
auto rightInt8ToFloatVar = rightConvertExpr->inputs()[0];
|
|
auto rightInt8ToFloatExpr = rightConvertVar->expr().first;
|
|
|
|
auto eltwiseSum = _Sum(leftInt8ToFloatVar, rightInt8ToFloatVar, {});
|
|
eltwiseSum->setName(expr->name());
|
|
|
|
Expr::replace(expr, eltwiseSum->expr().first);
|
|
return true;
|
|
};
|
|
|
|
TemplateMerge::getInstance("Merge").insertTemplate("BinaryAddToEltwise", match, transform, PASS_PRIORITY_MIDDLE);
|
|
return true;
|
|
}();
|
|
};
|
|
} // namespace MNN
|