• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1From 8bf71f29ba289af74a827b9f5ffbbf42907bace5 Mon Sep 17 00:00:00 2001
2From: Zhu Guodong <zhuguodong0001@163.com>
3Date: Wed, 9 Aug 2023 19:52:04 +0800
4Subject: [PATCH] auto-apply 0039-fix-double-destry-nnrt-mode.patch
5
6---
7 .../runtime/delegate/nnrt/nnrt_delegate.cc    | 31 +++++++++----------
8 1 file changed, 14 insertions(+), 17 deletions(-)
9
10diff --git a/mindspore/lite/src/runtime/delegate/nnrt/nnrt_delegate.cc b/mindspore/lite/src/runtime/delegate/nnrt/nnrt_delegate.cc
11index 15b117ca..fa7b55ff 100644
12--- a/mindspore/lite/src/runtime/delegate/nnrt/nnrt_delegate.cc
13+++ b/mindspore/lite/src/runtime/delegate/nnrt/nnrt_delegate.cc
14@@ -107,19 +107,18 @@ Status NNRTDelegate::BuildKirinNPUModel(DelegateModel<schema::Primitive> *model)
15   }
16
17   size_t extension_size = nnrt_device_info_.extensions_.size();
18-  OH_NN_Extension *extensions = (OH_NN_Extension *)malloc(sizeof(OH_NN_Extension) * extension_size);
19-  if (extensions == nullptr) {
20-    MS_LOG(ERROR) << "allocate extensions failed";
21-    return kLiteNullptr;
22-  }
23-
24+  std::vector<OH_NN_Extension> extensions;
25   MS_LOG_DEBUG << "set extensions, item number: " << extension_size;
26+  const size_t kExtensionNameMax = 128; // This is a length limitation in NNRT API.
27   for (size_t i = 0; i < extension_size; i++) {
28     auto &src_extension = nnrt_device_info_.extensions_[i];
29-    strcpy(extensions[i].name, src_extension.name.c_str());
30-    extensions[i].value = (char *)((void *)src_extension.value.data());
31-    extensions[i].valueSize = src_extension.value.size();
32-    MS_LOG_DEBUG << "set extension, item name: " << extensions[i].name << ", value size: " << extensions[i].valueSize;
33+    OH_NN_Extension dst_extension;
34+    dst_extension.name[kExtensionNameMax - 1] = '\0';
35+    strncpy(dst_extension.name, src_extension.name.c_str(), kExtensionNameMax - 1);
36+    dst_extension.value = (char *)((void *)src_extension.value.data());
37+    dst_extension.valueSize = src_extension.value.size();
38+    extensions.push_back(dst_extension);
39+    MS_LOG_DEBUG << "set extension, item name: " << dst_extension.name << ", value size: " << dst_extension.valueSize;
40   }
41
42   if (IsCustomModel()) {
43@@ -131,8 +130,7 @@ Status NNRTDelegate::BuildKirinNPUModel(DelegateModel<schema::Primitive> *model)
44     }
45   } else {
46     SetKirinModelInputsAndOutputs(nn_model);
47-
48-    auto ret = OH_NNModel_BuildFromMetaGraph(nn_model, meta_graph_, extensions, extension_size);
49+    auto ret = OH_NNModel_BuildFromMetaGraph(nn_model, meta_graph_, extensions.data(), extensions.size());
50     if (ret != OH_NN_SUCCESS) {
51       MS_LOG(ERROR) << "Build NNModel failed, ret: " << ret;
52       OH_NNModel_Destroy(&nn_model);
53@@ -143,7 +141,7 @@ Status NNRTDelegate::BuildKirinNPUModel(DelegateModel<schema::Primitive> *model)
54   auto ret2 =  CreateFullModelKernel(model, nn_model);
55   if (ret2 != kSuccess) {
56     MS_LOG(ERROR) << "Create full model kernel failed, ret: " << ret2;
57-    OH_NNModel_Destroy(&nn_model);
58+    return kLiteError;
59   }
60   return kSuccess;
61 }
62@@ -185,13 +183,13 @@ Status NNRTDelegate::CreateFullModelKernel(DelegateModel<schema::Primitive> *mod
63     OH_NNModel_Destroy(&nn_model);
64     return kLiteError;
65   }
66+  OH_NNModel_Destroy(&nn_model);
67   MS_LOG(DEBUG) << "NNRTDelegate creates NNCompilation success.";
68
69   auto ret_code = InitNNCompilation(nn_compilation);
70   if (ret_code != kSuccess) {
71     MS_LOG(ERROR) << "Init NNCompilation failed";
72     OH_NNCompilation_Destroy(&nn_compilation);
73-    OH_NNModel_Destroy(&nn_model);
74     return kLiteError;
75   }
76
77@@ -200,18 +198,17 @@ Status NNRTDelegate::CreateFullModelKernel(DelegateModel<schema::Primitive> *mod
78   if (nn_executor == nullptr) {
79     MS_LOG(ERROR) << "Construct NNExecutor failed, ret: " << ret_code;
80     OH_NNCompilation_Destroy(&nn_compilation);
81-    OH_NNModel_Destroy(&nn_model);
82     return kLiteError;
83   }
84+  OH_NNCompilation_Destroy(&nn_compilation);
85
86   auto nnrt_model_kernel = new (std::nothrow)NNRTModelKernel(nn_executor, model->inputs(), model->outputs());
87   if (nnrt_model_kernel == nullptr) {
88+    OH_NNExecutor_Destroy(&nn_executor);
89     MS_LOG(ERROR) << "new NNRTModelKernel failed";
90     return kLiteError;
91   }
92   model->Replace(model->BeginKernelIterator(), model->EndKernelIterator(), nnrt_model_kernel);
93-  OH_NNCompilation_Destroy(&nn_compilation);
94-  OH_NNModel_Destroy(&nn_model);
95   return kSuccess;
96 }
97 #endif
98--
992.34.1
100
101