109 lines
3.8 KiB
C++
109 lines
3.8 KiB
C++
/*
|
|
* Copyright (c) 2020.Huawei Technologies Co., Ltd. All rights reserved.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "ResourceManager.h"
|
|
#include <algorithm>
|
|
|
|
std::shared_ptr<ResourceManager> ResourceManager::ptr_ = nullptr;
|
|
|
|
void ResourceManager::Release()
|
|
{
|
|
APP_ERROR ret;
|
|
for (size_t i = 0; i < deviceIds_.size(); i++) {
|
|
if (contexts_[i] != nullptr) {
|
|
ret = aclrtDestroyContext(contexts_[i]); // Destroy context
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to destroy context, ret = " << ret << ".";
|
|
return;
|
|
}
|
|
contexts_[i] = nullptr;
|
|
}
|
|
ret = aclrtResetDevice(deviceIds_[i]); // Reset device
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to reset device, ret = " << ret << ".";
|
|
return;
|
|
}
|
|
}
|
|
ret = aclFinalize();
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to finalize acl, ret = " << ret << ".";
|
|
return;
|
|
}
|
|
LogInfo << "Finalized acl successfully.";
|
|
}
|
|
|
|
std::shared_ptr<ResourceManager> ResourceManager::GetInstance()
|
|
{
|
|
if (ptr_ == nullptr) {
|
|
ptr_.reset(new ResourceManager());
|
|
}
|
|
return ptr_;
|
|
}
|
|
|
|
APP_ERROR ResourceManager::InitResource(ResourceInfo& resourceInfo)
|
|
{
|
|
std::string& aclConfigPath = resourceInfo.aclConfigPath;
|
|
APP_ERROR ret;
|
|
if (aclConfigPath.length() == 0) {
|
|
// Init acl without aclconfig
|
|
ret = aclInit(nullptr);
|
|
} else {
|
|
ret = ExistFile(aclConfigPath);
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Acl config file not exist, ret = " << ret << ".";
|
|
return ret;
|
|
}
|
|
ret = aclInit(aclConfigPath.c_str()); // Initialize ACL
|
|
}
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to init acl, ret = " << ret;
|
|
return ret;
|
|
}
|
|
std::copy(resourceInfo.deviceIds.begin(), resourceInfo.deviceIds.end(), std::back_inserter(deviceIds_));
|
|
LogInfo << "Initialized acl successfully.";
|
|
// Open device and create context for each chip, note: it create one context for each chip
|
|
for (size_t i = 0; i < deviceIds_.size(); i++) {
|
|
deviceIdMap_[deviceIds_[i]] = i;
|
|
ret = aclrtSetDevice(deviceIds_[i]);
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to open acl device: " << deviceIds_[i];
|
|
return ret;
|
|
}
|
|
LogInfo << "Open device " << deviceIds_[i]<< " successfully.";
|
|
aclrtContext context;
|
|
ret = aclrtCreateContext(&context, deviceIds_[i]);
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to create acl context, ret = " << ret << ".";
|
|
return ret;
|
|
}
|
|
LogInfo << "Created context for device " << deviceIds_[i] << " successfully";
|
|
contexts_.push_back(context);
|
|
}
|
|
std::string singleOpPath = resourceInfo.singleOpFolderPath;
|
|
if (!singleOpPath.empty()) {
|
|
ret = aclopSetModelDir(singleOpPath.c_str()); // Set operator model directory for application
|
|
if (ret != APP_ERR_OK) {
|
|
LogError << "Failed to aclopSetModelDir, ret = " << ret << ".";
|
|
return ret;
|
|
}
|
|
}
|
|
LogInfo << "Init resource successfully.";
|
|
return APP_ERR_OK;
|
|
}
|
|
|
|
aclrtContext ResourceManager::GetContext(int deviceId)
|
|
{
|
|
return contexts_[deviceIdMap_[deviceId]];
|
|
} |