|
|
|
@@ -18,6 +18,7 @@ |
|
|
|
#include "src/runtime/kernel/opencl/utils.h" |
|
|
|
#include "include/errorcode.h" |
|
|
|
#include "nnacl/fp32/activation_fp32.h" |
|
|
|
#include "nnacl/scale.h" |
|
|
|
|
|
|
|
using mindspore::lite::RET_ERROR; |
|
|
|
using mindspore::lite::RET_OK; |
|
|
|
@@ -60,12 +61,18 @@ std::pair<bool, FusionEltwiseParameter *> CheckSupportOrCreateParam( |
|
|
|
param = reinterpret_cast<FusionEltwiseParameter *>(eltwise->GetParameter()); |
|
|
|
eltwise->ClearParameter(); |
|
|
|
} |
|
|
|
} else if (IsArithmetic(node_type)) { |
|
|
|
auto act_type = |
|
|
|
static_cast<ActivationType>(reinterpret_cast<ArithmeticParameter *>(op_parameter)->activation_type_); |
|
|
|
} else if (IsArithmetic(node_type) || node_type == schema::PrimitiveType_Scale) { |
|
|
|
auto *arith_param = reinterpret_cast<ArithmeticParameter *>(op_parameter); |
|
|
|
auto *scale_param = reinterpret_cast<ScaleParameter *>(op_parameter); |
|
|
|
auto act_type = static_cast<ActivationType>( |
|
|
|
node_type == schema::PrimitiveType_Scale ? scale_param->activation_type_ : arith_param->activation_type_); |
|
|
|
EltwiseOperator act_operator = Activation2Operator(act_type); |
|
|
|
support = |
|
|
|
node->in_tensors().size() == 2 && SupportedOperators.count(operator_) && SupportedOperators.count(act_operator); |
|
|
|
support = SupportedOperators.count(operator_) && SupportedOperators.count(act_operator); |
|
|
|
if (node_type == schema::PrimitiveType_Scale) { |
|
|
|
support = support && node->in_tensors().size() == 3 && scale_param->axis_ == -1; |
|
|
|
} else { |
|
|
|
support = support && (node->in_tensors().size() == 2); |
|
|
|
} |
|
|
|
if (create_param) { |
|
|
|
param = new (std::nothrow) FusionEltwiseParameter(operator_, node->name(), node->in_tensors(), replace_map); |
|
|
|
MS_ASSERT(param); |
|
|
|
@@ -83,12 +90,6 @@ std::pair<bool, FusionEltwiseParameter *> CheckSupportOrCreateParam( |
|
|
|
param = new (std::nothrow) FusionEltwiseParameter(operator_, node->name(), node->in_tensors(), replace_map); |
|
|
|
MS_ASSERT(param); |
|
|
|
} |
|
|
|
} else if (node_type == schema::PrimitiveType_Scale) { |
|
|
|
support = node->in_tensors().size() == 3 && SupportedOperators.count(operator_); |
|
|
|
if (create_param) { |
|
|
|
param = new (std::nothrow) FusionEltwiseParameter(operator_, node->name(), node->in_tensors(), replace_map); |
|
|
|
MS_ASSERT(param); |
|
|
|
} |
|
|
|
} else if (node_type == schema::PrimitiveType_Activation) { |
|
|
|
auto act_type = static_cast<ActivationType>(reinterpret_cast<ActivationParameter *>(op_parameter)->type_); |
|
|
|
EltwiseOperator act_operator = Activation2Operator(act_type); |
|
|
|
@@ -141,15 +142,11 @@ bool IsEltwiseAndOperatorSupported(LiteKernel *node) { |
|
|
|
} |
|
|
|
|
|
|
|
int FusionEltwiseOpenCLKernel::Prepare() { |
|
|
|
static std::set<std::string> code_map; |
|
|
|
std::string source = Codegen(); |
|
|
|
code_map.insert(source); |
|
|
|
|
|
|
|
std::string program_name = "FusionEltwise" + std::to_string(code_map.size()); |
|
|
|
std::string program_name = "FusionEltwise\n" + source; |
|
|
|
std::string kernel_name = "FusionEltwise"; |
|
|
|
ocl_runtime_->LoadSource(program_name, source); |
|
|
|
ocl_runtime_->BuildKernel(kernel_, program_name, kernel_name); |
|
|
|
|
|
|
|
InitWeights(); |
|
|
|
SetGlobalLocal(); |
|
|
|
SetConstArgs(); |
|
|
|
@@ -390,20 +387,22 @@ std::string FusionEltwiseOpenCLKernel::CodegenCore(FusionEltwiseParameter *param |
|
|
|
|
|
|
|
std::string FusionEltwiseOpenCLKernel::GetFormatVarName(std::string name) { |
|
|
|
if (var_names_.count(name)) { |
|
|
|
return name; |
|
|
|
} |
|
|
|
if (name.empty()) { |
|
|
|
name = "_var_" + std::to_string(var_names_.size()); |
|
|
|
return simplify_var_name_ ? var_names_[name] : name; |
|
|
|
} else { |
|
|
|
char c = name.front(); |
|
|
|
if (c != '_' && !std::isalpha(c)) { |
|
|
|
name = '_' + name; |
|
|
|
if (name.empty()) { |
|
|
|
name = "_var_" + std::to_string(var_names_.size()); |
|
|
|
} else { |
|
|
|
char c = name.front(); |
|
|
|
if (c != '_' && !std::isalpha(c)) { |
|
|
|
name = '_' + name; |
|
|
|
} |
|
|
|
std::replace_if( |
|
|
|
name.begin(), name.end(), [](char c) { return !std::isalnum(c); }, '_'); |
|
|
|
} |
|
|
|
std::replace_if( |
|
|
|
name.begin(), name.end(), [](char c) { return !std::isalnum(c); }, '_'); |
|
|
|
auto new_name = "tmp" + std::to_string(var_names_.size()); |
|
|
|
var_names_.emplace(name, new_name); |
|
|
|
return simplify_var_name_ ? new_name : name; |
|
|
|
} |
|
|
|
var_names_.insert(name); |
|
|
|
return name; |
|
|
|
} |
|
|
|
|
|
|
|
int FusionEltwiseOpenCLKernel::GetTensorIdx(lite::Tensor *in_tensor) { |
|
|
|
|