1be168c0dSopenharmony_ciFrom 548f98e1129d33e31314c4cfa8446584f4e48b29 Mon Sep 17 00:00:00 2001
2be168c0dSopenharmony_ciFrom: chengfeng27 <chengfeng27@huawei.com>
3be168c0dSopenharmony_ciDate: Thu, 1 Aug 2024 16:57:50 +0800
4be168c0dSopenharmony_ciSubject: [PATCH] allocator get/set crash in multi thread
5be168c0dSopenharmony_ci
6be168c0dSopenharmony_ci---
7be168c0dSopenharmony_ci .../core/mindrt/src/thread/core_affinity.cc   |   2 +-
8be168c0dSopenharmony_ci .../core/mindrt/src/thread/threadpool.cc      |   2 +-
9be168c0dSopenharmony_ci mindspore/lite/BUILD.gn                       |   1 +
10be168c0dSopenharmony_ci mindspore/lite/src/common/context_util.cc     |   3 +-
11be168c0dSopenharmony_ci mindspore/lite/src/litert/c_api/context_c.cc  |  11 +-
12be168c0dSopenharmony_ci mindspore/lite/src/litert/c_api/tensor_c.cc   |  16 ++-
13be168c0dSopenharmony_ci .../delegate/nnrt/extension_options_parser.cc |   6 +-
14be168c0dSopenharmony_ci .../delegate/nnrt/extension_options_parser.h  |   4 +-
15be168c0dSopenharmony_ci .../delegate/nnrt/hiai_foundation_wrapper.cc  |   1 +
16be168c0dSopenharmony_ci .../litert/delegate/nnrt/nnrt_allocator.cc    |  61 ++++++++--
17be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_allocator.h |   4 +
18be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_delegate.cc |  43 ++++---
19be168c0dSopenharmony_ci .../litert/delegate/nnrt/nnrt_model_kernel.cc | 112 +++++++-----------
20be168c0dSopenharmony_ci .../litert/delegate/nnrt/nnrt_model_kernel.h  |  15 +--
21be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_utils.cc    | 110 +++++++++++++++++
22be168c0dSopenharmony_ci .../src/litert/delegate/nnrt/nnrt_utils.h     |  29 +++++
23be168c0dSopenharmony_ci mindspore/lite/src/litert/infer_manager.cc    |   5 +-
24be168c0dSopenharmony_ci mindspore/lite/src/tensor.cc                  |  16 ++-
25be168c0dSopenharmony_ci 18 files changed, 320 insertions(+), 121 deletions(-)
26be168c0dSopenharmony_ci create mode 100644 mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.cc
27be168c0dSopenharmony_ci create mode 100644 mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.h
28be168c0dSopenharmony_ci
29be168c0dSopenharmony_cidiff --git a/mindspore/core/mindrt/src/thread/core_affinity.cc b/mindspore/core/mindrt/src/thread/core_affinity.cc
30be168c0dSopenharmony_ciindex a3478dff..6886f743 100644
31be168c0dSopenharmony_ci--- a/mindspore/core/mindrt/src/thread/core_affinity.cc
32be168c0dSopenharmony_ci+++ b/mindspore/core/mindrt/src/thread/core_affinity.cc
33be168c0dSopenharmony_ci@@ -349,7 +349,7 @@ int CoreAffinity::SetAffinity(const pthread_t &thread_id, cpu_set_t *cpu_set) {
34be168c0dSopenharmony_ci   THREAD_INFO("thread: %d, mask: %lu", pthread_gettid_np(thread_id), cpu_set->__bits[0]);
35be168c0dSopenharmony_ci   int ret = sched_setaffinity(pthread_gettid_np(thread_id), sizeof(cpu_set_t), cpu_set);
36be168c0dSopenharmony_ci   if (ret != THREAD_OK) {
37be168c0dSopenharmony_ci-    THREAD_ERROR("bind thread %d to cpu failed. ERROR %{public}d", pthread_gettid_np(thread_id), ret);
38be168c0dSopenharmony_ci+    THREAD_ERROR("bind thread %d to cpu failed. ERROR %d", pthread_gettid_np(thread_id), ret);
39be168c0dSopenharmony_ci     return THREAD_ERROR;
40be168c0dSopenharmony_ci   }
41be168c0dSopenharmony_ci #endif
42be168c0dSopenharmony_cidiff --git a/mindspore/core/mindrt/src/thread/threadpool.cc b/mindspore/core/mindrt/src/thread/threadpool.cc
43be168c0dSopenharmony_ciindex f166a104..e3856c26 100644
44be168c0dSopenharmony_ci--- a/mindspore/core/mindrt/src/thread/threadpool.cc
45be168c0dSopenharmony_ci+++ b/mindspore/core/mindrt/src/thread/threadpool.cc
46be168c0dSopenharmony_ci@@ -72,7 +72,7 @@ void Worker::SetAffinity() {
47be168c0dSopenharmony_ci   THREAD_INFO("thread: %d, mask: %lu", gettid(), mask_.__bits[0]);
48be168c0dSopenharmony_ci   int ret = sched_setaffinity(gettid(), sizeof(cpu_set_t), &mask_);
49be168c0dSopenharmony_ci   if (ret != THREAD_OK) {
50be168c0dSopenharmony_ci-    THREAD_ERROR("bind thread %d to cpu failed. ERROR %{public}d", gettid(), errno);
51be168c0dSopenharmony_ci+    THREAD_ERROR("bind thread %d to cpu failed. ERROR %d", gettid(), errno);
52be168c0dSopenharmony_ci   }
53be168c0dSopenharmony_ci   return;
54be168c0dSopenharmony_ci #else
55be168c0dSopenharmony_cidiff --git a/mindspore/lite/BUILD.gn b/mindspore/lite/BUILD.gn
56be168c0dSopenharmony_ciindex 124c84c9..acee9733 100644
57be168c0dSopenharmony_ci--- a/mindspore/lite/BUILD.gn
58be168c0dSopenharmony_ci+++ b/mindspore/lite/BUILD.gn
59be168c0dSopenharmony_ci@@ -447,6 +447,7 @@ ohos_shared_library("mindspore_lib") {
60be168c0dSopenharmony_ci       "src/litert/delegate/nnrt/nnrt_model_kernel.cc",
61be168c0dSopenharmony_ci       "src/litert/delegate/nnrt/nnrt_allocator.cc",
62be168c0dSopenharmony_ci       "src/litert/delegate/nnrt/extension_options_parser.cc",
63be168c0dSopenharmony_ci+      "src/litert/delegate/nnrt/nnrt_utils.cc",
64be168c0dSopenharmony_ci     ]
65be168c0dSopenharmony_ci     include_dirs += [
66be168c0dSopenharmony_ci       "src/delegate/nnrt/include",
67be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/common/context_util.cc b/mindspore/lite/src/common/context_util.cc
68be168c0dSopenharmony_ciindex 0fa4ebd0..dae3a7cc 100644
69be168c0dSopenharmony_ci--- a/mindspore/lite/src/common/context_util.cc
70be168c0dSopenharmony_ci+++ b/mindspore/lite/src/common/context_util.cc
71be168c0dSopenharmony_ci@@ -185,8 +185,7 @@ bool DeviceTypePriority(const InnerContext *context, int device_type1, int devic
72be168c0dSopenharmony_ci   if (context == nullptr) {
73be168c0dSopenharmony_ci     return false;
74be168c0dSopenharmony_ci   }
75be168c0dSopenharmony_ci-  std::vector<DeviceContext> device_infos = context->device_list_;
76be168c0dSopenharmony_ci-  for (DeviceContext device_info : device_infos) {
77be168c0dSopenharmony_ci+  for (const DeviceContext& device_info : context->device_list_) {
78be168c0dSopenharmony_ci     if (device_info.device_type_ == device_type1) {
79be168c0dSopenharmony_ci       return true;
80be168c0dSopenharmony_ci     }
81be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/c_api/context_c.cc b/mindspore/lite/src/litert/c_api/context_c.cc
82be168c0dSopenharmony_ciindex 6b6a50d5..2fe3b055 100644
83be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/c_api/context_c.cc
84be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/c_api/context_c.cc
85be168c0dSopenharmony_ci@@ -25,6 +25,10 @@
86be168c0dSopenharmony_ci #include "interfaces/kits/c/neural_network_runtime/neural_network_runtime.h"
87be168c0dSopenharmony_ci #endif
88be168c0dSopenharmony_ci 
89be168c0dSopenharmony_ci+namespace {
90be168c0dSopenharmony_ci+const auto kNpuNamePrefixLen = 4;
91be168c0dSopenharmony_ci+}
92be168c0dSopenharmony_ci+
93be168c0dSopenharmony_ci // ================ Context ================
94be168c0dSopenharmony_ci OH_AI_ContextHandle OH_AI_ContextCreate() {
95be168c0dSopenharmony_ci   auto impl = new (std::nothrow) mindspore::Context();
96be168c0dSopenharmony_ci@@ -308,7 +312,6 @@ NNRTDeviceDesc *OH_AI_GetAllNNRTDeviceDescs(size_t *num) {
97be168c0dSopenharmony_ci   auto ret_load = mindspore::lite::LoadHiaiFLibraryFromPath(&hiai_handle_);
98be168c0dSopenharmony_ci   if (!ret_load || hiai_handle_ == nullptr) {
99be168c0dSopenharmony_ci     MS_LOG(ERROR) << "Load HiAI_Foundation so failed.";
100be168c0dSopenharmony_ci-    return nullptr;
101be168c0dSopenharmony_ci   }
102be168c0dSopenharmony_ci #endif
103be168c0dSopenharmony_ci   *num = 0;
104be168c0dSopenharmony_ci@@ -420,7 +423,7 @@ OH_AI_DeviceInfoHandle OH_AI_CreateNNRTDeviceInfoByType(OH_AI_NNRTDeviceType typ
105be168c0dSopenharmony_ci 
106be168c0dSopenharmony_ci   OH_AI_DeviceInfoHandle handle = nullptr;
107be168c0dSopenharmony_ci   for (size_t i = 0; i < num; i++) {
108be168c0dSopenharmony_ci-    if (desc[i].device_type == type) {
109be168c0dSopenharmony_ci+    if (desc[i].device_type == type && strncmp(desc[i].device_name, "NPU_", kNpuNamePrefixLen) == 0) {
110be168c0dSopenharmony_ci       handle = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_NNRT);
111be168c0dSopenharmony_ci       OH_AI_DeviceInfoSetDeviceId(handle, desc[i].device_id);
112be168c0dSopenharmony_ci       break;
113be168c0dSopenharmony_ci@@ -514,6 +517,10 @@ OH_AI_API OH_AI_Status OH_AI_DeviceInfoAddExtension(OH_AI_DeviceInfoHandle devic
114be168c0dSopenharmony_ci     MS_LOG(ERROR) << "device info is null";
115be168c0dSopenharmony_ci     return OH_AI_STATUS_LITE_NULLPTR;
116be168c0dSopenharmony_ci   }
117be168c0dSopenharmony_ci+  if (name == nullptr || value == nullptr || value_size < 0) {
118be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "name/value/value_size is not valid";
119be168c0dSopenharmony_ci+    return OH_AI_STATUS_LITE_NULLPTR;
120be168c0dSopenharmony_ci+  }
121be168c0dSopenharmony_ci   if (OH_AI_DeviceInfoGetDeviceType(device_info) != OH_AI_DEVICETYPE_NNRT) {
122be168c0dSopenharmony_ci     MS_LOG(ERROR) << "Add extension to non-NNRT device is not allowable, ignored";
123be168c0dSopenharmony_ci     return OH_AI_STATUS_LITE_ERROR;
124be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/c_api/tensor_c.cc b/mindspore/lite/src/litert/c_api/tensor_c.cc
125be168c0dSopenharmony_ciindex fc3814dd..7d6c7930 100644
126be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/c_api/tensor_c.cc
127be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/c_api/tensor_c.cc
128be168c0dSopenharmony_ci@@ -19,9 +19,13 @@
129be168c0dSopenharmony_ci #include "src/tensor.h"
130be168c0dSopenharmony_ci #include "src/litert/cxx_api/tensor/tensor_impl.h"
131be168c0dSopenharmony_ci 
132be168c0dSopenharmony_ci+// allocator_table contains mapping of raw_ptr to weak_ptr of Allocator, allocator_table_mutex is used in multi-thread
133be168c0dSopenharmony_ci+// scene when user build multiple models, to avoid read/write unordered_map conflicts crash.
134be168c0dSopenharmony_ci static std::unordered_map<void *, std::weak_ptr<mindspore::Allocator>> allocator_table;
135be168c0dSopenharmony_ci+static std::mutex allocator_table_mutex;
136be168c0dSopenharmony_ci 
137be168c0dSopenharmony_ci void CleanAllocatorTable() {
138be168c0dSopenharmony_ci+  std::lock_guard<std::mutex> lock(allocator_table_mutex);
139be168c0dSopenharmony_ci   allocator_table.clear();
140be168c0dSopenharmony_ci }
141be168c0dSopenharmony_ci 
142be168c0dSopenharmony_ci@@ -222,21 +226,29 @@ OH_AI_Status OH_AI_TensorSetAllocator(OH_AI_TensorHandle tensor, void *allocator
143be168c0dSopenharmony_ci     return OH_AI_STATUS_LITE_NULLPTR;
144be168c0dSopenharmony_ci   }
145be168c0dSopenharmony_ci   auto impl = static_cast<mindspore::MSTensor *>(tensor);
146be168c0dSopenharmony_ci+  std::lock_guard<std::mutex> lock(allocator_table_mutex);
147be168c0dSopenharmony_ci   if (allocator_table.count(allocator) == 0) {
148be168c0dSopenharmony_ci     MS_LOG(ERROR) << "the input allocator does not belong to framework";
149be168c0dSopenharmony_ci     return OH_AI_STATUS_LITE_PARAM_INVALID;
150be168c0dSopenharmony_ci   }
151be168c0dSopenharmony_ci   std::static_pointer_cast<mindspore::LiteTensorImpl>(impl->impl())->set_own_data(true);
152be168c0dSopenharmony_ci-  impl->SetAllocator(allocator_table[allocator].lock());
153be168c0dSopenharmony_ci+  auto allocator_ptr = allocator_table[allocator].lock();
154be168c0dSopenharmony_ci+  if (allocator_ptr != nullptr) {
155be168c0dSopenharmony_ci+    impl->SetAllocator(allocator_ptr);
156be168c0dSopenharmony_ci+  } else {
157be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "get allocator shared ptr failed.";
158be168c0dSopenharmony_ci+    return OH_AI_STATUS_LITE_NULLPTR;
159be168c0dSopenharmony_ci+  }
160be168c0dSopenharmony_ci   return OH_AI_STATUS_SUCCESS;
161be168c0dSopenharmony_ci }
162be168c0dSopenharmony_ci 
163be168c0dSopenharmony_ci-void *OH_AI_TensorGetAllocator(const OH_AI_TensorHandle tensor) {
164be168c0dSopenharmony_ci+void *OH_AI_TensorGetAllocator(OH_AI_TensorHandle tensor) {
165be168c0dSopenharmony_ci   if (tensor == nullptr) {
166be168c0dSopenharmony_ci     MS_LOG(ERROR) << "param is nullptr.";
167be168c0dSopenharmony_ci     return nullptr;
168be168c0dSopenharmony_ci   }
169be168c0dSopenharmony_ci   auto impl = static_cast<mindspore::MSTensor *>(tensor);
170be168c0dSopenharmony_ci+  std::lock_guard<std::mutex> lock(allocator_table_mutex);
171be168c0dSopenharmony_ci   allocator_table[impl->allocator().get()] = impl->allocator();
172be168c0dSopenharmony_ci   return impl->allocator().get();
173be168c0dSopenharmony_ci }
174be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.cc b/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.cc
175be168c0dSopenharmony_ciindex 98343898..e35cc2a5 100644
176be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.cc
177be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.cc
178be168c0dSopenharmony_ci@@ -38,7 +38,7 @@ int ExtensionOptionsParser::Parse(const std::vector<Extension> &extensions, Exte
179be168c0dSopenharmony_ci   DoParseCachePath(extensions, &param->cache_path_);
180be168c0dSopenharmony_ci   DoParseCacheVersion(extensions, &param->cache_version_);
181be168c0dSopenharmony_ci   DoParseBondMode(extensions, &param->band_mode);
182be168c0dSopenharmony_ci-  DoParseQuantConfig(extensions, &param->quant_config, &param->quant_config_size);
183be168c0dSopenharmony_ci+  DoParseQuantConfig(extensions, &param->quant_config, &param->quant_config_size, &param->is_optional_quant_setted);
184be168c0dSopenharmony_ci   return RET_OK;
185be168c0dSopenharmony_ci }
186be168c0dSopenharmony_ci 
187be168c0dSopenharmony_ci@@ -76,7 +76,8 @@ void ExtensionOptionsParser::DoParseBondMode(const std::vector<Extension> &exten
188be168c0dSopenharmony_ci   }
189be168c0dSopenharmony_ci }
190be168c0dSopenharmony_ci 
191be168c0dSopenharmony_ci-void ExtensionOptionsParser::DoParseQuantConfig(const std::vector<Extension> &extensions, void **quant_config, size_t *num) {
192be168c0dSopenharmony_ci+void ExtensionOptionsParser::DoParseQuantConfig(const std::vector<Extension> &extensions,
193be168c0dSopenharmony_ci+                                                void **quant_config, size_t *num, bool *quant_setted) {
194be168c0dSopenharmony_ci   MS_CHECK_TRUE_RET_VOID(quant_config != nullptr);
195be168c0dSopenharmony_ci   MS_CHECK_TRUE_RET_VOID(num != nullptr);
196be168c0dSopenharmony_ci   auto iter_config = std::find_if(extensions.begin(), extensions.end(), [](const Extension &extension) {
197be168c0dSopenharmony_ci@@ -85,6 +86,7 @@ void ExtensionOptionsParser::DoParseQuantConfig(const std::vector<Extension> &ex
198be168c0dSopenharmony_ci   if (iter_config != extensions.end()) {
199be168c0dSopenharmony_ci     *quant_config = static_cast<void *>(const_cast<uint8_t *>(iter_config->value.data()));
200be168c0dSopenharmony_ci     *num = iter_config->value.size();
201be168c0dSopenharmony_ci+    *quant_setted = true;
202be168c0dSopenharmony_ci   }
203be168c0dSopenharmony_ci }
204be168c0dSopenharmony_ci }  // mindspore::lite::nnrt
205be168c0dSopenharmony_ci\ No newline at end of file
206be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.h b/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.h
207be168c0dSopenharmony_ciindex 792805a4..f24682ce 100644
208be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.h
209be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/extension_options_parser.h
210be168c0dSopenharmony_ci@@ -28,6 +28,7 @@ struct ExtensionOptions {
211be168c0dSopenharmony_ci   mindspore::lite::HiAI_BandMode band_mode{HIAI_BANDMODE_UNSET};
212be168c0dSopenharmony_ci   void *quant_config;
213be168c0dSopenharmony_ci   size_t quant_config_size = 0;
214be168c0dSopenharmony_ci+  bool is_optional_quant_setted = false;
215be168c0dSopenharmony_ci };
216be168c0dSopenharmony_ci 
217be168c0dSopenharmony_ci class ExtensionOptionsParser {
218be168c0dSopenharmony_ci@@ -36,7 +37,8 @@ public:
219be168c0dSopenharmony_ci 
220be168c0dSopenharmony_ci private:
221be168c0dSopenharmony_ci   static void DoParseBondMode(const std::vector<Extension> &extensions, mindspore::lite::HiAI_BandMode *band_mode);
222be168c0dSopenharmony_ci-  static void DoParseQuantConfig(const std::vector<Extension> &extensions, void **quant_config, size_t *num);
223be168c0dSopenharmony_ci+  static void DoParseQuantConfig(const std::vector<Extension> &extensions, void **quant_config, size_t *num,
224be168c0dSopenharmony_ci+                                 bool *quant_setted);
225be168c0dSopenharmony_ci   static void DoParseCachePath(const std::vector<Extension> &extensions, std::string *cache_path);
226be168c0dSopenharmony_ci   static void DoParseCacheVersion(const std::vector<Extension> &extensions, uint32_t *cache_version);
227be168c0dSopenharmony_ci };
228be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/hiai_foundation_wrapper.cc b/mindspore/lite/src/litert/delegate/nnrt/hiai_foundation_wrapper.cc
229be168c0dSopenharmony_ciindex e7a52827..a155b761 100644
230be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/hiai_foundation_wrapper.cc
231be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/hiai_foundation_wrapper.cc
232be168c0dSopenharmony_ci@@ -39,6 +39,7 @@ bool LoadHiaiFLibraryFromPath(void **handle_ptr) {
233be168c0dSopenharmony_ci 
234be168c0dSopenharmony_ci   *handle_ptr = dlopen(HIAI_F_LIB, RTLD_NOW | RTLD_LOCAL);
235be168c0dSopenharmony_ci   if (*handle_ptr == nullptr) {
236be168c0dSopenharmony_ci+    MS_LOG(WARNING) << "dlopen failed, error: " << dlerror();
237be168c0dSopenharmony_ci     return false;
238be168c0dSopenharmony_ci   }
239be168c0dSopenharmony_ci 
240be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc
241be168c0dSopenharmony_ciindex b38fff62..4910343f 100644
242be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc
243be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.cc
244be168c0dSopenharmony_ci@@ -20,6 +20,7 @@
245be168c0dSopenharmony_ci #include <map>
246be168c0dSopenharmony_ci #include <mutex>
247be168c0dSopenharmony_ci #include "src/litert/delegate/nnrt/nnrt_allocator.h"
248be168c0dSopenharmony_ci+#include "src/litert/delegate/nnrt/nnrt_utils.h"
249be168c0dSopenharmony_ci #include "src/common/log.h"
250be168c0dSopenharmony_ci 
251be168c0dSopenharmony_ci namespace mindspore {
252be168c0dSopenharmony_ci@@ -43,7 +44,42 @@ NNRTAllocator::~NNRTAllocator() {
253be168c0dSopenharmony_ci   free_list_.clear();
254be168c0dSopenharmony_ci }
255be168c0dSopenharmony_ci 
256be168c0dSopenharmony_ci-void *NNRTAllocator::Malloc(size_t size) {
257be168c0dSopenharmony_ci+NN_TensorDesc *NNRTAllocator::CreateNNRtTensorDesc(const std::vector<int> &shape, const TypeId data_type,
258be168c0dSopenharmony_ci+                                                   const Format format, const std::string &name) {
259be168c0dSopenharmony_ci+  auto tensor_desc = OH_NNTensorDesc_Create();
260be168c0dSopenharmony_ci+  if (tensor_desc == nullptr) {
261be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_Create failed, i = " << index_;
262be168c0dSopenharmony_ci+    return nullptr;
263be168c0dSopenharmony_ci+  }
264be168c0dSopenharmony_ci+  OH_NN_ReturnCode ret = OH_NNTensorDesc_SetShape(tensor_desc, shape.data(), shape.size());
265be168c0dSopenharmony_ci+  if (ret != OH_NN_SUCCESS) {
266be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetShape failed, i = " << index_ << ", shape: " << shape;
267be168c0dSopenharmony_ci+    OH_NNTensorDesc_Destroy(&tensor_desc);
268be168c0dSopenharmony_ci+    return nullptr;
269be168c0dSopenharmony_ci+  }
270be168c0dSopenharmony_ci+  ret = OH_NNTensorDesc_SetDataType(tensor_desc, CastToNNRtDataType(data_type));
271be168c0dSopenharmony_ci+  if (ret != OH_NN_SUCCESS) {
272be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetDataType failed, i = " << index_ << ", data_type: " << data_type;
273be168c0dSopenharmony_ci+    OH_NNTensorDesc_Destroy(&tensor_desc);
274be168c0dSopenharmony_ci+    return nullptr;
275be168c0dSopenharmony_ci+  }
276be168c0dSopenharmony_ci+  ret = OH_NNTensorDesc_SetFormat(tensor_desc, CastToNNRtFormat(format));
277be168c0dSopenharmony_ci+  if (ret != OH_NN_SUCCESS) {
278be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetFormat failed, i = " << index_ << ", format: " << format;
279be168c0dSopenharmony_ci+    OH_NNTensorDesc_Destroy(&tensor_desc);
280be168c0dSopenharmony_ci+    return nullptr;
281be168c0dSopenharmony_ci+  }
282be168c0dSopenharmony_ci+  ret = OH_NNTensorDesc_SetName(tensor_desc, name.c_str());
283be168c0dSopenharmony_ci+  if (ret != OH_NN_SUCCESS) {
284be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "OH_NNTensorDesc_SetName failed, i = " << index_ << ", name: " << name;
285be168c0dSopenharmony_ci+    OH_NNTensorDesc_Destroy(&tensor_desc);
286be168c0dSopenharmony_ci+    return nullptr;
287be168c0dSopenharmony_ci+  }
288be168c0dSopenharmony_ci+  return tensor_desc;
289be168c0dSopenharmony_ci+}
290be168c0dSopenharmony_ci+
291be168c0dSopenharmony_ci+void *NNRTAllocator::MallocByDesc(size_t size, const std::vector<int> &shape, const TypeId data_type,
292be168c0dSopenharmony_ci+                                  const Format format, const std::string &name) {
293be168c0dSopenharmony_ci   std::lock_guard<std::mutex> locker(mutex_);
294be168c0dSopenharmony_ci   auto iter = free_list_.lower_bound(size);
295be168c0dSopenharmony_ci   if (iter != free_list_.end()) {
296be168c0dSopenharmony_ci@@ -60,17 +96,13 @@ void *NNRTAllocator::Malloc(size_t size) {
297be168c0dSopenharmony_ci     return nullptr;
298be168c0dSopenharmony_ci   }
299be168c0dSopenharmony_ci   membuf->ref_count_ = 0;
300be168c0dSopenharmony_ci-  if (memory_category_ == NNRT_INPUT) {
301be168c0dSopenharmony_ci-    membuf->tensor_desc_ = OH_NNExecutor_CreateInputTensorDesc(executor_, index_);
302be168c0dSopenharmony_ci-  } else {
303be168c0dSopenharmony_ci-    membuf->tensor_desc_ = OH_NNExecutor_CreateOutputTensorDesc(executor_, index_);
304be168c0dSopenharmony_ci-  }
305be168c0dSopenharmony_ci+  membuf->tensor_desc_ = CreateNNRtTensorDesc(shape, data_type, format, name);
306be168c0dSopenharmony_ci   if (membuf->tensor_desc_ == nullptr) {
307be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "OH_NNExecutor_CreateInput/OutputTensorDesc failed, i = " << index_;
308be168c0dSopenharmony_ci+    MS_LOG(ERROR) << "create NN_TensorDesc failed.";
309be168c0dSopenharmony_ci     delete membuf;
310be168c0dSopenharmony_ci     return nullptr;
311be168c0dSopenharmony_ci   }
312be168c0dSopenharmony_ci-  membuf->tensor_ = OH_NNTensor_CreateWithSize(device_id_, membuf->tensor_desc_, size);
313be168c0dSopenharmony_ci+  membuf->tensor_ = OH_NNTensor_Create(device_id_, membuf->tensor_desc_);
314be168c0dSopenharmony_ci   if (membuf->tensor_ == nullptr) {
315be168c0dSopenharmony_ci     MS_LOG(ERROR) << "OH_NNTensor_CreateWithSize failed, i = " << index_;
316be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&membuf->tensor_desc_);
317be168c0dSopenharmony_ci@@ -91,6 +123,11 @@ void *NNRTAllocator::Malloc(size_t size) {
318be168c0dSopenharmony_ci   return membuf->data;
319be168c0dSopenharmony_ci }
320be168c0dSopenharmony_ci 
321be168c0dSopenharmony_ci+void *NNRTAllocator::Malloc(size_t size) {
322be168c0dSopenharmony_ci+  MS_LOG(ERROR) << "NNRt Allocator is not support malloc by size.";
323be168c0dSopenharmony_ci+  return nullptr;
324be168c0dSopenharmony_ci+}
325be168c0dSopenharmony_ci+
326be168c0dSopenharmony_ci void NNRTAllocator::Free(void *ptr) {
327be168c0dSopenharmony_ci   if (ptr == nullptr) {
328be168c0dSopenharmony_ci     return;
329be168c0dSopenharmony_ci@@ -143,8 +180,8 @@ int NNRTAllocator::DecRefCount(void *ptr, int ref_count) {
330be168c0dSopenharmony_ci   auto iter = allocated_list_.find(ptr);
331be168c0dSopenharmony_ci   if (iter != allocated_list_.end()) {
332be168c0dSopenharmony_ci     auto membuf = iter->second;
333be168c0dSopenharmony_ci-    auto ref = std::atomic_fetch_sub(&membuf->ref_count_, ref_count);
334be168c0dSopenharmony_ci-    return ref;
335be168c0dSopenharmony_ci+    std::atomic_fetch_sub(&membuf->ref_count_, ref_count);
336be168c0dSopenharmony_ci+    return membuf->ref_count_;
337be168c0dSopenharmony_ci   }
338be168c0dSopenharmony_ci   return -1;
339be168c0dSopenharmony_ci }
340be168c0dSopenharmony_ci@@ -157,8 +194,8 @@ int NNRTAllocator::IncRefCount(void *ptr, int ref_count) {
341be168c0dSopenharmony_ci   auto iter = allocated_list_.find(ptr);
342be168c0dSopenharmony_ci   if (iter != allocated_list_.end()) {
343be168c0dSopenharmony_ci     auto membuf = iter->second;
344be168c0dSopenharmony_ci-    auto ref = std::atomic_fetch_add(&membuf->ref_count_, ref_count);
345be168c0dSopenharmony_ci-    return ref;
346be168c0dSopenharmony_ci+    std::atomic_fetch_add(&membuf->ref_count_, ref_count);
347be168c0dSopenharmony_ci+    return membuf->ref_count_;
348be168c0dSopenharmony_ci   }
349be168c0dSopenharmony_ci   return -1;
350be168c0dSopenharmony_ci }
351be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h
352be168c0dSopenharmony_ciindex 52e6def7..ef27f307 100644
353be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h
354be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_allocator.h
355be168c0dSopenharmony_ci@@ -40,6 +40,10 @@ class NNRTAllocator : public Allocator {
356be168c0dSopenharmony_ci   ~NNRTAllocator() override;
357be168c0dSopenharmony_ci 
358be168c0dSopenharmony_ci   void *Malloc(size_t size) override;
359be168c0dSopenharmony_ci+  void *MallocByDesc(size_t size, const std::vector<int> &shape, const TypeId data_type, const Format format,
360be168c0dSopenharmony_ci+                     const std::string &name);
361be168c0dSopenharmony_ci+  NN_TensorDesc *CreateNNRtTensorDesc(const std::vector<int> &shape, const TypeId data_type, const Format format,
362be168c0dSopenharmony_ci+                                      const std::string &name);
363be168c0dSopenharmony_ci   void Free(void *ptr) override;
364be168c0dSopenharmony_ci   int RefCount(void *ptr) override;
365be168c0dSopenharmony_ci   int SetRefCount(void *ptr, int ref_count) override;
366be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc
367be168c0dSopenharmony_ciindex 17abd0ed..a49e7449 100644
368be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc
369be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_delegate.cc
370be168c0dSopenharmony_ci@@ -33,8 +33,7 @@ Status NNRTDelegate::Init() {
371be168c0dSopenharmony_ci #ifdef SUPPORT_NNRT_METAGRAPH
372be168c0dSopenharmony_ci   auto ret = mindspore::lite::LoadHiaiFLibraryFromPath(&hiai_handle_);
373be168c0dSopenharmony_ci   if (!ret || hiai_handle_ == nullptr) {
374be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "Load HiAI_Foundation so failed.";
375be168c0dSopenharmony_ci-    return kLiteError;
376be168c0dSopenharmony_ci+    MS_LOG(WARNING) << "Load HiAI_Foundation so failed.";
377be168c0dSopenharmony_ci   }
378be168c0dSopenharmony_ci #endif
379be168c0dSopenharmony_ci   return kSuccess;
380be168c0dSopenharmony_ci@@ -194,7 +193,7 @@ Status NNRTDelegate::BuildOfflineModel(DelegateModel<schema::Primitive> *model)
381be168c0dSopenharmony_ci   }
382be168c0dSopenharmony_ci   OH_NNCompilation_Destroy(&nn_compilation);
383be168c0dSopenharmony_ci 
384be168c0dSopenharmony_ci-  auto nnrt_model_kernel = new (std::nothrow) NNRTModelKernel(nn_executor, nnrt_device_info_.device_id_, model->inputs(), model->outputs());
385be168c0dSopenharmony_ci+  auto nnrt_model_kernel = new (std::nothrow) NNRTModelKernel(nn_executor, nnrt_device_info_, model->inputs(), model->outputs());
386be168c0dSopenharmony_ci   if (nnrt_model_kernel == nullptr) {
387be168c0dSopenharmony_ci     OH_NNExecutor_Destroy(&nn_executor);
388be168c0dSopenharmony_ci     MS_LOG(ERROR) << "new NNRTModelKernel failed";
389be168c0dSopenharmony_ci@@ -233,7 +232,7 @@ Status NNRTDelegate::CreateFullModelKernel(DelegateModel<schema::Primitive> *mod
390be168c0dSopenharmony_ci   }
391be168c0dSopenharmony_ci   OH_NNCompilation_Destroy(&nn_compilation);
392be168c0dSopenharmony_ci 
393be168c0dSopenharmony_ci-  auto nnrt_model_kernel = new (std::nothrow)NNRTModelKernel(nn_executor, nnrt_device_info_.device_id_, model->inputs(), model->outputs());
394be168c0dSopenharmony_ci+  auto nnrt_model_kernel = new (std::nothrow) NNRTModelKernel(nn_executor, nnrt_device_info_, model->inputs(), model->outputs());
395be168c0dSopenharmony_ci   if (nnrt_model_kernel == nullptr) {
396be168c0dSopenharmony_ci     OH_NNExecutor_Destroy(&nn_executor);
397be168c0dSopenharmony_ci     MS_LOG(ERROR) << "new NNRTModelKernel failed";
398be168c0dSopenharmony_ci@@ -547,20 +546,30 @@ Status NNRTDelegate::InitNNCompilation(OH_NNCompilation *nn_compilation) const {
399be168c0dSopenharmony_ci   }
400be168c0dSopenharmony_ci 
401be168c0dSopenharmony_ci #ifdef SUPPORT_NNRT_METAGRAPH
402be168c0dSopenharmony_ci-  ret_code = mindspore::lite::HMS_HiAIOptions_SetBandMode(nn_compilation, extension_options_.band_mode);
403be168c0dSopenharmony_ci-  if ((ret_code != OH_NN_SUCCESS) && (ret_code != OH_NN_OPERATION_FORBIDDEN)) {
404be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "NNCompilation set BandMode failed, ret: " << ret_code;
405be168c0dSopenharmony_ci-    return kLiteError;
406be168c0dSopenharmony_ci-  }
407be168c0dSopenharmony_ci+  if (hiai_handle_ != nullptr) {
408be168c0dSopenharmony_ci+    if (extension_options_.band_mode != mindspore::lite::HIAI_BANDMODE_UNSET) {
409be168c0dSopenharmony_ci+      ret_code = mindspore::lite::HMS_HiAIOptions_SetBandMode(nn_compilation, extension_options_.band_mode);
410be168c0dSopenharmony_ci+      if ((ret_code != OH_NN_SUCCESS) && (ret_code != OH_NN_OPERATION_FORBIDDEN)) {
411be168c0dSopenharmony_ci+        MS_LOG(ERROR) << "NNCompilation set BandMode failed, ret: " << ret_code;
412be168c0dSopenharmony_ci+        return kLiteError;
413be168c0dSopenharmony_ci+      }
414be168c0dSopenharmony_ci+    }
415be168c0dSopenharmony_ci 
416be168c0dSopenharmony_ci-  if (extension_options_.quant_config != nullptr && extension_options_.quant_config_size != 0) {
417be168c0dSopenharmony_ci-    ret_code = mindspore::lite::HMS_HiAIOptions_SetQuantConfig(nn_compilation,
418be168c0dSopenharmony_ci-                                                                      extension_options_.quant_config,
419be168c0dSopenharmony_ci-                                                                      extension_options_.quant_config_size);
420be168c0dSopenharmony_ci-    if ((ret_code != OH_NN_SUCCESS) && (ret_code != OH_NN_OPERATION_FORBIDDEN)) {
421be168c0dSopenharmony_ci-      MS_LOG(ERROR) << "NNCompilation set QuantConfig failed, ret: " << ret_code;
422be168c0dSopenharmony_ci-      return kLiteError;
423be168c0dSopenharmony_ci+    if (extension_options_.is_optional_quant_setted) {
424be168c0dSopenharmony_ci+      if (extension_options_.quant_config == nullptr || extension_options_.quant_config_size <= 0) {
425be168c0dSopenharmony_ci+        MS_LOG(ERROR) << "NNCompilation set QuantConfig faild, input quant config is invalid, please make sure buffer "
426be168c0dSopenharmony_ci+                      << "is not null and size > 0.";
427be168c0dSopenharmony_ci+        return kLiteError;
428be168c0dSopenharmony_ci+      }
429be168c0dSopenharmony_ci+      ret_code = mindspore::lite::HMS_HiAIOptions_SetQuantConfig(nn_compilation, extension_options_.quant_config,
430be168c0dSopenharmony_ci+                                                                 extension_options_.quant_config_size);
431be168c0dSopenharmony_ci+      if ((ret_code != OH_NN_SUCCESS) && (ret_code != OH_NN_OPERATION_FORBIDDEN)) {
432be168c0dSopenharmony_ci+        MS_LOG(ERROR) << "NNCompilation set QuantConfig failed, ret: " << ret_code;
433be168c0dSopenharmony_ci+        return kLiteError;
434be168c0dSopenharmony_ci+      }
435be168c0dSopenharmony_ci     }
436be168c0dSopenharmony_ci+  } else {
437be168c0dSopenharmony_ci+    MS_LOG(WARNING) << "hiai_foundation is nullptr.";
438be168c0dSopenharmony_ci   }
439be168c0dSopenharmony_ci #endif
440be168c0dSopenharmony_ci 
441be168c0dSopenharmony_ci@@ -664,7 +673,7 @@ Status NNRTDelegate::CreateNNRTSubgraphKernels(DelegateModel<schema::Primitive>
442be168c0dSopenharmony_ci       continue ;
443be168c0dSopenharmony_ci     }
444be168c0dSopenharmony_ci 
445be168c0dSopenharmony_ci-    auto nnrt_model_kernel = new (std::nothrow)NNRTModelKernel(nn_executor, nnrt_device_info_.device_id_, in_tensors, out_tensors);
446be168c0dSopenharmony_ci+    auto nnrt_model_kernel = new (std::nothrow) NNRTModelKernel(nn_executor, nnrt_device_info_, in_tensors, out_tensors);
447be168c0dSopenharmony_ci     if (nnrt_model_kernel == nullptr) {
448be168c0dSopenharmony_ci       MS_LOG(ERROR) << "new NNRTModelKernel failed";
449be168c0dSopenharmony_ci       return kLiteError;
450be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc
451be168c0dSopenharmony_ciindex 2a66d133..1411020b 100644
452be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc
453be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.cc
454be168c0dSopenharmony_ci@@ -17,9 +17,15 @@
455be168c0dSopenharmony_ci #include "nnrt_model_kernel.h"
456be168c0dSopenharmony_ci #include "nnrt_allocator.h"
457be168c0dSopenharmony_ci #include "litert/cxx_api/tensor/tensor_impl.h"
458be168c0dSopenharmony_ci-int mindspore::NNRTModelKernel::Prepare() {
459be168c0dSopenharmony_ci+
460be168c0dSopenharmony_ci+namespace mindspore{
461be168c0dSopenharmony_ci+namespace {
462be168c0dSopenharmony_ci+constexpr auto kDynamicDims = "DynamicDims";
463be168c0dSopenharmony_ci+}
464be168c0dSopenharmony_ci+
465be168c0dSopenharmony_ci+int NNRTModelKernel::Prepare() {
466be168c0dSopenharmony_ci   for (size_t i = 0; i < inputs_.size(); i++) {
467be168c0dSopenharmony_ci-    auto nnrt_allocator = std::make_shared<lite::NNRTAllocator>(oh_nn_executor, i, device_id_, lite::NNRT_INPUT);
468be168c0dSopenharmony_ci+    auto nnrt_allocator = std::make_shared<lite::NNRTAllocator>(oh_nn_executor_, i, nnrt_device_info_.device_id_, lite::NNRT_INPUT);
469be168c0dSopenharmony_ci     if (nnrt_allocator == nullptr) {
470be168c0dSopenharmony_ci       MS_LOG(ERROR) << "Create NNRTAllocator failed";
471be168c0dSopenharmony_ci       return lite::RET_NULL_PTR;
472be168c0dSopenharmony_ci@@ -27,7 +33,7 @@ int mindspore::NNRTModelKernel::Prepare() {
473be168c0dSopenharmony_ci     inputs_[i].SetAllocator(nnrt_allocator);
474be168c0dSopenharmony_ci   }
475be168c0dSopenharmony_ci   for (size_t i = 0; i < outputs_.size(); i++) {
476be168c0dSopenharmony_ci-    auto nnrt_allocator = std::make_shared<lite::NNRTAllocator>(oh_nn_executor, i, device_id_, lite::NNRT_OUTPUT);
477be168c0dSopenharmony_ci+    auto nnrt_allocator = std::make_shared<lite::NNRTAllocator>(oh_nn_executor_, i, nnrt_device_info_.device_id_, lite::NNRT_OUTPUT);
478be168c0dSopenharmony_ci     if (nnrt_allocator == nullptr) {
479be168c0dSopenharmony_ci       MS_LOG(ERROR) << "Create NNRTAllocator failed";
480be168c0dSopenharmony_ci       return lite::RET_NULL_PTR;
481be168c0dSopenharmony_ci@@ -37,7 +43,19 @@ int mindspore::NNRTModelKernel::Prepare() {
482be168c0dSopenharmony_ci   return lite::RET_OK;
483be168c0dSopenharmony_ci }
484be168c0dSopenharmony_ci 
485be168c0dSopenharmony_ci-int mindspore::NNRTModelKernel::Execute() {
486be168c0dSopenharmony_ci+int NNRTModelKernel::ReSize() {
487be168c0dSopenharmony_ci+  const auto &extensions = nnrt_device_info_.extensions_;
488be168c0dSopenharmony_ci+  auto iter = std::find_if(extensions.begin(), extensions.end(), [](const lite::Extension &extension) {
489be168c0dSopenharmony_ci+    return extension.name == kDynamicDims;
490be168c0dSopenharmony_ci+  });
491be168c0dSopenharmony_ci+  if (iter != extensions.end() && !iter->value.empty()) {
492be168c0dSopenharmony_ci+    return lite::RET_OK;
493be168c0dSopenharmony_ci+  }
494be168c0dSopenharmony_ci+  MS_LOG(ERROR) << "NNRT only support the resize function when DynamicDims is enabled.";
495be168c0dSopenharmony_ci+  return lite::RET_ERROR;
496be168c0dSopenharmony_ci+}
497be168c0dSopenharmony_ci+
498be168c0dSopenharmony_ci+int NNRTModelKernel::Execute() {
499be168c0dSopenharmony_ci   MS_CHECK_TRUE_RET(this->outputs().empty() != true, lite::RET_ERROR);
500be168c0dSopenharmony_ci   zero_copy_ = IS_NNRT_ALLOCATOR(this->outputs()[Index0].allocator());
501be168c0dSopenharmony_ci 
502be168c0dSopenharmony_ci@@ -61,7 +79,7 @@ int mindspore::NNRTModelKernel::Execute() {
503be168c0dSopenharmony_ci   }
504be168c0dSopenharmony_ci   MS_LOG(INFO) << "Running NNRtModel Kernel...";
505be168c0dSopenharmony_ci   OH_NN_ReturnCode ret_code;
506be168c0dSopenharmony_ci-  ret_code = OH_NNExecutor_RunSync(oh_nn_executor, nn_input_tensors_.data(), nn_input_tensors_.size(),
507be168c0dSopenharmony_ci+  ret_code = OH_NNExecutor_RunSync(oh_nn_executor_, nn_input_tensors_.data(), nn_input_tensors_.size(),
508be168c0dSopenharmony_ci                                    nn_output_tensors_.data(), nn_output_tensors_.size());
509be168c0dSopenharmony_ci 
510be168c0dSopenharmony_ci   if (ret_code != OH_NN_SUCCESS) {
511be168c0dSopenharmony_ci@@ -73,67 +91,11 @@ int mindspore::NNRTModelKernel::Execute() {
512be168c0dSopenharmony_ci   return lite::RET_OK;
513be168c0dSopenharmony_ci }
514be168c0dSopenharmony_ci 
515be168c0dSopenharmony_ci-OH_NN_DataType mindspore::NNRTModelKernel::ConvertDataType(mindspore::DataType data_type) {
516be168c0dSopenharmony_ci-  OH_NN_DataType oh_data_type;
517be168c0dSopenharmony_ci-  switch (data_type) {
518be168c0dSopenharmony_ci-    case DataType::kTypeUnknown:
519be168c0dSopenharmony_ci-    case DataType::kObjectTypeString:
520be168c0dSopenharmony_ci-    case DataType::kObjectTypeList:
521be168c0dSopenharmony_ci-    case DataType::kObjectTypeTuple:
522be168c0dSopenharmony_ci-    case DataType::kObjectTypeTensorType:
523be168c0dSopenharmony_ci-    case DataType::kNumberTypeBegin:
524be168c0dSopenharmony_ci-    case DataType::kNumberTypeEnd:
525be168c0dSopenharmony_ci-    case DataType::kInvalidType:
526be168c0dSopenharmony_ci-      oh_data_type = OH_NN_UNKNOWN;
527be168c0dSopenharmony_ci-      break;
528be168c0dSopenharmony_ci-    case DataType::kNumberTypeBool:
529be168c0dSopenharmony_ci-      oh_data_type = OH_NN_BOOL;
530be168c0dSopenharmony_ci-      break;
531be168c0dSopenharmony_ci-    case DataType::kNumberTypeInt8:
532be168c0dSopenharmony_ci-      oh_data_type = OH_NN_INT8;
533be168c0dSopenharmony_ci-      break;
534be168c0dSopenharmony_ci-    case DataType::kNumberTypeInt16:
535be168c0dSopenharmony_ci-      oh_data_type = OH_NN_INT16;
536be168c0dSopenharmony_ci-      break;
537be168c0dSopenharmony_ci-    case DataType::kNumberTypeInt32:
538be168c0dSopenharmony_ci-      oh_data_type = OH_NN_INT32;
539be168c0dSopenharmony_ci-      break;
540be168c0dSopenharmony_ci-    case DataType::kNumberTypeInt64:
541be168c0dSopenharmony_ci-      oh_data_type = OH_NN_INT64;
542be168c0dSopenharmony_ci-      break;
543be168c0dSopenharmony_ci-    case DataType::kNumberTypeUInt8:
544be168c0dSopenharmony_ci-      oh_data_type = OH_NN_UINT8;
545be168c0dSopenharmony_ci-      break;
546be168c0dSopenharmony_ci-    case DataType::kNumberTypeUInt16:
547be168c0dSopenharmony_ci-      oh_data_type = OH_NN_UINT16;
548be168c0dSopenharmony_ci-      break;
549be168c0dSopenharmony_ci-    case DataType::kNumberTypeUInt32:
550be168c0dSopenharmony_ci-      oh_data_type = OH_NN_UINT32;
551be168c0dSopenharmony_ci-      break;
552be168c0dSopenharmony_ci-    case DataType::kNumberTypeUInt64:
553be168c0dSopenharmony_ci-      oh_data_type = OH_NN_UINT64;
554be168c0dSopenharmony_ci-      break;
555be168c0dSopenharmony_ci-    case DataType::kNumberTypeFloat16:
556be168c0dSopenharmony_ci-      oh_data_type = OH_NN_FLOAT16;
557be168c0dSopenharmony_ci-      break;
558be168c0dSopenharmony_ci-    case DataType::kNumberTypeFloat32:
559be168c0dSopenharmony_ci-      oh_data_type = OH_NN_FLOAT32;
560be168c0dSopenharmony_ci-      break;
561be168c0dSopenharmony_ci-    case DataType::kNumberTypeFloat64:
562be168c0dSopenharmony_ci-      oh_data_type = OH_NN_FLOAT64;
563be168c0dSopenharmony_ci-      break;
564be168c0dSopenharmony_ci-    default: {
565be168c0dSopenharmony_ci-      oh_data_type = OH_NN_UNKNOWN;
566be168c0dSopenharmony_ci-    }
567be168c0dSopenharmony_ci-  }
568be168c0dSopenharmony_ci-  return oh_data_type;
569be168c0dSopenharmony_ci-}
570be168c0dSopenharmony_ci-
571be168c0dSopenharmony_ci-int mindspore::NNRTModelKernel::SetInputs() {
572be168c0dSopenharmony_ci+int NNRTModelKernel::SetInputs() {
573be168c0dSopenharmony_ci   if (!zero_copy_) {
574be168c0dSopenharmony_ci     OH_NN_ReturnCode ret{OH_NN_FAILED};
575be168c0dSopenharmony_ci     size_t nn_input_count = 0;
576be168c0dSopenharmony_ci-    ret = OH_NNExecutor_GetInputCount(oh_nn_executor, &nn_input_count);
577be168c0dSopenharmony_ci+    ret = OH_NNExecutor_GetInputCount(oh_nn_executor_, &nn_input_count);
578be168c0dSopenharmony_ci     if (ret != OH_NN_SUCCESS) {
579be168c0dSopenharmony_ci       MS_LOG(ERROR) << "OH_NNExecutor_GetInputCount failed.";
580be168c0dSopenharmony_ci       return lite::RET_ERROR;
581be168c0dSopenharmony_ci@@ -143,13 +105,13 @@ int mindspore::NNRTModelKernel::SetInputs() {
582be168c0dSopenharmony_ci       return lite::RET_ERROR;
583be168c0dSopenharmony_ci     }
584be168c0dSopenharmony_ci     for (size_t i = 0; i < nn_input_count; i++) {
585be168c0dSopenharmony_ci-      NN_TensorDesc *tensor_desc_tmp = OH_NNExecutor_CreateInputTensorDesc(oh_nn_executor, i);
586be168c0dSopenharmony_ci+      NN_TensorDesc *tensor_desc_tmp = OH_NNExecutor_CreateInputTensorDesc(oh_nn_executor_, i);
587be168c0dSopenharmony_ci       if (tensor_desc_tmp == nullptr) {
588be168c0dSopenharmony_ci         MS_LOG(ERROR) << "OH_NNExecutor_CreateInputTensorDesc failed, i = " << i;
589be168c0dSopenharmony_ci         return lite::RET_ERROR;
590be168c0dSopenharmony_ci       }
591be168c0dSopenharmony_ci       nn_input_tensor_descs_.emplace_back(tensor_desc_tmp);
592be168c0dSopenharmony_ci-      NN_Tensor *tensor_tmp = OH_NNTensor_Create(device_id_, tensor_desc_tmp);
593be168c0dSopenharmony_ci+      NN_Tensor *tensor_tmp = OH_NNTensor_Create(nnrt_device_info_.device_id_, tensor_desc_tmp);
594be168c0dSopenharmony_ci       if (tensor_tmp == nullptr) {
595be168c0dSopenharmony_ci         MS_LOG(ERROR) << "OH_NNTensor_Create input failed, i = " << i;
596be168c0dSopenharmony_ci         return lite::RET_ERROR;
597be168c0dSopenharmony_ci@@ -166,6 +128,10 @@ int mindspore::NNRTModelKernel::SetInputs() {
598be168c0dSopenharmony_ci     }
599be168c0dSopenharmony_ci   } else {
600be168c0dSopenharmony_ci     for (size_t i = 0; i < inputs_.size(); i++) {
601be168c0dSopenharmony_ci+      if (inputs_[i].allocator() == nullptr) {
602be168c0dSopenharmony_ci+        MS_LOG(ERROR) << "NNRTAllocator is nullptr, i = " << i;
603be168c0dSopenharmony_ci+        return lite::RET_ERROR;
604be168c0dSopenharmony_ci+      }
605be168c0dSopenharmony_ci       void *data = inputs_[i].MutableData();
606be168c0dSopenharmony_ci       NN_Tensor *tensor_tmp = reinterpret_cast<lite::NNRTAllocator *>(inputs_[i].allocator().get())->GetNNTensor(data);
607be168c0dSopenharmony_ci       if (tensor_tmp == nullptr) {
608be168c0dSopenharmony_ci@@ -178,11 +144,11 @@ int mindspore::NNRTModelKernel::SetInputs() {
609be168c0dSopenharmony_ci   return lite::RET_OK;
610be168c0dSopenharmony_ci }
611be168c0dSopenharmony_ci 
612be168c0dSopenharmony_ci-int mindspore::NNRTModelKernel::SetOutputs() {
613be168c0dSopenharmony_ci+int NNRTModelKernel::SetOutputs() {
614be168c0dSopenharmony_ci   if (!zero_copy_) {
615be168c0dSopenharmony_ci     OH_NN_ReturnCode ret{OH_NN_FAILED};
616be168c0dSopenharmony_ci     size_t nn_output_count = 0;
617be168c0dSopenharmony_ci-    ret = OH_NNExecutor_GetOutputCount(oh_nn_executor, &nn_output_count);
618be168c0dSopenharmony_ci+    ret = OH_NNExecutor_GetOutputCount(oh_nn_executor_, &nn_output_count);
619be168c0dSopenharmony_ci     if (ret != OH_NN_SUCCESS) {
620be168c0dSopenharmony_ci       MS_LOG(ERROR) << "OH_NNExecutor_GetOutputCount failed.";
621be168c0dSopenharmony_ci       return lite::RET_ERROR;
622be168c0dSopenharmony_ci@@ -192,13 +158,13 @@ int mindspore::NNRTModelKernel::SetOutputs() {
623be168c0dSopenharmony_ci       return lite::RET_ERROR;
624be168c0dSopenharmony_ci     }
625be168c0dSopenharmony_ci     for (size_t i = 0; i < nn_output_count; i++) {
626be168c0dSopenharmony_ci-      NN_TensorDesc *tensor_desc_tmp = OH_NNExecutor_CreateOutputTensorDesc(oh_nn_executor, i);
627be168c0dSopenharmony_ci+      NN_TensorDesc *tensor_desc_tmp = OH_NNExecutor_CreateOutputTensorDesc(oh_nn_executor_, i);
628be168c0dSopenharmony_ci       if (tensor_desc_tmp == nullptr) {
629be168c0dSopenharmony_ci         MS_LOG(ERROR) << "OH_NNExecutor_CreateOutputTensorDesc failed, i = " << i;
630be168c0dSopenharmony_ci         return lite::RET_ERROR;
631be168c0dSopenharmony_ci       }
632be168c0dSopenharmony_ci       nn_output_tensor_descs_.emplace_back(tensor_desc_tmp);
633be168c0dSopenharmony_ci-      NN_Tensor *tensor_tmp = OH_NNTensor_Create(device_id_, tensor_desc_tmp);
634be168c0dSopenharmony_ci+      NN_Tensor *tensor_tmp = OH_NNTensor_Create(nnrt_device_info_.device_id_, tensor_desc_tmp);
635be168c0dSopenharmony_ci       if (tensor_tmp == nullptr) {
636be168c0dSopenharmony_ci         MS_LOG(ERROR) << "OH_NNTensor_Create output failed, i = " << i;
637be168c0dSopenharmony_ci         return lite::RET_ERROR;
638be168c0dSopenharmony_ci@@ -210,6 +176,10 @@ int mindspore::NNRTModelKernel::SetOutputs() {
639be168c0dSopenharmony_ci     }
640be168c0dSopenharmony_ci   } else {
641be168c0dSopenharmony_ci     for (size_t i = 0; i < outputs_.size(); i++) {
642be168c0dSopenharmony_ci+      if (outputs_[i].allocator() == nullptr) {
643be168c0dSopenharmony_ci+        MS_LOG(ERROR) << "NNRTAllocator is nullptr, i = " << i;
644be168c0dSopenharmony_ci+        return lite::RET_ERROR;
645be168c0dSopenharmony_ci+      }
646be168c0dSopenharmony_ci       void *data = outputs_[i].MutableData();
647be168c0dSopenharmony_ci       NN_Tensor *tensor_tmp = reinterpret_cast<lite::NNRTAllocator *>(outputs_[i].allocator().get())->GetNNTensor(data);
648be168c0dSopenharmony_ci       if (tensor_tmp == nullptr) {
649be168c0dSopenharmony_ci@@ -222,7 +192,7 @@ int mindspore::NNRTModelKernel::SetOutputs() {
650be168c0dSopenharmony_ci   return lite::RET_OK;
651be168c0dSopenharmony_ci }
652be168c0dSopenharmony_ci 
653be168c0dSopenharmony_ci-void mindspore::NNRTModelKernel::FreeNNTensor() {
654be168c0dSopenharmony_ci+void NNRTModelKernel::FreeNNTensor() {
655be168c0dSopenharmony_ci   for (size_t i = 0; i < nn_input_tensors_.size(); i++) {
656be168c0dSopenharmony_ci     OH_NNTensor_Destroy(&nn_input_tensors_[i]);
657be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&nn_input_tensor_descs_[i]);
658be168c0dSopenharmony_ci@@ -232,3 +202,5 @@ void mindspore::NNRTModelKernel::FreeNNTensor() {
659be168c0dSopenharmony_ci     OH_NNTensorDesc_Destroy(&nn_output_tensor_descs_[i]);
660be168c0dSopenharmony_ci   }
661be168c0dSopenharmony_ci }
662be168c0dSopenharmony_ci+
663be168c0dSopenharmony_ci+}  // namespace mindspore
664be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h
665be168c0dSopenharmony_ciindex 40800a2a..7590d036 100644
666be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h
667be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_model_kernel.h
668be168c0dSopenharmony_ci@@ -22,6 +22,7 @@
669be168c0dSopenharmony_ci #include "include/api/kernel.h"
670be168c0dSopenharmony_ci #include "interfaces/kits/c/neural_network_runtime/neural_network_runtime.h"
671be168c0dSopenharmony_ci #include "src/common/log_adapter.h"
672be168c0dSopenharmony_ci+#include "src/litert/inner_context.h"
673be168c0dSopenharmony_ci #include "include/errorcode.h"
674be168c0dSopenharmony_ci 
675be168c0dSopenharmony_ci namespace mindspore {
676be168c0dSopenharmony_ci@@ -31,16 +32,12 @@ class NNRTModelKernel : public kernel::Kernel {
677be168c0dSopenharmony_ci    * Because nnr can't run single op, but the whole model. So we decide to make the whole model into one kernel.
678be168c0dSopenharmony_ci    * */
679be168c0dSopenharmony_ci  public:
680be168c0dSopenharmony_ci-  NNRTModelKernel(OH_NNExecutor *oh_nn_executor, size_t device_id, const std::vector<mindspore::MSTensor> &inputs,
681be168c0dSopenharmony_ci+  NNRTModelKernel(OH_NNExecutor *oh_nn_executor, lite::NNRtDeviceInfo nnrt_device_info, const std::vector<mindspore::MSTensor> &inputs,
682be168c0dSopenharmony_ci                   const std::vector<mindspore::MSTensor> &outputs)
683be168c0dSopenharmony_ci-      : kernel::Kernel(inputs, outputs, nullptr, nullptr), device_id_(device_id), oh_nn_executor(oh_nn_executor) {}
684be168c0dSopenharmony_ci+      : kernel::Kernel(inputs, outputs, nullptr, nullptr), oh_nn_executor_(oh_nn_executor), nnrt_device_info_(nnrt_device_info) {}
685be168c0dSopenharmony_ci   int Prepare() override;
686be168c0dSopenharmony_ci   int Execute() override;
687be168c0dSopenharmony_ci-  int ReSize() override {
688be168c0dSopenharmony_ci-    MS_LOG(ERROR) << "NNRT does not support the resize function temporarily.";
689be168c0dSopenharmony_ci-    return lite::RET_ERROR;
690be168c0dSopenharmony_ci-  };
691be168c0dSopenharmony_ci-  OH_NN_DataType ConvertDataType(mindspore::DataType data_type);
692be168c0dSopenharmony_ci+  int ReSize() override;
693be168c0dSopenharmony_ci   int SetInputs();
694be168c0dSopenharmony_ci   int SetOutputs();
695be168c0dSopenharmony_ci   void FreeNNTensor();
696be168c0dSopenharmony_ci@@ -52,8 +49,8 @@ class NNRTModelKernel : public kernel::Kernel {
697be168c0dSopenharmony_ci   }
698be168c0dSopenharmony_ci 
699be168c0dSopenharmony_ci  protected:
700be168c0dSopenharmony_ci-  size_t device_id_;
701be168c0dSopenharmony_ci-  OH_NNExecutor *oh_nn_executor = nullptr;
702be168c0dSopenharmony_ci+  OH_NNExecutor *oh_nn_executor_ = nullptr;
703be168c0dSopenharmony_ci+  lite::NNRtDeviceInfo nnrt_device_info_;
704be168c0dSopenharmony_ci   std::vector<NN_Tensor *> nn_input_tensors_;
705be168c0dSopenharmony_ci   std::vector<NN_TensorDesc *> nn_input_tensor_descs_;
706be168c0dSopenharmony_ci   std::vector<NN_Tensor *> nn_output_tensors_;
707be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.cc b/mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.cc
708be168c0dSopenharmony_cinew file mode 100644
709be168c0dSopenharmony_ciindex 00000000..049857bb
710be168c0dSopenharmony_ci--- /dev/null
711be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.cc
712be168c0dSopenharmony_ci@@ -0,0 +1,110 @@
713be168c0dSopenharmony_ci+/**
714be168c0dSopenharmony_ci+ * Copyright 2024 Huawei Technologies Co., Ltd
715be168c0dSopenharmony_ci+ *
716be168c0dSopenharmony_ci+ * Licensed under the Apache License, Version 2.0 (the "License");
717be168c0dSopenharmony_ci+ * you may not use this file except in compliance with the License.
718be168c0dSopenharmony_ci+ * You may obtain a copy of the License at
719be168c0dSopenharmony_ci+ *
720be168c0dSopenharmony_ci+ * http://www.apache.org/licenses/LICENSE-2.0
721be168c0dSopenharmony_ci+ *
722be168c0dSopenharmony_ci+ * Unless required by applicable law or agreed to in writing, software
723be168c0dSopenharmony_ci+ * distributed under the License is distributed on an "AS IS" BASIS,
724be168c0dSopenharmony_ci+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
725be168c0dSopenharmony_ci+ * See the License for the specific language governing permissions and
726be168c0dSopenharmony_ci+ * limitations under the License.
727be168c0dSopenharmony_ci+ */
728be168c0dSopenharmony_ci+
729be168c0dSopenharmony_ci+#include "src/litert/delegate/nnrt/nnrt_utils.h"
730be168c0dSopenharmony_ci+#include <unordered_map>
731be168c0dSopenharmony_ci+
732be168c0dSopenharmony_ci+namespace mindspore::lite {
733be168c0dSopenharmony_ci+OH_NN_Format CastToNNRtFormat(Format format) {
734be168c0dSopenharmony_ci+  const std::unordered_map<Format, OH_NN_Format> kFormatMap = {
735be168c0dSopenharmony_ci+    {Format::NCHW, OH_NN_FORMAT_NCHW},
736be168c0dSopenharmony_ci+    {Format::NHWC, OH_NN_FORMAT_NHWC},
737be168c0dSopenharmony_ci+  };
738be168c0dSopenharmony_ci+  auto iter = kFormatMap.find(format);
739be168c0dSopenharmony_ci+  if (iter == kFormatMap.end()) {
740be168c0dSopenharmony_ci+    return OH_NN_FORMAT_NONE;
741be168c0dSopenharmony_ci+  }
742be168c0dSopenharmony_ci+  return iter->second;
743be168c0dSopenharmony_ci+}
744be168c0dSopenharmony_ci+
745be168c0dSopenharmony_ci+OH_NN_DataType CastToNNRtDataType(TypeId data_type) {
746be168c0dSopenharmony_ci+  OH_NN_DataType oh_data_type;
747be168c0dSopenharmony_ci+  switch (data_type) {
748be168c0dSopenharmony_ci+    case TypeId::kMetaTypeBegin:
749be168c0dSopenharmony_ci+    case TypeId::kMetaTypeType:
750be168c0dSopenharmony_ci+    case TypeId::kMetaTypeAny:
751be168c0dSopenharmony_ci+    case TypeId::kMetaTypeObject:
752be168c0dSopenharmony_ci+    case TypeId::kMetaTypeTypeType:
753be168c0dSopenharmony_ci+    case TypeId::kMetaTypeProblem:
754be168c0dSopenharmony_ci+    case TypeId::kMetaTypeExternal:
755be168c0dSopenharmony_ci+    case TypeId::kMetaTypeNone:
756be168c0dSopenharmony_ci+    case TypeId::kMetaTypeNull:
757be168c0dSopenharmony_ci+    case TypeId::kMetaTypeEllipsis:
758be168c0dSopenharmony_ci+    case TypeId::kMetaTypeEnd:
759be168c0dSopenharmony_ci+    case TypeId::kObjectTypeNumber:
760be168c0dSopenharmony_ci+    case TypeId::kObjectTypeString:
761be168c0dSopenharmony_ci+    case TypeId::kObjectTypeList:
762be168c0dSopenharmony_ci+    case TypeId::kObjectTypeTuple:
763be168c0dSopenharmony_ci+    case TypeId::kObjectTypeSlice:
764be168c0dSopenharmony_ci+    case TypeId::kObjectTypeKeyword:
765be168c0dSopenharmony_ci+    case TypeId::kObjectTypeTensorType:
766be168c0dSopenharmony_ci+    case TypeId::kObjectTypeRowTensorType:
767be168c0dSopenharmony_ci+    case TypeId::kObjectTypeCOOTensorType:
768be168c0dSopenharmony_ci+    case TypeId::kObjectTypeUndeterminedType:
769be168c0dSopenharmony_ci+    case TypeId::kObjectTypeClass:
770be168c0dSopenharmony_ci+    case TypeId::kObjectTypeDictionary:
771be168c0dSopenharmony_ci+    case TypeId::kObjectTypeFunction:
772be168c0dSopenharmony_ci+    case TypeId::kObjectTypeJTagged:
773be168c0dSopenharmony_ci+    case TypeId::kObjectTypeSymbolicKeyType:
774be168c0dSopenharmony_ci+    case TypeId::kObjectTypeEnvType:
775be168c0dSopenharmony_ci+    case TypeId::kObjectTypeRefKey:
776be168c0dSopenharmony_ci+    case TypeId::kObjectTypeRef:
777be168c0dSopenharmony_ci+    case TypeId::kObjectTypeEnd:
778be168c0dSopenharmony_ci+      oh_data_type = OH_NN_UNKNOWN;
779be168c0dSopenharmony_ci+      break;
780be168c0dSopenharmony_ci+    case TypeId::kNumberTypeBool:
781be168c0dSopenharmony_ci+      oh_data_type = OH_NN_BOOL;
782be168c0dSopenharmony_ci+      break;
783be168c0dSopenharmony_ci+    case TypeId::kNumberTypeInt8:
784be168c0dSopenharmony_ci+      oh_data_type = OH_NN_INT8;
785be168c0dSopenharmony_ci+      break;
786be168c0dSopenharmony_ci+    case TypeId::kNumberTypeInt16:
787be168c0dSopenharmony_ci+      oh_data_type = OH_NN_INT16;
788be168c0dSopenharmony_ci+      break;
789be168c0dSopenharmony_ci+    case TypeId::kNumberTypeInt32:
790be168c0dSopenharmony_ci+      oh_data_type = OH_NN_INT32;
791be168c0dSopenharmony_ci+      break;
792be168c0dSopenharmony_ci+    case TypeId::kNumberTypeInt64:
793be168c0dSopenharmony_ci+      oh_data_type = OH_NN_INT64;
794be168c0dSopenharmony_ci+      break;
795be168c0dSopenharmony_ci+    case TypeId::kNumberTypeUInt8:
796be168c0dSopenharmony_ci+      oh_data_type = OH_NN_UINT8;
797be168c0dSopenharmony_ci+      break;
798be168c0dSopenharmony_ci+    case TypeId::kNumberTypeUInt16:
799be168c0dSopenharmony_ci+      oh_data_type = OH_NN_UINT16;
800be168c0dSopenharmony_ci+      break;
801be168c0dSopenharmony_ci+    case TypeId::kNumberTypeUInt32:
802be168c0dSopenharmony_ci+      oh_data_type = OH_NN_UINT32;
803be168c0dSopenharmony_ci+      break;
804be168c0dSopenharmony_ci+    case TypeId::kNumberTypeUInt64:
805be168c0dSopenharmony_ci+      oh_data_type = OH_NN_UINT64;
806be168c0dSopenharmony_ci+      break;
807be168c0dSopenharmony_ci+    case TypeId::kNumberTypeFloat16:
808be168c0dSopenharmony_ci+      oh_data_type = OH_NN_FLOAT16;
809be168c0dSopenharmony_ci+      break;
810be168c0dSopenharmony_ci+    case TypeId::kNumberTypeFloat32:
811be168c0dSopenharmony_ci+      oh_data_type = OH_NN_FLOAT32;
812be168c0dSopenharmony_ci+      break;
813be168c0dSopenharmony_ci+    case TypeId::kNumberTypeFloat64:
814be168c0dSopenharmony_ci+      oh_data_type = OH_NN_FLOAT64;
815be168c0dSopenharmony_ci+      break;
816be168c0dSopenharmony_ci+    default: {
817be168c0dSopenharmony_ci+      oh_data_type = OH_NN_UNKNOWN;
818be168c0dSopenharmony_ci+    }
819be168c0dSopenharmony_ci+  }
820be168c0dSopenharmony_ci+  return oh_data_type;
821be168c0dSopenharmony_ci+}
822be168c0dSopenharmony_ci+}  // namespace mindspore::lite
823be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.h b/mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.h
824be168c0dSopenharmony_cinew file mode 100644
825be168c0dSopenharmony_ciindex 00000000..f8055686
826be168c0dSopenharmony_ci--- /dev/null
827be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/delegate/nnrt/nnrt_utils.h
828be168c0dSopenharmony_ci@@ -0,0 +1,29 @@
829be168c0dSopenharmony_ci+/**
830be168c0dSopenharmony_ci+ * Copyright 2024 Huawei Technologies Co., Ltd
831be168c0dSopenharmony_ci+ *
832be168c0dSopenharmony_ci+ * Licensed under the Apache License, Version 2.0 (the "License");
833be168c0dSopenharmony_ci+ * you may not use this file except in compliance with the License.
834be168c0dSopenharmony_ci+ * You may obtain a copy of the License at
835be168c0dSopenharmony_ci+ *
836be168c0dSopenharmony_ci+ * http://www.apache.org/licenses/LICENSE-2.0
837be168c0dSopenharmony_ci+ *
838be168c0dSopenharmony_ci+ * Unless required by applicable law or agreed to in writing, software
839be168c0dSopenharmony_ci+ * distributed under the License is distributed on an "AS IS" BASIS,
840be168c0dSopenharmony_ci+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
841be168c0dSopenharmony_ci+ * See the License for the specific language governing permissions and
842be168c0dSopenharmony_ci+ * limitations under the License.
843be168c0dSopenharmony_ci+ */
844be168c0dSopenharmony_ci+
845be168c0dSopenharmony_ci+#ifndef MINDSPORE_LITE_SRC_RUNTIME_DELEGATE_NNRT_UTILS_H
846be168c0dSopenharmony_ci+#define MINDSPORE_LITE_SRC_RUNTIME_DELEGATE_NNRT_UTILS_H
847be168c0dSopenharmony_ci+
848be168c0dSopenharmony_ci+#include "include/api/format.h"
849be168c0dSopenharmony_ci+#include "ir/dtype/type_id.h"
850be168c0dSopenharmony_ci+#include "interfaces/kits/c/neural_network_runtime/neural_network_runtime.h"
851be168c0dSopenharmony_ci+
852be168c0dSopenharmony_ci+namespace mindspore::lite {
853be168c0dSopenharmony_ci+OH_NN_Format CastToNNRtFormat(Format format);
854be168c0dSopenharmony_ci+OH_NN_DataType CastToNNRtDataType(TypeId data_type);
855be168c0dSopenharmony_ci+}  // namespace mindspore::lite
856be168c0dSopenharmony_ci+
857be168c0dSopenharmony_ci+#endif  // MINDSPORE_LITE_SRC_RUNTIME_DELEGATE_NNRT_UTILS_H
858be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/litert/infer_manager.cc b/mindspore/lite/src/litert/infer_manager.cc
859be168c0dSopenharmony_ciindex 908ab122..3a5f8832 100644
860be168c0dSopenharmony_ci--- a/mindspore/lite/src/litert/infer_manager.cc
861be168c0dSopenharmony_ci+++ b/mindspore/lite/src/litert/infer_manager.cc
862be168c0dSopenharmony_ci@@ -208,7 +208,10 @@ int KernelInferShape(const std::vector<lite::Tensor *> &inputs, const std::vecto
863be168c0dSopenharmony_ci         return tensor_ret;
864be168c0dSopenharmony_ci       }
865be168c0dSopenharmony_ci     } else {
866be168c0dSopenharmony_ci-      if (out_tensors.at(i)->data_ != nullptr) {
867be168c0dSopenharmony_ci+      // During the online phase of shape operator fusion, the output data is computed in advance during the infer shape
868be168c0dSopenharmony_ci+      // stage. Therefore, the output data is not nullptr and is constant.
869be168c0dSopenharmony_ci+      if (parameter->type_ == static_cast<int>(PrimType::PrimType_Inner_ShapeFusion) &&
870be168c0dSopenharmony_ci+          out_tensors.at(i)->data_ != nullptr) {
871be168c0dSopenharmony_ci         outputs.at(i)->set_own_data(true);
872be168c0dSopenharmony_ci         outputs.at(i)->set_category(CONST_TENSOR);
873be168c0dSopenharmony_ci       }
874be168c0dSopenharmony_cidiff --git a/mindspore/lite/src/tensor.cc b/mindspore/lite/src/tensor.cc
875be168c0dSopenharmony_ciindex a7bb1899..9d9a1491 100644
876be168c0dSopenharmony_ci--- a/mindspore/lite/src/tensor.cc
877be168c0dSopenharmony_ci+++ b/mindspore/lite/src/tensor.cc
878be168c0dSopenharmony_ci@@ -18,6 +18,9 @@
879be168c0dSopenharmony_ci #include <vector>
880be168c0dSopenharmony_ci #include <string>
881be168c0dSopenharmony_ci #include <utility>
882be168c0dSopenharmony_ci+#ifdef SUPPORT_NNRT
883be168c0dSopenharmony_ci+#include "src/litert/delegate/nnrt/nnrt_allocator.h"
884be168c0dSopenharmony_ci+#endif
885be168c0dSopenharmony_ci #include "schema/ops_types_generated.h"
886be168c0dSopenharmony_ci #include "securec/include/securec.h"
887be168c0dSopenharmony_ci #include "include/errorcode.h"
888be168c0dSopenharmony_ci@@ -427,7 +430,18 @@ int Tensor::MallocData(const AllocatorPtr allocator) {
889be168c0dSopenharmony_ci   if (allocator_ == nullptr) {
890be168c0dSopenharmony_ci     this->tensor_c_.data_ = malloc(data_size);
891be168c0dSopenharmony_ci   } else {
892be168c0dSopenharmony_ci-    this->tensor_c_.data_ = allocator_->Malloc(data_size);
893be168c0dSopenharmony_ci+#ifdef SUPPORT_NNRT
894be168c0dSopenharmony_ci+    if (IS_NNRT_ALLOCATOR(allocator_)) {
895be168c0dSopenharmony_ci+      this->tensor_c_.data_ = dynamic_cast<NNRTAllocator *>(allocator_.get())->MallocByDesc(data_size, this->shape(),
896be168c0dSopenharmony_ci+                                                                                            this->data_type(),
897be168c0dSopenharmony_ci+                                                                                            this->format(),
898be168c0dSopenharmony_ci+                                                                                            this->tensor_name());
899be168c0dSopenharmony_ci+    } else {
900be168c0dSopenharmony_ci+#endif
901be168c0dSopenharmony_ci+      this->tensor_c_.data_ = allocator_->Malloc(data_size);
902be168c0dSopenharmony_ci+#ifdef SUPPORT_NNRT
903be168c0dSopenharmony_ci+    }
904be168c0dSopenharmony_ci+#endif
905be168c0dSopenharmony_ci     allocator_->SetRefCount(this->tensor_c_.data_, 1);
906be168c0dSopenharmony_ci   }
907be168c0dSopenharmony_ci   if (this->tensor_c_.data_ == nullptr) {
908be168c0dSopenharmony_ci-- 
909be168c0dSopenharmony_ci2.17.1
910be168c0dSopenharmony_ci
911