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, ¶m->cache_path_); 180be168c0dSopenharmony_ci DoParseCacheVersion(extensions, ¶m->cache_version_); 181be168c0dSopenharmony_ci DoParseBondMode(extensions, ¶m->band_mode); 182be168c0dSopenharmony_ci- DoParseQuantConfig(extensions, ¶m->quant_config, ¶m->quant_config_size); 183be168c0dSopenharmony_ci+ DoParseQuantConfig(extensions, ¶m->quant_config, ¶m->quant_config_size, ¶m->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