diff --git a/ge/single_op/single_op_model.cc b/ge/single_op/single_op_model.cc index a4a4b623..25bf6855 100755 --- a/ge/single_op/single_op_model.cc +++ b/ge/single_op/single_op_model.cc @@ -473,10 +473,10 @@ Status SingleOpModel::BuildTaskListForDynamicOp(DynamicSingleOp &single_op) { return SUCCESS; } -Status SingleOpModel::BuildDynamicOp(DynamicSingleOp &single_op) { +Status SingleOpModel::BuildDynamicOp(StreamResource &resource, DynamicSingleOp &single_op) { single_op.num_inputs_ = data_ops_.size(); single_op.num_outputs_ = netoutput_op_->GetAllInputsSize(); - ParseOpModelParams(model_helper_, model_params_); + GE_CHK_STATUS_RET_NOLOG(InitModelMem(resource)); return BuildTaskListForDynamicOp(single_op); } } // namespace ge diff --git a/ge/single_op/single_op_model.h b/ge/single_op/single_op_model.h index c3164543..6d0109fe 100755 --- a/ge/single_op/single_op_model.h +++ b/ge/single_op/single_op_model.h @@ -52,7 +52,7 @@ class SingleOpModel { Status Init(); Status BuildOp(StreamResource &resource, SingleOp &single_op); - Status BuildDynamicOp(DynamicSingleOp &single_op); + Status BuildDynamicOp(StreamResource &resource, DynamicSingleOp &single_op); private: Status InitModel(); diff --git a/ge/single_op/stream_resource.cc b/ge/single_op/stream_resource.cc index 722a1024..db6b7c47 100755 --- a/ge/single_op/stream_resource.cc +++ b/ge/single_op/stream_resource.cc @@ -155,7 +155,8 @@ Status StreamResource::BuildDynamicOperator(const string &model_name, GE_CHECK_NOTNULL(new_op); GELOGI("To build operator: %s", model_name.c_str()); - GE_CHK_STATUS_RET(model.BuildDynamicOp(*new_op), "Build op failed. op = %s, ret = %u", model_name.c_str(), ret); + GE_CHK_STATUS_RET(model.BuildDynamicOp(*this, *new_op), + "Build op failed. op = %s, ret = %u", model_name.c_str(), ret); *single_op = new_op.get(); dynamic_op_map_[model_data.model_data] = std::move(new_op); return SUCCESS; diff --git a/ge/single_op/task/aicpu_kernel_task_builder.cc b/ge/single_op/task/aicpu_kernel_task_builder.cc index f8a2bd1b..34f1ba7b 100755 --- a/ge/single_op/task/aicpu_kernel_task_builder.cc +++ b/ge/single_op/task/aicpu_kernel_task_builder.cc @@ -66,6 +66,7 @@ Status AiCpuCCTaskBuilder::BuildTask(AiCpuCCTask &task, uint64_t kernel_id, cons const std::string &kernel_name = kernel_def_.kernel_name(); task.SetSoName(so_name); task.SetkernelName(kernel_name); + GE_CHECK_NOTNULL(op_desc_); task.op_desc_ = op_desc_; const auto &context = kernel_def_.context(); @@ -96,6 +97,7 @@ Status AiCpuCCTaskBuilder::BuildTask(AiCpuCCTask &task, uint64_t kernel_id, cons GELOGE(ret, "Init ext info failed."); return ret; } + GE_CHK_STATUS_RET(task.SetInputConst(), "AiCpuCCTask set input_const failed."); if (task.GetUnknownType() == DEPEND_COMPUTE) { GELOGE(FAILED, "AiCpuCCTask unknown type is depend compute, it's not supported now."); diff --git a/ge/single_op/task/aicpu_task_builder.cc b/ge/single_op/task/aicpu_task_builder.cc index 0cc5c554..5fd4879e 100755 --- a/ge/single_op/task/aicpu_task_builder.cc +++ b/ge/single_op/task/aicpu_task_builder.cc @@ -88,6 +88,7 @@ namespace ge { return ret; } + GE_CHECK_NOTNULL(op_desc_); task.op_desc_ = op_desc_; task.num_inputs_ = op_desc_->GetInputsSize(); task.num_outputs_ = op_desc_->GetOutputsSize(); @@ -104,6 +105,7 @@ namespace ge { fwk_op_kernel.fwkKernelBase.fwk_kernel.extInfoAddr = reinterpret_cast(task.ext_info_addr_dev_); fwk_op_kernel.fwkKernelBase.fwk_kernel.extInfoLen = kernel_ext_info_size; } + GE_CHK_STATUS_RET(task.SetInputConst(), "AiCpuTask set input_const failed."); GE_CHK_STATUS_RET(task.InitForSummaryAndCopy(), "AiCpuTask init for summary and copy task failed."); fwk_op_kernel.fwkKernelBase.fwk_kernel.sessionID = ULLONG_MAX; diff --git a/ge/single_op/task/op_task.cc b/ge/single_op/task/op_task.cc index 22433ec9..4f64251c 100755 --- a/ge/single_op/task/op_task.cc +++ b/ge/single_op/task/op_task.cc @@ -369,6 +369,25 @@ Status AiCpuBaseTask::SetExtInfoAndType(const std::string &kernel_ext_info, uint return SUCCESS; } +Status AiCpuBaseTask::SetInputConst() { + input_is_const_.clear(); + const vector v_is_input_const = op_desc_->GetIsInputConst(); + for (size_t i = 0; i < op_desc_->GetAllInputsSize(); ++i) { + const GeTensorDescPtr tensor_desc = op_desc_->MutableInputDesc(static_cast(i)); + if (tensor_desc == nullptr) { + GELOGD("SingleOp: %s, Index: %zu, has no input", op_desc_->GetName().c_str(), i); + continue; + } + if (i < v_is_input_const.size() && v_is_input_const[i]) { + GELOGD("SingleOp: %s, Index: %zu, input is const", op_desc_->GetName().c_str(), i); + input_is_const_.push_back(true); + continue; + } + input_is_const_.push_back(false); + } + return SUCCESS; +} + Status AiCpuBaseTask::UpdateExtInfo(const std::vector &input_desc, std::vector &output_desc, rtStream_t stream) { @@ -379,9 +398,23 @@ Status AiCpuBaseTask::UpdateExtInfo(const std::vector &input_desc, } GE_CHECK_NOTNULL(aicpu_ext_handle_); - for (size_t i = 0; i < num_inputs_; ++i) { - GE_CHK_STATUS_RET(aicpu_ext_handle_->UpdateInputShapeAndType(i, input_desc[i]), - "Input[%zu] update input shape failed.", i); + + size_t non_const_index = 0; + for (size_t input_index = 0; input_index < num_inputs_; input_index++) { + if (input_index < input_is_const_.size() && input_is_const_[input_index]) { + // get input_desc from op_desc if const input, num_inputs_ is op_desc_ input_size + auto const_input_desc = op_desc_->MutableInputDesc(static_cast(input_index)); + GE_CHECK_NOTNULL(const_input_desc); + GE_CHK_STATUS_RET(aicpu_ext_handle_->UpdateInputShapeAndType(input_index, *const_input_desc), + "Input[%zu] update input shape failed.", input_index); + continue; + } + GE_CHK_BOOL_RET_STATUS(non_const_index < input_desc.size(), PARAM_INVALID, + "Input_desc size is %zu, but get non_const_index is %zu", + input_desc.size(), non_const_index); + GE_CHK_STATUS_RET(aicpu_ext_handle_->UpdateInputShapeAndType(input_index, input_desc[non_const_index]), + "Input[%zu] update input shape failed.", input_index); + non_const_index++; } if (unknown_type_ != DEPEND_COMPUTE) { @@ -460,11 +493,23 @@ Status AiCpuBaseTask::UpdateIoAddr(const vector &inputs, const vecto GetIoAddr(arg_base, arg_num); // input number and output number was check in ValidateParams - for (size_t i = 0; i < inputs.size(); ++i) { - auto addr = inputs[i].data; + size_t non_const_index = 0; + for (size_t input_index = 0; input_index < num_inputs_; input_index++) { + if (input_index < input_is_const_.size() && input_is_const_[input_index]) { + // const input no need update addr + GE_CHECK_NOTNULL(arg_base); + GELOGD("AICpuTask input[%zu] addr = %u", input_index, *arg_base); + arg_base++; + continue; + } + GE_CHK_BOOL_RET_STATUS(non_const_index < inputs.size(), PARAM_INVALID, + "Input size is %zu, but get non_const_index is %zu", + inputs.size(), non_const_index); + auto addr = inputs[non_const_index].data; GE_CHECK_NOTNULL(addr); - GELOGD("AICpuTask input[%zu] addr = %p", i, addr); + GELOGD("AICpuTask input[%zu] addr = %p", input_index, addr); *arg_base++ = reinterpret_cast(addr); + non_const_index++; } for (size_t i = 0; i < outputs.size(); ++i) { diff --git a/ge/single_op/task/op_task.h b/ge/single_op/task/op_task.h index e2122b6f..761697cb 100644 --- a/ge/single_op/task/op_task.h +++ b/ge/single_op/task/op_task.h @@ -113,6 +113,7 @@ class AiCpuBaseTask : public OpTask { protected: Status UpdateIoAddr(const std::vector &inputs, const std::vector &outputs); + Status SetInputConst(); Status SetExtInfoAndType(const std::string &kernel_ext_info, uint64_t kernel_id); Status UpdateExtInfo(const std::vector &input_desc, @@ -127,6 +128,7 @@ class AiCpuBaseTask : public OpTask { UnknowShapeOpType unknown_type_ = DEPEND_IN_SHAPE; std::unique_ptr aicpu_ext_handle_; void *ext_info_addr_dev_ = nullptr; + vector input_is_const_; }; class AiCpuTask : public AiCpuBaseTask {