|
|
|
@ -67,15 +67,17 @@ int ConvolutionDelegateFP16CPUKernel::Init() {
|
|
|
|
|
if (in_tensors_.size() == 3) {
|
|
|
|
|
origin_bias_ = CopyData(in_tensors_.at(kBiasIndex));
|
|
|
|
|
need_free_ = need_free_ | BIAS_NEED_FREE;
|
|
|
|
|
origin_bias_data_type_ = in_tensors_.at(kBiasIndex)->data_type();
|
|
|
|
|
}
|
|
|
|
|
origin_weight_data_type_ = in_tensors_[1]->data_type();
|
|
|
|
|
origin_weight_data_type_ = in_tensors_.at(kWeightIndex)->data_type();
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
origin_weight_ = in_tensors_.at(kWeightIndex)->data_c();
|
|
|
|
|
if (in_tensors_.size() == 3) {
|
|
|
|
|
origin_bias_ = in_tensors_.at(kBiasIndex)->data_c();
|
|
|
|
|
origin_bias_data_type_ = in_tensors_.at(kBiasIndex)->data_type();
|
|
|
|
|
}
|
|
|
|
|
origin_weight_data_type_ = in_tensors_[1]->data_type();
|
|
|
|
|
origin_weight_data_type_ = in_tensors_.at(kWeightIndex)->data_type();
|
|
|
|
|
return ReSize();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -84,8 +86,9 @@ int ConvolutionDelegateFP16CPUKernel::ReSize() {
|
|
|
|
|
SetInputOutputShapeInfo(reinterpret_cast<ConvParameter *>(op_parameter_), in_tensors_.front(), out_tensors_.front(),
|
|
|
|
|
context_);
|
|
|
|
|
if (fp16_conv_kernel_ == nullptr) {
|
|
|
|
|
fp16_conv_kernel_ = CpuConvFp16KernelSelect(in_tensors_, out_tensors_, op_parameter_, context_, primitive_,
|
|
|
|
|
origin_weight_, origin_bias_, origin_weight_data_type_);
|
|
|
|
|
fp16_conv_kernel_ =
|
|
|
|
|
CpuConvFp16KernelSelect(in_tensors_, out_tensors_, op_parameter_, context_, primitive_, origin_weight_,
|
|
|
|
|
origin_bias_, origin_weight_data_type_, origin_bias_data_type_);
|
|
|
|
|
if (fp16_conv_kernel_ == nullptr) {
|
|
|
|
|
MS_LOG(ERROR) << "Selecting execute kernel failed for conv_kernel, got a nullptr.";
|
|
|
|
|
return RET_ERROR;
|
|
|
|
@ -109,7 +112,8 @@ ConvParameter *CreateNewConvParameterFp16(ConvParameter *parameter) {
|
|
|
|
|
kernel::LiteKernel *CpuConvFp16KernelSelect(const std::vector<lite::Tensor *> &inputs,
|
|
|
|
|
const std::vector<lite::Tensor *> &outputs, OpParameter *op_parameter,
|
|
|
|
|
const lite::InnerContext *ctx, const mindspore::lite::PrimitiveC *primitive,
|
|
|
|
|
void *origin_weight, void *origin_bias, TypeId origin_weight_data_type) {
|
|
|
|
|
void *origin_weight, void *origin_bias, TypeId origin_weight_data_type,
|
|
|
|
|
TypeId origin_bias_data_type) {
|
|
|
|
|
auto conv_param = reinterpret_cast<ConvParameter *>(op_parameter);
|
|
|
|
|
bool use_winograd = false;
|
|
|
|
|
int out_unit;
|
|
|
|
@ -117,13 +121,15 @@ kernel::LiteKernel *CpuConvFp16KernelSelect(const std::vector<lite::Tensor *> &i
|
|
|
|
|
kernel::LiteKernel *kernel = nullptr;
|
|
|
|
|
if (conv_param->kernel_h_ == 1 && conv_param->kernel_w_ == 1) {
|
|
|
|
|
kernel = new (std::nothrow)
|
|
|
|
|
kernel::Convolution1x1FP16CPUKernel(op_parameter, inputs, outputs, ctx, primitive, origin_weight, origin_bias);
|
|
|
|
|
kernel::Convolution1x1FP16CPUKernel(op_parameter, inputs, outputs, ctx, primitive, origin_weight, origin_bias,
|
|
|
|
|
origin_weight_data_type, origin_bias_data_type);
|
|
|
|
|
} else if (use_winograd) {
|
|
|
|
|
kernel = new (std::nothrow) kernel::ConvolutionWinogradFP16CPUKernel(op_parameter, inputs, outputs, ctx, primitive,
|
|
|
|
|
out_unit, origin_weight, origin_bias);
|
|
|
|
|
kernel = new (std::nothrow) kernel::ConvolutionWinogradFP16CPUKernel(
|
|
|
|
|
op_parameter, inputs, outputs, ctx, primitive, out_unit, origin_weight, origin_bias, origin_bias_data_type);
|
|
|
|
|
} else {
|
|
|
|
|
kernel = new (std::nothrow) kernel::ConvolutionFP16CPUKernel(op_parameter, inputs, outputs, ctx, primitive,
|
|
|
|
|
origin_weight, origin_bias, origin_weight_data_type);
|
|
|
|
|
kernel =
|
|
|
|
|
new (std::nothrow) kernel::ConvolutionFP16CPUKernel(op_parameter, inputs, outputs, ctx, primitive, origin_weight,
|
|
|
|
|
origin_bias, origin_weight_data_type, origin_bias_data_type);
|
|
|
|
|
}
|
|
|
|
|
// Once kernel is selected, init func will invoke InitWeightAndBias
|
|
|
|
|
auto ret = kernel->Init();
|
|
|
|
|