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]]; | ||
|  | } |