| @@ -219,7 +219,6 @@ std::vector<mindspore::tensor::MSTensor *> LiteSession::GetInputs() const { | |||||
| int LiteSession::RunGraph(const session::KernelCallBack &before, const session::KernelCallBack &after) { | int LiteSession::RunGraph(const session::KernelCallBack &before, const session::KernelCallBack &after) { | ||||
| MS_EXCEPTION_IF_NULL(this->context_); | MS_EXCEPTION_IF_NULL(this->context_); | ||||
| SetMaxWokerNum(context_->thread_num_); | SetMaxWokerNum(context_->thread_num_); | ||||
| context_->running_ = true; | |||||
| if (before == nullptr && after == nullptr) { | if (before == nullptr && after == nullptr) { | ||||
| return executor->Run(this->inputs_, this->outputs_, this->kernels_, this->context_->allocator.get()); | return executor->Run(this->inputs_, this->outputs_, this->kernels_, this->context_->allocator.get()); | ||||
| } else { | } else { | ||||
| @@ -333,19 +332,21 @@ int LiteSession::ResizeInputs(const std::vector<mindspore::tensor::MSTensor *> & | |||||
| } | } | ||||
| int LiteSession::Resize(const std::vector<mindspore::tensor::MSTensor *> &inputs) { | int LiteSession::Resize(const std::vector<mindspore::tensor::MSTensor *> &inputs) { | ||||
| inputs_old_.clear(); | |||||
| inputs_old_ = inputs_; | |||||
| std::vector<tensor::Tensor *> inputs_old(inputs_); | |||||
| auto ret = ResizeInputs(inputs); | auto ret = ResizeInputs(inputs); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| inputs_ = inputs_old_; | |||||
| inputs_ = inputs_old; | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| Scheduler scheduler(context_); | Scheduler scheduler(context_); | ||||
| ret = scheduler.ReSizeKernels(kernels_); | ret = scheduler.ReSizeKernels(kernels_); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| inputs_ = inputs_old_; | |||||
| scheduler.ReSizeKernels(kernels_); | |||||
| inputs_ = inputs_old; | |||||
| auto resize_ret = scheduler.ReSizeKernels(kernels_); | |||||
| if (resize_ret != RET_OK) { | |||||
| MS_LOG(ERROR) << "restore kernel size fail!ret: " << resize_ret; | |||||
| } | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| return RET_OK; | return RET_OK; | ||||
| @@ -79,7 +79,6 @@ class LiteSession : public session::LiteSession { | |||||
| std::vector<tensor::Tensor *> tensors_; | std::vector<tensor::Tensor *> tensors_; | ||||
| // graph input tensors | // graph input tensors | ||||
| std::vector<tensor::Tensor *> inputs_; | std::vector<tensor::Tensor *> inputs_; | ||||
| std::vector<tensor::Tensor *> inputs_old_; | |||||
| // graph output tensors | // graph output tensors | ||||
| std::vector<tensor::Tensor *> outputs_; | std::vector<tensor::Tensor *> outputs_; | ||||
| // graph input MSTensors | // graph input MSTensors | ||||
| @@ -98,14 +98,14 @@ int ReduceBaseCPUKernel::Init() { | |||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| ret = CheckParameters(); | |||||
| if (ret != RET_OK) { | |||||
| return ret; | |||||
| } | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| int ReduceBaseCPUKernel::ReSize() { | |||||
| return CheckParameters(); | |||||
| } | |||||
| kernel::LiteKernel *CpuReduceFp32KernelCreator(const std::vector<lite::tensor::Tensor *> &inputs, | kernel::LiteKernel *CpuReduceFp32KernelCreator(const std::vector<lite::tensor::Tensor *> &inputs, | ||||
| const std::vector<lite::tensor::Tensor *> &outputs, | const std::vector<lite::tensor::Tensor *> &outputs, | ||||
| OpParameter *opParameter, const lite::Context *ctx, | OpParameter *opParameter, const lite::Context *ctx, | ||||
| @@ -32,7 +32,7 @@ class ReduceBaseCPUKernel : public LiteKernel { | |||||
| virtual ~ReduceBaseCPUKernel() = default; | virtual ~ReduceBaseCPUKernel() = default; | ||||
| int Init() override; | int Init() override; | ||||
| int ReSize() override { return 0; }; | |||||
| int ReSize() override; | |||||
| private: | private: | ||||
| int CheckInputsOutputs(); | int CheckInputsOutputs(); | ||||
| @@ -59,7 +59,11 @@ int ReduceFp16CPUKernel::Init() { | |||||
| int ReduceFp16CPUKernel::ReSize() { | int ReduceFp16CPUKernel::ReSize() { | ||||
| FreeTmpBuffer(); | FreeTmpBuffer(); | ||||
| auto ret = MallocTmpBuffer(); | |||||
| auto ret = ReduceBaseCPUKernel::ReSize(); | |||||
| if (ret != RET_OK) { | |||||
| return ret; | |||||
| } | |||||
| ret = MallocTmpBuffer(); | |||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| FreeTmpBuffer(); | FreeTmpBuffer(); | ||||
| return ret; | return ret; | ||||
| @@ -60,11 +60,21 @@ int BatchnormCPUKernel::InitConstTensor() { | |||||
| } | } | ||||
| int BatchnormCPUKernel::Init() { | int BatchnormCPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| return ReSize(); | |||||
| } | |||||
| int BatchnormCPUKernel::ReSize() { | |||||
| if (mean_addr_ != nullptr) { | |||||
| free(mean_addr_); | |||||
| mean_addr_ = nullptr; | |||||
| } | |||||
| if (var_addr_ != nullptr) { | |||||
| free(var_addr_); | |||||
| var_addr_ = nullptr; | |||||
| } | |||||
| auto input_shapes = in_tensors_[0]->shape(); | auto input_shapes = in_tensors_[0]->shape(); | ||||
| auto n_dim = input_shapes.size(); | auto n_dim = input_shapes.size(); | ||||
| batchnorm_param_->channel_ = input_shapes[n_dim - 1]; | batchnorm_param_->channel_ = input_shapes[n_dim - 1]; | ||||
| @@ -83,15 +93,6 @@ int BatchnormCPUKernel::Init() { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| int BatchnormCPUKernel::ReSize() { | |||||
| auto input_shapes = in_tensors_[0]->shape(); | |||||
| batchnorm_param_->unit_ = 1; | |||||
| for (int i = 0; i < input_shapes.size() - 1; i++) { | |||||
| batchnorm_param_->unit_ *= input_shapes[i]; | |||||
| } | |||||
| return RET_OK; | |||||
| } | |||||
| int BatchnormCPUKernel::DoExecute(int task_id) { | int BatchnormCPUKernel::DoExecute(int task_id) { | ||||
| BatchNorm(out_addr_, in_addr_, mean_addr_, var_addr_, task_id, batchnorm_param_); | BatchNorm(out_addr_, in_addr_, mean_addr_, var_addr_, task_id, batchnorm_param_); | ||||
| return RET_OK; | return RET_OK; | ||||
| @@ -16,7 +16,6 @@ | |||||
| #include "src/runtime/kernel/arm/fp32/fullconnection.h" | #include "src/runtime/kernel/arm/fp32/fullconnection.h" | ||||
| #include "src/runtime/runtime_api.h" | #include "src/runtime/runtime_api.h" | ||||
| using mindspore::lite::RET_ERROR; | using mindspore::lite::RET_ERROR; | ||||
| using mindspore::lite::RET_MEMORY_FAILED; | using mindspore::lite::RET_MEMORY_FAILED; | ||||
| using mindspore::lite::RET_OK; | using mindspore::lite::RET_OK; | ||||
| @@ -48,15 +47,6 @@ void FullconnectionCPUKernel::FreeBuf() { | |||||
| int FullconnectionCPUKernel::ReSize() { | int FullconnectionCPUKernel::ReSize() { | ||||
| FreeBuf(); | FreeBuf(); | ||||
| Init(); | |||||
| return RET_OK; | |||||
| } | |||||
| int FullconnectionCPUKernel::Init() { | |||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| return RET_OK; | |||||
| } | |||||
| fc_param_->row_ = (in_tensors_[0]->shape())[0]; | fc_param_->row_ = (in_tensors_[0]->shape())[0]; | ||||
| fc_param_->col_ = (in_tensors_[1]->shape())[0]; | fc_param_->col_ = (in_tensors_[1]->shape())[0]; | ||||
| fc_param_->deep_ = (in_tensors_[1]->shape())[1]; | fc_param_->deep_ = (in_tensors_[1]->shape())[1]; | ||||
| @@ -81,12 +71,14 @@ int FullconnectionCPUKernel::Init() { | |||||
| b_r8_ptr_ = reinterpret_cast<float *>(malloc(fc_param_->col_8_ * fc_param_->deep_ * sizeof(float))); | b_r8_ptr_ = reinterpret_cast<float *>(malloc(fc_param_->col_8_ * fc_param_->deep_ * sizeof(float))); | ||||
| if (b_r8_ptr_ == nullptr) { | if (b_r8_ptr_ == nullptr) { | ||||
| FreeBuf(); | |||||
| return RET_MEMORY_FAILED; | return RET_MEMORY_FAILED; | ||||
| } | } | ||||
| memset(b_r8_ptr_, 0, fc_param_->col_8_ * fc_param_->deep_ * sizeof(float)); | memset(b_r8_ptr_, 0, fc_param_->col_8_ * fc_param_->deep_ * sizeof(float)); | ||||
| c_r8x8_ptr_ = reinterpret_cast<float *>(malloc(fc_param_->row_8_ * fc_param_->col_8_ * sizeof(float))); | c_r8x8_ptr_ = reinterpret_cast<float *>(malloc(fc_param_->row_8_ * fc_param_->col_8_ * sizeof(float))); | ||||
| if (c_r8x8_ptr_ == nullptr) { | if (c_r8x8_ptr_ == nullptr) { | ||||
| FreeBuf(); | |||||
| return RET_MEMORY_FAILED; | return RET_MEMORY_FAILED; | ||||
| } | } | ||||
| memset(c_r8x8_ptr_, 0, fc_param_->row_8_ * fc_param_->col_8_ * sizeof(float)); | memset(c_r8x8_ptr_, 0, fc_param_->row_8_ * fc_param_->col_8_ * sizeof(float)); | ||||
| @@ -98,6 +90,13 @@ int FullconnectionCPUKernel::Init() { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| int FullconnectionCPUKernel::Init() { | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | |||||
| } | |||||
| return ReSize(); | |||||
| } | |||||
| void FullconnectionCPUKernel::InitMatrixA(float *src_ptr, float *dst_ptr) { | void FullconnectionCPUKernel::InitMatrixA(float *src_ptr, float *dst_ptr) { | ||||
| if (fc_param_->a_const_ == true) { | if (fc_param_->a_const_ == true) { | ||||
| return; | return; | ||||
| @@ -47,10 +47,10 @@ class FullconnectionCPUKernel : public FullconnectionBaseCPUKernel { | |||||
| void InitMatrixB(float *src_ptr, float *dst_ptr); | void InitMatrixB(float *src_ptr, float *dst_ptr); | ||||
| private: | private: | ||||
| float *a_c8_ptr_; | |||||
| float *b_r8_ptr_; | |||||
| float *c_r8x8_ptr_; | |||||
| float *bias_ptr_; | |||||
| float *a_c8_ptr_ = nullptr; | |||||
| float *b_r8_ptr_ = nullptr; | |||||
| float *c_r8x8_ptr_ = nullptr; | |||||
| float *bias_ptr_ = nullptr; | |||||
| }; | }; | ||||
| } // namespace mindspore::kernel | } // namespace mindspore::kernel | ||||
| #endif // MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_FP32_FULLCONNECTION_H_ | #endif // MINDSPORE_LITE_SRC_RUNTIME_KERNEL_ARM_FP32_FULLCONNECTION_H_ | ||||
| @@ -29,7 +29,9 @@ using mindspore::lite::RET_OK; | |||||
| using mindspore::schema::PrimitiveType_FusedBatchNorm; | using mindspore::schema::PrimitiveType_FusedBatchNorm; | ||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| FusedBatchnormCPUKernel::~FusedBatchnormCPUKernel() { | |||||
| FusedBatchnormCPUKernel::~FusedBatchnormCPUKernel() { FreeTmpBuffer(); } | |||||
| void FusedBatchnormCPUKernel::FreeTmpBuffer() { | |||||
| if (scale_addr_ != nullptr) { | if (scale_addr_ != nullptr) { | ||||
| free(scale_addr_); | free(scale_addr_); | ||||
| scale_addr_ = nullptr; | scale_addr_ = nullptr; | ||||
| @@ -84,10 +86,14 @@ int FusedBatchnormCPUKernel::InitConstTensor() { | |||||
| } | } | ||||
| int FusedBatchnormCPUKernel::Init() { | int FusedBatchnormCPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| return ReSize(); | |||||
| } | |||||
| int FusedBatchnormCPUKernel::ReSize() { | |||||
| FreeTmpBuffer(); | |||||
| auto input_shapes = in_tensors_[0]->shape(); | auto input_shapes = in_tensors_[0]->shape(); | ||||
| auto n_dim = input_shapes.size(); | auto n_dim = input_shapes.size(); | ||||
| batchnorm_param_->channel_ = input_shapes[n_dim - 1]; | batchnorm_param_->channel_ = input_shapes[n_dim - 1]; | ||||
| @@ -106,15 +112,6 @@ int FusedBatchnormCPUKernel::Init() { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| int FusedBatchnormCPUKernel::ReSize() { | |||||
| auto input_shapes = in_tensors_[0]->shape(); | |||||
| batchnorm_param_->unit_ = 1; | |||||
| for (int i = 0; i < input_shapes.size() - 1; i++) { | |||||
| batchnorm_param_->unit_ *= input_shapes[i]; | |||||
| } | |||||
| return RET_OK; | |||||
| } | |||||
| int FusedBatchnormCPUKernel::Execute(int task_id) { | int FusedBatchnormCPUKernel::Execute(int task_id) { | ||||
| FusedBatchNorm(out_addr_, in_addr_, scale_addr_, offset_addr_, mean_addr_, var_addr_, task_id, batchnorm_param_); | FusedBatchNorm(out_addr_, in_addr_, scale_addr_, offset_addr_, mean_addr_, var_addr_, task_id, batchnorm_param_); | ||||
| return RET_OK; | return RET_OK; | ||||
| @@ -149,13 +146,16 @@ int FusedBatchnormCPUKernel::Run() { | |||||
| kernel::LiteKernel *CpuFusedBatchnormKernelCreator(const std::vector<lite::tensor::Tensor *> &inputs, | kernel::LiteKernel *CpuFusedBatchnormKernelCreator(const std::vector<lite::tensor::Tensor *> &inputs, | ||||
| const std::vector<lite::tensor::Tensor *> &outputs, | const std::vector<lite::tensor::Tensor *> &outputs, | ||||
| OpParameter *opParameter, const lite::Context *ctx, | |||||
| OpParameter *op_parameter, const lite::Context *ctx, | |||||
| const kernel::KernelKey &desc, | const kernel::KernelKey &desc, | ||||
| const mindspore::lite::PrimitiveC *primitive) { | const mindspore::lite::PrimitiveC *primitive) { | ||||
| MS_ASSERT(opParameter != nullptr); | |||||
| if (op_parameter == nullptr) { | |||||
| MS_LOG(ERROR) << "Input parameter is nullptr!"; | |||||
| return nullptr; | |||||
| } | |||||
| MS_ASSERT(desc.type == schema::PrimitiveType_FusedBatchNorm); | MS_ASSERT(desc.type == schema::PrimitiveType_FusedBatchNorm); | ||||
| FusedBatchnormCPUKernel *kernel = | FusedBatchnormCPUKernel *kernel = | ||||
| new (std::nothrow) FusedBatchnormCPUKernel(opParameter, inputs, outputs, ctx, primitive); | |||||
| new (std::nothrow) FusedBatchnormCPUKernel(op_parameter, inputs, outputs, ctx, primitive); | |||||
| if (kernel == nullptr) { | if (kernel == nullptr) { | ||||
| MS_LOG(ERROR) << "new FusedBatchnormCPUKernel fail!"; | MS_LOG(ERROR) << "new FusedBatchnormCPUKernel fail!"; | ||||
| return nullptr; | return nullptr; | ||||
| @@ -163,8 +163,8 @@ kernel::LiteKernel *CpuFusedBatchnormKernelCreator(const std::vector<lite::tenso | |||||
| auto ret = kernel->Init(); | auto ret = kernel->Init(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| delete kernel; | delete kernel; | ||||
| MS_LOG(ERROR) << "Init kernel failed, name: " << opParameter->name_ << ", type: " | |||||
| << schema::EnumNamePrimitiveType(static_cast<schema::PrimitiveType>(opParameter->type_)); | |||||
| MS_LOG(ERROR) << "Init kernel failed, name: " << op_parameter->name_ << ", type: " | |||||
| << schema::EnumNamePrimitiveType(static_cast<schema::PrimitiveType>(op_parameter->type_)); | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| return kernel; | return kernel; | ||||
| @@ -40,6 +40,7 @@ class FusedBatchnormCPUKernel : public LiteKernel { | |||||
| int Execute(int task_id); | int Execute(int task_id); | ||||
| private: | private: | ||||
| void FreeTmpBuffer(); | |||||
| float *in_addr_ = nullptr; | float *in_addr_ = nullptr; | ||||
| float *mean_addr_ = nullptr; | float *mean_addr_ = nullptr; | ||||
| float *var_addr_ = nullptr; | float *var_addr_ = nullptr; | ||||
| @@ -25,20 +25,29 @@ using mindspore::lite::RET_MEMORY_FAILED; | |||||
| using mindspore::lite::RET_OK; | using mindspore::lite::RET_OK; | ||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| MatmulCPUKernel::~MatmulCPUKernel() { | |||||
| ctx_->allocator->Free(a_c8_ptr_); | |||||
| ctx_->allocator->Free(b_r8_ptr_); | |||||
| ctx_->allocator->Free(c_r8x8_ptr_); | |||||
| ctx_->allocator->Free(bias_ptr_); | |||||
| } | |||||
| int MatmulCPUKernel::ReSize() { return RET_OK; } | |||||
| MatmulCPUKernel::~MatmulCPUKernel() { FreeTmpBuffer(); } | |||||
| int MatmulCPUKernel::Init() { | |||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| return RET_OK; | |||||
| void MatmulCPUKernel::FreeTmpBuffer() { | |||||
| if (a_c8_ptr_ != nullptr) { | |||||
| ctx_->allocator->Free(a_c8_ptr_); | |||||
| a_c8_ptr_ = nullptr; | |||||
| } | |||||
| if (b_r8_ptr_ != nullptr) { | |||||
| ctx_->allocator->Free(b_r8_ptr_); | |||||
| b_r8_ptr_ = nullptr; | |||||
| } | |||||
| if (c_r8x8_ptr_ != nullptr) { | |||||
| ctx_->allocator->Free(c_r8x8_ptr_); | |||||
| c_r8x8_ptr_ = nullptr; | |||||
| } | |||||
| if (bias_ptr_ != nullptr) { | |||||
| ctx_->allocator->Free(bias_ptr_); | |||||
| bias_ptr_ = nullptr; | |||||
| } | } | ||||
| } | |||||
| int MatmulCPUKernel::ReSize() { | |||||
| FreeTmpBuffer(); | |||||
| int batch = 1; | int batch = 1; | ||||
| auto a_shape = in_tensors_[0]->shape(); | auto a_shape = in_tensors_[0]->shape(); | ||||
| auto c_shape = out_tensors_[0]->shape(); | auto c_shape = out_tensors_[0]->shape(); | ||||
| @@ -63,17 +72,20 @@ int MatmulCPUKernel::Init() { | |||||
| thread_stride_ = UP_DIV(UP_DIV(params_->col_8_, 8), thread_count_); | thread_stride_ = UP_DIV(UP_DIV(params_->col_8_, 8), thread_count_); | ||||
| a_c8_ptr_ = reinterpret_cast<float *>(ctx_->allocator->Malloc(params_->row_8_ * params_->deep_ * sizeof(float))); | a_c8_ptr_ = reinterpret_cast<float *>(ctx_->allocator->Malloc(params_->row_8_ * params_->deep_ * sizeof(float))); | ||||
| if (!a_c8_ptr_) { | |||||
| if (a_c8_ptr_ == nullptr) { | |||||
| FreeTmpBuffer(); | |||||
| return RET_MEMORY_FAILED; | return RET_MEMORY_FAILED; | ||||
| } | } | ||||
| memset(a_c8_ptr_, 0, params_->row_8_ * params_->deep_ * sizeof(float)); | memset(a_c8_ptr_, 0, params_->row_8_ * params_->deep_ * sizeof(float)); | ||||
| b_r8_ptr_ = reinterpret_cast<float *>(ctx_->allocator->Malloc(params_->col_8_ * params_->deep_ * sizeof(float))); | b_r8_ptr_ = reinterpret_cast<float *>(ctx_->allocator->Malloc(params_->col_8_ * params_->deep_ * sizeof(float))); | ||||
| if (!b_r8_ptr_) { | |||||
| if (b_r8_ptr_ == nullptr) { | |||||
| FreeTmpBuffer(); | |||||
| return RET_MEMORY_FAILED; | return RET_MEMORY_FAILED; | ||||
| } | } | ||||
| memset(b_r8_ptr_, 0, params_->col_8_ * params_->deep_ * sizeof(float)); | memset(b_r8_ptr_, 0, params_->col_8_ * params_->deep_ * sizeof(float)); | ||||
| c_r8x8_ptr_ = reinterpret_cast<float *>(ctx_->allocator->Malloc(params_->row_8_ * params_->col_8_ * sizeof(float))); | c_r8x8_ptr_ = reinterpret_cast<float *>(ctx_->allocator->Malloc(params_->row_8_ * params_->col_8_ * sizeof(float))); | ||||
| if (!c_r8x8_ptr_) { | |||||
| if (c_r8x8_ptr_ == nullptr) { | |||||
| FreeTmpBuffer(); | |||||
| return RET_MEMORY_FAILED; | return RET_MEMORY_FAILED; | ||||
| } | } | ||||
| memset(c_r8x8_ptr_, 0, params_->row_8_ * params_->col_8_ * sizeof(float)); | memset(c_r8x8_ptr_, 0, params_->row_8_ * params_->col_8_ * sizeof(float)); | ||||
| @@ -85,6 +97,10 @@ int MatmulCPUKernel::Init() { | |||||
| if (in_tensors_.size() == 3) { | if (in_tensors_.size() == 3) { | ||||
| bias_ptr_ = reinterpret_cast<float *>(malloc(params_->col_8_ * sizeof(float))); | bias_ptr_ = reinterpret_cast<float *>(malloc(params_->col_8_ * sizeof(float))); | ||||
| if (bias_ptr_ == nullptr) { | |||||
| FreeTmpBuffer(); | |||||
| return RET_MEMORY_FAILED; | |||||
| } | |||||
| memset(bias_ptr_, 0, params_->col_8_ * sizeof(float)); | memset(bias_ptr_, 0, params_->col_8_ * sizeof(float)); | ||||
| memcpy(bias_ptr_, in_tensors_[2]->Data(), params_->col_ * sizeof(float)); | memcpy(bias_ptr_, in_tensors_[2]->Data(), params_->col_ * sizeof(float)); | ||||
| } else { | } else { | ||||
| @@ -128,6 +144,13 @@ void MatmulCPUKernel::InitMatrixB(float *src_ptr, float *dst_ptr) { | |||||
| return; | return; | ||||
| } | } | ||||
| int MatmulCPUKernel::Init() { | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | |||||
| } | |||||
| return ReSize(); | |||||
| } | |||||
| int MatmulCPUKernel::RunImpl(int task_id) { | int MatmulCPUKernel::RunImpl(int task_id) { | ||||
| int cur_oc = MSMIN(thread_stride_, UP_DIV(params_->col_8_, 8) - task_id * thread_stride_); | int cur_oc = MSMIN(thread_stride_, UP_DIV(params_->col_8_, 8) - task_id * thread_stride_); | ||||
| if (cur_oc <= 0) { | if (cur_oc <= 0) { | ||||
| @@ -38,12 +38,13 @@ class MatmulCPUKernel : public MatmulBaseCPUKernel { | |||||
| private: | private: | ||||
| void InitMatrixA(float *src_ptr, float *dst_ptr); | void InitMatrixA(float *src_ptr, float *dst_ptr); | ||||
| void InitMatrixB(float *src_ptr, float *dst_ptr); | void InitMatrixB(float *src_ptr, float *dst_ptr); | ||||
| void FreeTmpBuffer(); | |||||
| private: | private: | ||||
| float *a_c8_ptr_; | |||||
| float *b_r8_ptr_; | |||||
| float *c_r8x8_ptr_; | |||||
| float *bias_ptr_; | |||||
| float *a_c8_ptr_ = nullptr; | |||||
| float *b_r8_ptr_ = nullptr; | |||||
| float *c_r8x8_ptr_ = nullptr; | |||||
| float *bias_ptr_ = nullptr; | |||||
| }; | }; | ||||
| } // namespace mindspore::kernel | } // namespace mindspore::kernel | ||||
| @@ -81,7 +81,13 @@ int ReduceCPUKernel::Init() { | |||||
| return ReSize(); | return ReSize(); | ||||
| } | } | ||||
| int ReduceCPUKernel::ReSize() { return MallocTmpBuffer(); } | |||||
| int ReduceCPUKernel::ReSize() { | |||||
| auto ret = ReduceBaseCPUKernel::ReSize(); | |||||
| if (ret != RET_OK) { | |||||
| return ret; | |||||
| } | |||||
| return MallocTmpBuffer(); | |||||
| } | |||||
| int ReduceCPUKernel::CallReduceUnit(int task_id) { | int ReduceCPUKernel::CallReduceUnit(int task_id) { | ||||
| auto ret = reducer_(outer_size_, inner_size_, axis_size_, src_data_, tmp_shape_.data(), dst_data_, task_id, | auto ret = reducer_(outer_size_, inner_size_, axis_size_, src_data_, tmp_shape_.data(), dst_data_, task_id, | ||||
| @@ -24,10 +24,34 @@ using mindspore::schema::PrimitiveType_ReverseSequence; | |||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int ReverseSequenceCPUKernel::Init() { | int ReverseSequenceCPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| return ReSize(); | |||||
| } | |||||
| void ReverseSequenceCPUKernel::ConvertAxisToPositive(const std::vector<int> shape, int *axis) { | |||||
| if (axis != nullptr && *axis < 0) { | |||||
| *axis += shape.size(); | |||||
| } | |||||
| } | |||||
| int ReverseSequenceCPUKernel::CalcCountPreAxis(const std::vector<int> shape, int axis) { | |||||
| int count = 1; | |||||
| for (int i = 0; i < axis; ++i) { | |||||
| count *= shape[i]; | |||||
| } | |||||
| return count; | |||||
| } | |||||
| int ReverseSequenceCPUKernel::CalcCountAfterAxis(const std::vector<int> shape, int axis) { | |||||
| int count = 1; | |||||
| for (int i = axis + 1; i < shape.size(); ++i) { | |||||
| count *= shape[i]; | |||||
| } | |||||
| return count; | |||||
| } | |||||
| int ReverseSequenceCPUKernel::ReSize() { | |||||
| auto input0 = in_tensors_.at(0); | auto input0 = in_tensors_.at(0); | ||||
| auto input1 = in_tensors_.at(1); | auto input1 = in_tensors_.at(1); | ||||
| auto output = out_tensors_.at(0); | auto output = out_tensors_.at(0); | ||||
| @@ -64,34 +88,11 @@ int ReverseSequenceCPUKernel::Init() { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| void ReverseSequenceCPUKernel::ConvertAxisToPositive(const std::vector<int> shape, int *axis) { | |||||
| if (axis != nullptr && *axis < 0) { | |||||
| *axis += shape.size(); | |||||
| } | |||||
| } | |||||
| int ReverseSequenceCPUKernel::CalcCountPreAxis(const std::vector<int> shape, int axis) { | |||||
| int count = 1; | |||||
| for (int i = 0; i < axis; ++i) { | |||||
| count *= shape[i]; | |||||
| } | |||||
| return count; | |||||
| } | |||||
| int ReverseSequenceCPUKernel::CalcCountAfterAxis(const std::vector<int> shape, int axis) { | |||||
| int count = 1; | |||||
| for (int i = axis + 1; i < shape.size(); ++i) { | |||||
| count *= shape[i]; | |||||
| } | |||||
| return count; | |||||
| } | |||||
| int ReverseSequenceCPUKernel::ReSize() { return RET_OK; } | |||||
| int ReverseSequenceCPUKernel::Run() { | int ReverseSequenceCPUKernel::Run() { | ||||
| auto ret = Prepare(); | auto ret = Prepare(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| MS_LOG(ERROR) << "Prepare failed."; | |||||
| return RET_ERROR; | |||||
| MS_LOG(ERROR) << "Prepare fail!ret: " << ret; | |||||
| return ret; | |||||
| } | } | ||||
| float *input0 = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | float *input0 = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | ||||
| int *input1 = reinterpret_cast<int *>(in_tensors_.at(1)->Data()); | int *input1 = reinterpret_cast<int *>(in_tensors_.at(1)->Data()); | ||||
| @@ -25,18 +25,10 @@ using mindspore::schema::PrimitiveType_Tile; | |||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int TileCPUKernel::Init() { | int TileCPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| auto tile_parameter_ = reinterpret_cast<TileParameter *>(op_parameter_); | |||||
| for (int i = 0; i < tile_parameter_->in_dim_; ++i) { | |||||
| tile_parameter_->in_shape_[i] = in_tensors_[0]->shape()[i]; | |||||
| tile_parameter_->out_shape_[i] = out_tensors_[0]->shape()[i]; | |||||
| } | |||||
| ComputeStrides(tile_parameter_->in_shape_, tile_parameter_->in_strides_, tile_parameter_->in_dim_); | |||||
| ComputeStrides(tile_parameter_->out_shape_, tile_parameter_->out_strides_, tile_parameter_->in_dim_); | |||||
| return RET_OK; | |||||
| return ReSize(); | |||||
| } | } | ||||
| void TileCPUKernel::ComputeStrides(int *shape, int *strides, int ndim) { | void TileCPUKernel::ComputeStrides(int *shape, int *strides, int ndim) { | ||||
| @@ -47,13 +39,22 @@ void TileCPUKernel::ComputeStrides(int *shape, int *strides, int ndim) { | |||||
| } | } | ||||
| } | } | ||||
| int TileCPUKernel::ReSize() { return RET_OK; } | |||||
| int TileCPUKernel::ReSize() { | |||||
| auto tile_parameter_ = reinterpret_cast<TileParameter *>(op_parameter_); | |||||
| for (int i = 0; i < tile_parameter_->in_dim_; ++i) { | |||||
| tile_parameter_->in_shape_[i] = in_tensors_[0]->shape()[i]; | |||||
| tile_parameter_->out_shape_[i] = out_tensors_[0]->shape()[i]; | |||||
| } | |||||
| ComputeStrides(tile_parameter_->in_shape_, tile_parameter_->in_strides_, tile_parameter_->in_dim_); | |||||
| ComputeStrides(tile_parameter_->out_shape_, tile_parameter_->out_strides_, tile_parameter_->in_dim_); | |||||
| return RET_OK; | |||||
| } | |||||
| int TileCPUKernel::Run() { | int TileCPUKernel::Run() { | ||||
| auto ret = Prepare(); | auto ret = Prepare(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| MS_LOG(ERROR) << "Prepare failed."; | |||||
| return RET_ERROR; | |||||
| MS_LOG(ERROR) << "Prepare fail!ret: " << ret; | |||||
| return ret; | |||||
| } | } | ||||
| auto input_addr = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | auto input_addr = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | ||||
| auto output_addr = reinterpret_cast<float *>(out_tensors_.at(0)->Data()); | auto output_addr = reinterpret_cast<float *>(out_tensors_.at(0)->Data()); | ||||
| @@ -88,27 +88,24 @@ int PadInt8CPUKernel::InitPadParam() { | |||||
| } | } | ||||
| int PadInt8CPUKernel::ReSize() { | int PadInt8CPUKernel::ReSize() { | ||||
| InitPadParam(); | |||||
| return RET_OK; | |||||
| } | |||||
| int PadInt8CPUKernel::Init() { | |||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| return RET_OK; | |||||
| } | |||||
| int error_code = InitPadParam(); | int error_code = InitPadParam(); | ||||
| if (error_code != RET_OK) { | if (error_code != RET_OK) { | ||||
| MS_LOG(ERROR) << "InitPadParam failed. errorcode: " << error_code; | MS_LOG(ERROR) << "InitPadParam failed. errorcode: " << error_code; | ||||
| return error_code; | return error_code; | ||||
| } | } | ||||
| return RET_OK; | |||||
| } | |||||
| error_code = SetQuantParam(); | |||||
| int PadInt8CPUKernel::Init() { | |||||
| auto error_code = SetQuantParam(); | |||||
| if (error_code != RET_OK) { | if (error_code != RET_OK) { | ||||
| MS_LOG(ERROR) << "SetQuantParam failed. errorcode: " << error_code; | MS_LOG(ERROR) << "SetQuantParam failed. errorcode: " << error_code; | ||||
| return error_code; | return error_code; | ||||
| } | } | ||||
| return RET_OK; | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | |||||
| } | |||||
| return ReSize(); | |||||
| } | } | ||||
| int PadInt8CPUKernel::RunImpl(int task_id) { | int PadInt8CPUKernel::RunImpl(int task_id) { | ||||
| @@ -128,8 +125,8 @@ int PadInt8Impl(int task_id, LiteParallelGroupEnv *penv, void *cdata) { | |||||
| int PadInt8CPUKernel::Run() { | int PadInt8CPUKernel::Run() { | ||||
| auto ret = Prepare(); | auto ret = Prepare(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| MS_LOG(ERROR) << "Prepare failed."; | |||||
| return RET_ERROR; | |||||
| MS_LOG(ERROR) << "Prepare fail!ret: " << ret; | |||||
| return ret; | |||||
| } | } | ||||
| in_data_ = reinterpret_cast<int8_t *>(in_tensors_[0]->Data()); | in_data_ = reinterpret_cast<int8_t *>(in_tensors_[0]->Data()); | ||||
| out_data_ = reinterpret_cast<int8_t *>(out_tensors_[0]->Data()); | out_data_ = reinterpret_cast<int8_t *>(out_tensors_[0]->Data()); | ||||
| @@ -46,9 +46,9 @@ class PadInt8CPUKernel : public LiteKernel { | |||||
| void FreeQuantParam(); | void FreeQuantParam(); | ||||
| private: | private: | ||||
| PadParameter *pad_param_; | |||||
| int8_t *in_data_; | |||||
| int8_t *out_data_; | |||||
| PadParameter *pad_param_ = nullptr; | |||||
| int8_t *in_data_ = nullptr; | |||||
| int8_t *out_data_ = nullptr; | |||||
| int in_dims_[DEFAULT_PAD_NDIMS]; | int in_dims_[DEFAULT_PAD_NDIMS]; | ||||
| int out_dims_[DEFAULT_PAD_NDIMS]; | int out_dims_[DEFAULT_PAD_NDIMS]; | ||||
| }; | }; | ||||
| @@ -26,10 +26,6 @@ using mindspore::lite::RET_OK; | |||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int PoolingInt8CPUKernel::Init() { | int PoolingInt8CPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| return RET_OK; | |||||
| } | |||||
| auto ret = PoolingBaseCPUKernel::Init(); | auto ret = PoolingBaseCPUKernel::Init(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| MS_LOG(ERROR) << "PoolingBase Init failed."; | MS_LOG(ERROR) << "PoolingBase Init failed."; | ||||
| @@ -29,34 +29,43 @@ using mindspore::schema::PrimitiveType_Prelu; | |||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int PreluInt8CPUKernel::Init() { | int PreluInt8CPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| return RET_OK; | |||||
| } | |||||
| PreluBaseCPUKernel::Init(); | PreluBaseCPUKernel::Init(); | ||||
| auto *input_tensor = in_tensors_.at(kInputIndex); | auto *input_tensor = in_tensors_.at(kInputIndex); | ||||
| auto in_quant_args = input_tensor->GetQuantParams(); | auto in_quant_args = input_tensor->GetQuantParams(); | ||||
| quant_prelu_parm_->quant_arg.in_args_.scale_ = in_quant_args.front().scale; | quant_prelu_parm_->quant_arg.in_args_.scale_ = in_quant_args.front().scale; | ||||
| quant_prelu_parm_->quant_arg.in_args_.zp_ = in_quant_args.front().zeroPoint; | quant_prelu_parm_->quant_arg.in_args_.zp_ = in_quant_args.front().zeroPoint; | ||||
| auto input_dim = input_tensor->shape().size(); | |||||
| MS_ASSERT(input_dim <= CROP_OFFSET_MAX_SIZE); | |||||
| quant_prelu_parm_->input_dim_ = input_dim; | |||||
| quant_prelu_parm_->element_num = in_tensors_[0]->Size(); | |||||
| auto *out_tensor = out_tensors_.at(kOutputIndex); | auto *out_tensor = out_tensors_.at(kOutputIndex); | ||||
| auto out_quant_args = out_tensor->GetQuantParams(); | auto out_quant_args = out_tensor->GetQuantParams(); | ||||
| quant_prelu_parm_->quant_arg.out_args_.scale_ = out_quant_args.front().scale; | quant_prelu_parm_->quant_arg.out_args_.scale_ = out_quant_args.front().scale; | ||||
| quant_prelu_parm_->quant_arg.out_args_.zp_ = out_quant_args.front().zeroPoint; | quant_prelu_parm_->quant_arg.out_args_.zp_ = out_quant_args.front().zeroPoint; | ||||
| quant_prelu_parm_->in_shape_ = input_tensor->shape().data(); | |||||
| quant_prelu_parm_->out_shape_ = out_tensor->shape().data(); | |||||
| quant_prelu_parm_->quant_arg.output_activation_max_ = std::numeric_limits<int8_t>::max(); | quant_prelu_parm_->quant_arg.output_activation_max_ = std::numeric_limits<int8_t>::max(); | ||||
| quant_prelu_parm_->quant_arg.output_activation_min_ = std::numeric_limits<int8_t>::min(); | quant_prelu_parm_->quant_arg.output_activation_min_ = std::numeric_limits<int8_t>::min(); | ||||
| return RET_OK; | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | |||||
| } | |||||
| return ReSize(); | |||||
| } | } | ||||
| int PreluInt8CPUKernel::ReSize() { return 0; } | |||||
| int PreluInt8CPUKernel::ReSize() { | |||||
| auto *input_tensor = in_tensors_.at(kInputIndex); | |||||
| auto *out_tensor = out_tensors_.at(kOutputIndex); | |||||
| auto input_dim = input_tensor->shape().size(); | |||||
| MS_ASSERT(input_dim <= CROP_OFFSET_MAX_SIZE); | |||||
| quant_prelu_parm_->input_dim_ = input_dim; | |||||
| quant_prelu_parm_->element_num = in_tensors_[0]->Size(); | |||||
| quant_prelu_parm_->in_shape_ = input_tensor->shape().data(); | |||||
| quant_prelu_parm_->out_shape_ = out_tensor->shape().data(); | |||||
| } | |||||
| int PreluInt8CPUKernel::Run() { | int PreluInt8CPUKernel::Run() { | ||||
| auto ret = LiteBackendParallelLaunch(PreluInt8Run, this, quant_prelu_parm_->op_parameter_.thread_num_); | |||||
| auto ret = Prepare(); | |||||
| if (ret != RET_OK) { | |||||
| MS_LOG(ERROR) << "Prepare fail!ret: " << ret; | |||||
| return ret; | |||||
| } | |||||
| ret = LiteBackendParallelLaunch(PreluInt8Run, this, quant_prelu_parm_->op_parameter_.thread_num_); | |||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| MS_LOG(ERROR) << "RunPreluParam failed. errorcode: "; | MS_LOG(ERROR) << "RunPreluParam failed. errorcode: "; | ||||
| } | } | ||||
| @@ -25,11 +25,18 @@ using mindspore::schema::PrimitiveType_TopK; | |||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int TopKInt8CPUKernel::Init() { | int TopKInt8CPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| return ReSize(); | |||||
| } | |||||
| int TopKInt8CPUKernel::ReSize() { | |||||
| TopkParameter *parameter = reinterpret_cast<TopkParameter *>(op_parameter_); | TopkParameter *parameter = reinterpret_cast<TopkParameter *>(op_parameter_); | ||||
| if (parameter->topk_node_list_ != nullptr) { | |||||
| free(parameter->topk_node_list_); | |||||
| parameter->topk_node_list_ = nullptr; | |||||
| } | |||||
| lite::tensor::Tensor *input = in_tensors_.at(0); | lite::tensor::Tensor *input = in_tensors_.at(0); | ||||
| parameter->last_dim_size_ = input->shape()[input->shape().size() - 1]; | parameter->last_dim_size_ = input->shape()[input->shape().size() - 1]; | ||||
| parameter->loop_num_ = 1; | parameter->loop_num_ = 1; | ||||
| @@ -45,8 +52,6 @@ int TopKInt8CPUKernel::Init() { | |||||
| return RET_OK; | return RET_OK; | ||||
| } | } | ||||
| int TopKInt8CPUKernel::ReSize() { return RET_OK; } | |||||
| int TopKInt8CPUKernel::Run() { | int TopKInt8CPUKernel::Run() { | ||||
| auto ret = Prepare(); | auto ret = Prepare(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| @@ -65,7 +70,11 @@ kernel::LiteKernel *CpuTopKInt8KernelCreator(const std::vector<lite::tensor::Ten | |||||
| const std::vector<lite::tensor::Tensor *> &outputs, OpParameter *parameter, | const std::vector<lite::tensor::Tensor *> &outputs, OpParameter *parameter, | ||||
| const lite::Context *ctx, const KernelKey &desc, | const lite::Context *ctx, const KernelKey &desc, | ||||
| const mindspore::lite::PrimitiveC *primitive) { | const mindspore::lite::PrimitiveC *primitive) { | ||||
| MS_ASSERT(parameter != nullptr); | |||||
| if (parameter == nullptr) { | |||||
| MS_LOG(ERROR) << "input parameter is nullptr!"; | |||||
| return nullptr; | |||||
| } | |||||
| TopKInt8CPUKernel *kernel = new (std::nothrow) TopKInt8CPUKernel(parameter, inputs, outputs, ctx, primitive); | TopKInt8CPUKernel *kernel = new (std::nothrow) TopKInt8CPUKernel(parameter, inputs, outputs, ctx, primitive); | ||||
| if (kernel == nullptr) { | if (kernel == nullptr) { | ||||
| MS_LOG(ERROR) << "new TopKInt8CPUKernel fail!"; | MS_LOG(ERROR) << "new TopKInt8CPUKernel fail!"; | ||||
| @@ -26,17 +26,21 @@ class TopKInt8CPUKernel : public LiteKernel { | |||||
| explicit TopKInt8CPUKernel(OpParameter *parameter, const std::vector<lite::tensor::Tensor *> &inputs, | explicit TopKInt8CPUKernel(OpParameter *parameter, const std::vector<lite::tensor::Tensor *> &inputs, | ||||
| const std::vector<lite::tensor::Tensor *> &outputs, const lite::Context *ctx, | const std::vector<lite::tensor::Tensor *> &outputs, const lite::Context *ctx, | ||||
| const mindspore::lite::PrimitiveC *primitive) | const mindspore::lite::PrimitiveC *primitive) | ||||
| : LiteKernel(parameter, inputs, outputs, ctx, primitive) {} | |||||
| : LiteKernel(parameter, inputs, outputs, ctx, primitive) { | |||||
| TopkParameter *param = reinterpret_cast<TopkParameter *>(op_parameter_); | |||||
| param->topk_node_list_ = nullptr; | |||||
| } | |||||
| ~TopKInt8CPUKernel() override { | ~TopKInt8CPUKernel() override { | ||||
| TopkParameter *parameter = reinterpret_cast<TopkParameter *>(op_parameter_); | TopkParameter *parameter = reinterpret_cast<TopkParameter *>(op_parameter_); | ||||
| free(parameter->topk_node_list_); | |||||
| if (parameter->topk_node_list_ != nullptr) { | |||||
| free(parameter->topk_node_list_); | |||||
| parameter->topk_node_list_ = nullptr; | |||||
| } | |||||
| } | } | ||||
| int Init() override; | int Init() override; | ||||
| int ReSize() override; | int ReSize() override; | ||||
| int Run() override; | int Run() override; | ||||
| private: | |||||
| }; | }; | ||||
| } // namespace mindspore::kernel | } // namespace mindspore::kernel | ||||
| @@ -29,10 +29,6 @@ using mindspore::schema::PrimitiveType_Unsqueeze; | |||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int Unsqueezeint8CPUKernel::Init() { | int Unsqueezeint8CPUKernel::Init() { | ||||
| if (context_->infer_shape_interrupt_ && !context_->running_) { | |||||
| set_need_reinit(); | |||||
| return RET_OK; | |||||
| } | |||||
| auto *input_tensor = in_tensors_.at(0); | auto *input_tensor = in_tensors_.at(0); | ||||
| auto quant_args = input_tensor->GetQuantParams(); | auto quant_args = input_tensor->GetQuantParams(); | ||||
| MS_ASSERT(quant_args.size() == 1); | MS_ASSERT(quant_args.size() == 1); | ||||
| @@ -43,9 +39,10 @@ int Unsqueezeint8CPUKernel::Init() { | |||||
| Unsq_para_->quant_arg.out_quant_args_.scale_ = out_quant_args.front().scale; | Unsq_para_->quant_arg.out_quant_args_.scale_ = out_quant_args.front().scale; | ||||
| Unsq_para_->quant_arg.out_quant_args_.zp_ = out_quant_args.front().zeroPoint; | Unsq_para_->quant_arg.out_quant_args_.zp_ = out_quant_args.front().zeroPoint; | ||||
| Unsq_para_->thread_count_ = thread_count_; | Unsq_para_->thread_count_ = thread_count_; | ||||
| int ret = ReSize(); | |||||
| return ret; | |||||
| if (!InferShapeDone()) { | |||||
| return RET_OK; | |||||
| } | |||||
| return ReSize(); | |||||
| } | } | ||||
| int Unsqueezeint8CPUKernel::ReSize() { | int Unsqueezeint8CPUKernel::ReSize() { | ||||
| @@ -86,7 +83,7 @@ int UnsqueezeIn8Run(int task_id, LiteParallelGroupEnv *penv, void *cdata) { | |||||
| int Unsqueezeint8CPUKernel::Run() { | int Unsqueezeint8CPUKernel::Run() { | ||||
| auto ret = Prepare(); | auto ret = Prepare(); | ||||
| if (ret != RET_OK) { | if (ret != RET_OK) { | ||||
| MS_LOG(ERROR) << "Prepare failed."; | |||||
| MS_LOG(ERROR) << "Prepare fail!ret: " << ret; | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| in_ptr_ = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | in_ptr_ = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | ||||
| @@ -82,6 +82,7 @@ int Scheduler::InferShape(const lite::Model *model, std::vector<tensor::Tensor * | |||||
| MS_EXCEPTION_IF_NULL(tensors); | MS_EXCEPTION_IF_NULL(tensors); | ||||
| auto meta_graph = model->GetMetaGraph(); | auto meta_graph = model->GetMetaGraph(); | ||||
| MS_EXCEPTION_IF_NULL(meta_graph); | MS_EXCEPTION_IF_NULL(meta_graph); | ||||
| bool infer_shape_interrupt = false; | |||||
| uint32_t kernelCount = meta_graph->nodes()->size(); | uint32_t kernelCount = meta_graph->nodes()->size(); | ||||
| for (uint32_t i = 0; i < kernelCount; i++) { | for (uint32_t i = 0; i < kernelCount; i++) { | ||||
| auto cNode = meta_graph->nodes()->GetAs<schema::CNode>(i); | auto cNode = meta_graph->nodes()->GetAs<schema::CNode>(i); | ||||
| @@ -101,27 +102,18 @@ int Scheduler::InferShape(const lite::Model *model, std::vector<tensor::Tensor * | |||||
| << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()); | << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()); | ||||
| return RET_ERROR; | return RET_ERROR; | ||||
| } | } | ||||
| if (!context_->infer_shape_interrupt_) { | |||||
| auto ret = primitive->InferShape(inputs, outputs); | |||||
| if (ret == RET_INFER_INVALID) { | |||||
| MS_LOG(INFO) << "InferShape shouldn't be done before runtime, name: " << cNode->name()->str() | |||||
| << ", type: " << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()) | |||||
| << "flag set to false."; | |||||
| primitive->SetInferFlag(false); | |||||
| context_->InferShapeInterrupt(); | |||||
| } else if (ret != RET_OK) { | |||||
| MS_LOG(ERROR) << "InferShape failed, name: " << cNode->name()->str() | |||||
| << ", type: " << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()); | |||||
| return RET_INFER_ERR; | |||||
| } | |||||
| } else { | |||||
| primitive->SetInferFlag(!infer_shape_interrupt); | |||||
| auto ret = primitive->InferShape(inputs, outputs); | |||||
| if (ret == RET_INFER_INVALID) { | |||||
| MS_LOG(INFO) << "InferShape shouldn't be done before runtime, name: " << cNode->name()->str() | |||||
| << ", type: " << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()) | |||||
| << "flag set to false."; | |||||
| primitive->SetInferFlag(false); | primitive->SetInferFlag(false); | ||||
| auto ret = primitive->InferShape(inputs, outputs); | |||||
| if (ret != RET_OK) { | |||||
| MS_LOG(ERROR) << "InferShape fail! name: " << cNode->name()->str() | |||||
| << ", type: " << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()); | |||||
| return RET_INFER_ERR; | |||||
| } | |||||
| infer_shape_interrupt = true; | |||||
| } else if (ret != RET_OK) { | |||||
| MS_LOG(ERROR) << "InferShape failed, name: " << cNode->name()->str() | |||||
| << ", type: " << schema::EnumNamePrimitiveType(cNode->primitive()->value_type()); | |||||
| return RET_INFER_ERR; | |||||
| } | } | ||||
| } | } | ||||
| return RET_OK; | return RET_OK; | ||||
| @@ -76,6 +76,40 @@ TEST_F(TestArgMinMaxTestFp32, ArgMaxTest1_keep_dim) { | |||||
| CompareOutputData(out, except_out.data(), except_out.size(), 0.000001); | CompareOutputData(out, except_out.data(), except_out.size(), 0.000001); | ||||
| } | } | ||||
| TEST_F(TestArgMinMaxTestFp32, ArgMaxTest_axis2_keep_dim) { | |||||
| std::vector<float> in = {10, 20, 30, | |||||
| 11, 15, 10, | |||||
| 5, 10, 12, | |||||
| 10, 20, 30, | |||||
| 11, 15, 10, | |||||
| 5, 10, 12, | |||||
| 10, 20, 30, | |||||
| 11, 15, 10, | |||||
| 5, 10, 12 | |||||
| }; | |||||
| std::vector<float> except_out = {1, 0, 0, 1, 0, 0, 1, 0, 0}; | |||||
| std::vector<int> shape = {1, 3, 3, 3}; | |||||
| float out[9]; | |||||
| ArgMinMaxParameter param; | |||||
| param.topk_ = 1; | |||||
| param.out_value_ = false; | |||||
| param.axis_ = 2; | |||||
| param.data_type_ = 43; | |||||
| param.dims_size_ = 4; | |||||
| param.get_max_ = true; | |||||
| param.keep_dims_ = true; | |||||
| param.arg_elements_ = reinterpret_cast<ArgElement *>(malloc(shape[param.axis_] * sizeof(ArgElement))); | |||||
| std::vector<int> out_shape = {1, 3, 1, 3}; | |||||
| ComputeStrides(shape.data(), param.in_strides_, shape.size()); | |||||
| ComputeStrides(out_shape.data(), param.out_strides_, out_shape.size()); | |||||
| ArgMinMax(in.data(), out, shape.data(), ¶m); | |||||
| for (size_t i = 0; i < except_out.size(); ++i) { | |||||
| std::cout << out[i] << " "; | |||||
| } | |||||
| std::cout << "\n"; | |||||
| CompareOutputData(out, except_out.data(), except_out.size(), 0.000001); | |||||
| } | |||||
| TEST_F(TestArgMinMaxTestFp32, ArgMaxTest2) { | TEST_F(TestArgMinMaxTestFp32, ArgMaxTest2) { | ||||
| std::vector<float> in = {10, 20, 30, 40, 90, | std::vector<float> in = {10, 20, 30, 40, 90, | ||||
| 20, 11, 15, 1, 50, | 20, 11, 15, 1, 50, | ||||