From 6a03745bdb93b778a4a273d7a35a9323b51ccb4f Mon Sep 17 00:00:00 2001 From: w30052974 Date: Fri, 26 Apr 2024 09:55:11 +0800 Subject: [PATCH 1/3] allocate memory bugfix Signed-off-by: w30052974 --- .../hdi_prepared_model_v2_0.cpp | 12 +++++ .../hdi_prepared_model_v2_0.h | 2 + .../neural_network_runtime/nntensor.cpp | 54 +++++++++---------- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.cpp b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.cpp index adca2bf..b3b535b 100644 --- a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.cpp +++ b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.cpp @@ -166,6 +166,17 @@ HDIPreparedModelV2_0::HDIPreparedModelV2_0(OHOS::sptr hdiP hdiPreparedModel->GetVersion(m_hdiVersion.first, m_hdiVersion.second); } +HDIPreparedModelV2_0::~HDIPreparedModelV2_0() +{ + for (auto addr : m_addrs) { + auto memManager = MemoryManager::GetInstance(); + OH_NN_ReturnCode ret = memManager->UnMapMemory(addr); + if (ret != OH_NN_SUCCESS) { + LOGE("~HDIPreparedModelV2_0 UnMapMemory failed."); + } + } +} + OH_NN_ReturnCode HDIPreparedModelV2_0::ExportModelCache(std::vector& modelCache) { if (!modelCache.empty()) { @@ -187,6 +198,7 @@ OH_NN_ReturnCode HDIPreparedModelV2_0::ExportModelCache(std::vector& mod LOGE("Export the %{public}zuth model cache failed, cannot not map fd to address.", i + 1); return OH_NN_MEMORY_ERROR; } + m_addrs.emplace_back(addr); Buffer modelbuffer {addr, iBuffers[i].bufferSize}; modelCache.emplace_back(modelbuffer); } diff --git a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h index 7f3defd..a0d23d5 100644 --- a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h +++ b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h @@ -34,6 +34,7 @@ namespace NeuralNetworkRuntime { class HDIPreparedModelV2_0 : public PreparedModel { public: explicit HDIPreparedModelV2_0(OHOS::sptr hdiPreparedModel); + ~HDIPreparedModelV2_0(); OH_NN_ReturnCode ExportModelCache(std::vector& modelCache) override; @@ -54,6 +55,7 @@ private: // first: major version, second: minor version std::pair m_hdiVersion; OHOS::sptr m_hdiPreparedModel {nullptr}; + std::vector m_addrs; }; } // namespace NeuralNetworkRuntime } // OHOS diff --git a/frameworks/native/neural_network_runtime/nntensor.cpp b/frameworks/native/neural_network_runtime/nntensor.cpp index 477bdf6..d234227 100644 --- a/frameworks/native/neural_network_runtime/nntensor.cpp +++ b/frameworks/native/neural_network_runtime/nntensor.cpp @@ -26,9 +26,7 @@ namespace OHOS { namespace NeuralNetworkRuntime { NNTensor2_0::~NNTensor2_0() { - if (!m_isUserData) { - ReleaseMemory(); - } + ReleaseMemory(); delete m_tensorDesc; m_tensorDesc = nullptr; @@ -247,37 +245,39 @@ OH_NN_ReturnCode NNTensor2_0::ReleaseMemory() return OH_NN_INVALID_PARAMETER; } - BackendManager& backendManager = BackendManager::GetInstance(); - std::shared_ptr backend = backendManager.GetBackend(m_backendID); - if (backend == nullptr) { - LOGE("NNTensor2_0::ReleaseMemory failed, failed to get backend of %{public}zu.", m_backendID); - return OH_NN_NULL_PTR; - } - - auto* nnrtBackend = reinterpret_cast(backend.get()); - auto device = nnrtBackend->GetDevice(); - if (device == nullptr) { - LOGE(""); - return OH_NN_NULL_PTR; - } - auto oldRet = device->ReleaseBuffer(m_fd, m_size); - if (oldRet != OH_NN_SUCCESS) { - LOGE("NNTensor2_0::ReleaseMemory failed, failed to release buffer."); - return OH_NN_MEMORY_ERROR; - } - auto unmapResult = munmap(m_data, m_size); if (unmapResult != 0) { LOGE("NNTensor2_0::ReleaseMemory failed. Please try again."); return OH_NN_MEMORY_ERROR; + } + + if (!m_isUserData) { + if (close(m_fd) != 0) { + LOGE("NNTensor2_0::ReleaseMemory failed. fd=%{public}d", m_fd); + return OH_NN_MEMORY_ERROR; + } + BackendManager& backendManager = BackendManager::GetInstance(); + std::shared_ptr backend = backendManager.GetBackend(m_backendID); + if (backend == nullptr) { + LOGE("NNTensor2_0::ReleaseMemory failed, failed to get backend of %{public}zu.", m_backendID); + return OH_NN_NULL_PTR; + } + + auto* nnrtBackend = reinterpret_cast(backend.get()); + auto device = nnrtBackend->GetDevice(); + if (device == nullptr) { + LOGE(""); + return OH_NN_NULL_PTR; + } + auto oldRet = device->ReleaseBuffer(m_fd, m_size); + if (oldRet != OH_NN_SUCCESS) { + LOGE("NNTensor2_0::ReleaseMemory failed, failed to release buffer."); + return OH_NN_MEMORY_ERROR; + } } + m_data = nullptr; m_size = 0; - - if (close(m_fd) != 0) { - LOGE("NNTensor2_0::ReleaseMemory failed. fd=%{public}d", m_fd); - return OH_NN_MEMORY_ERROR; - } m_fd = 0; return OH_NN_SUCCESS; -- Gitee From 1caf3fee03bb4b92405dba7ba040197d24bbdeb9 Mon Sep 17 00:00:00 2001 From: w30052974 Date: Fri, 26 Apr 2024 14:14:26 +0800 Subject: [PATCH 2/3] allocate memory bugfix Signed-off-by: w30052974 --- .../native/neural_network_runtime/hdi_prepared_model_v2_0.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h index a0d23d5..a60d0da 100644 --- a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h +++ b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h @@ -34,7 +34,7 @@ namespace NeuralNetworkRuntime { class HDIPreparedModelV2_0 : public PreparedModel { public: explicit HDIPreparedModelV2_0(OHOS::sptr hdiPreparedModel); - ~HDIPreparedModelV2_0(); + ~HDIPreparedModelV2_0() final; OH_NN_ReturnCode ExportModelCache(std::vector& modelCache) override; -- Gitee From 9af4a827d945bec2df9587f2faa4847b28b84942 Mon Sep 17 00:00:00 2001 From: w30052974 Date: Fri, 26 Apr 2024 15:07:04 +0800 Subject: [PATCH 3/3] allocate memory bugfix Signed-off-by: w30052974 --- .../native/neural_network_runtime/hdi_prepared_model_v2_0.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h index a60d0da..cbbb9b9 100644 --- a/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h +++ b/frameworks/native/neural_network_runtime/hdi_prepared_model_v2_0.h @@ -34,7 +34,7 @@ namespace NeuralNetworkRuntime { class HDIPreparedModelV2_0 : public PreparedModel { public: explicit HDIPreparedModelV2_0(OHOS::sptr hdiPreparedModel); - ~HDIPreparedModelV2_0() final; + ~HDIPreparedModelV2_0() override; OH_NN_ReturnCode ExportModelCache(std::vector& modelCache) override; -- Gitee