Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #include "ae_kernel_lib_manager.hpp"
12 :
13 : #include <vector>
14 : #include <string>
15 : #include "ae_kernel_lib_fwk.hpp"
16 : #include "ae_kernel_lib_aicpu.hpp"
17 : #include "ae_kernel_lib_aicpu_kfc.h"
18 : #include "ae_def.hpp"
19 :
20 : namespace cce {
21 : /*
22 : * A inner function, the caller should make sure "kernelLib" is not null.
23 : * Get a AIKernelLIb specialised by kernelType
24 : */
25 129 : aeStatus_t AIKernelsLibManger::GetKernelLib(const aicpu::KernelType kernelType, AIKernelsLibBase *&kernelLib)
26 : {
27 129 : switch (kernelType) {
28 3 : case aicpu::KERNEL_TYPE_FWK:
29 3 : kernelLib = AIKernelsLibFWK::GetInstance();
30 3 : break;
31 123 : case aicpu::KERNEL_TYPE_AICPU:
32 : case aicpu::KERNEL_TYPE_AICPU_CUSTOM:
33 123 : kernelLib = AIKernelsLibAiCpu::GetInstance();
34 123 : break;
35 1 : case aicpu::KERNEL_TYPE_AICPU_KFC:
36 : case aicpu::KERNEL_TYPE_AICPU_CUSTOM_KFC:
37 1 : kernelLib = AIKernelsLibAiCpuKFC::GetInstance();
38 1 : break;
39 2 : default:
40 2 : AE_ERR_LOG(AE_MODULE_ID, "Input param kernelType is invalid :%d", kernelType);
41 2 : break;
42 : }
43 :
44 129 : if (kernelLib == nullptr) {
45 2 : AE_ERR_LOG(AE_MODULE_ID, "Get kernelLib is NULL, kernel type=%d", kernelType);
46 2 : return AE_STATUS_BAD_PARAM;
47 : }
48 127 : return AE_STATUS_SUCCESS;
49 : }
50 :
51 : /**
52 : * Clear a AIKernelLIb in manager specialised by kernelType
53 : */
54 25 : void AIKernelsLibManger::ClearKernelLib(const aicpu::KernelType kernelType)
55 : {
56 25 : switch (kernelType) {
57 2 : case aicpu::KERNEL_TYPE_FWK:
58 2 : AIKernelsLibFWK::DestroyInstance();
59 2 : break;
60 4 : case aicpu::KERNEL_TYPE_AICPU:
61 : case aicpu::KERNEL_TYPE_AICPU_CUSTOM:
62 4 : AIKernelsLibAiCpu::DestroyInstance();
63 4 : break;
64 5 : case aicpu::KERNEL_TYPE_AICPU_KFC:
65 : case aicpu::KERNEL_TYPE_AICPU_CUSTOM_KFC:
66 5 : AIKernelsLibAiCpuKFC::DestroyInstance();
67 5 : break;
68 14 : default:
69 14 : break;
70 : }
71 25 : }
72 :
73 6 : aeStatus_t AIKernelsLibManger::BatchLoadKernelSo(const aicpu::KernelType kernelType,
74 : const uint32_t loadSoNum,
75 : const char_t * const * const soNames)
76 : {
77 6 : AE_INFO_LOG(AE_MODULE_ID, "Start to batch load kernel so. kernelType=%d, loadSoNum=%u.", kernelType, loadSoNum);
78 6 : if (loadSoNum == 0U) {
79 0 : return AE_STATUS_SUCCESS;
80 : }
81 : // pair first is so name, second is so path
82 6 : std::vector<std::string> aicpuSoVec;
83 6 : std::vector<std::string> tfSoVec;
84 16 : for (uint32_t index = 0U; index < loadSoNum; index++) {
85 10 : if (soNames[index] == nullptr) {
86 0 : AE_WARN_LOG(AE_MODULE_ID, "soName is null.");
87 0 : continue;
88 : }
89 10 : std::string soName(soNames[index]);
90 10 : if (soName == "libtf_kernels.so") {
91 3 : tfSoVec.emplace_back(soName);
92 : } else {
93 7 : aicpuSoVec.push_back(soName);
94 : }
95 10 : }
96 :
97 6 : if (!tfSoVec.empty()) {
98 3 : if (AIKernelsLibFWK::GetInstance()->BatchLoadKernelSo(kernelType, tfSoVec) != AE_STATUS_SUCCESS) {
99 3 : AE_WARN_LOG(AE_MODULE_ID, "batch load kernel so failed.");
100 : }
101 : }
102 6 : if (!aicpuSoVec.empty()) {
103 5 : if (AIKernelsLibAiCpu::GetInstance()->BatchLoadKernelSo(kernelType, aicpuSoVec) != AE_STATUS_SUCCESS) {
104 0 : AE_WARN_LOG(AE_MODULE_ID, "batch load kernel so failed.");
105 : }
106 : }
107 6 : AE_INFO_LOG(AE_MODULE_ID, "Finish to batch load kernel so. loadSoNum=%u.", loadSoNum);
108 6 : return AE_STATUS_SUCCESS;
109 6 : }
110 :
111 2 : aeStatus_t AIKernelsLibManger::AddSoInWhiteList(const char_t * const soName)
112 : {
113 2 : AIKernelsLibAiCpu *aicpuKernel = AIKernelsLibAiCpu::GetInstance();
114 2 : if (aicpuKernel == nullptr) {
115 0 : AE_ERR_LOG(AE_MODULE_ID, "Get kernelLib is NULL");
116 0 : return AE_STATUS_INNER_ERROR;
117 : }
118 2 : const std::string soNameStr(soName);
119 2 : AE_INFO_LOG(AE_MODULE_ID, "begin add so:%s", soNameStr.c_str());
120 2 : return aicpuKernel->AddSoInWhiteList(soNameStr);
121 2 : }
122 :
123 2 : void AIKernelsLibManger::DelteSoInWhiteList(const char_t * const soName)
124 : {
125 2 : AIKernelsLibAiCpu *aicpuKernel = AIKernelsLibAiCpu::GetInstance();
126 2 : if (aicpuKernel == nullptr) {
127 0 : AE_ERR_LOG(AE_MODULE_ID, "Get kernelLib is NULL");
128 0 : return;
129 : }
130 2 : const std::string soNameStr(soName);
131 2 : AE_INFO_LOG(AE_MODULE_ID, "begin delete so:%s", soNameStr.c_str());
132 2 : aicpuKernel->DeleteSoInWhiteList(soNameStr);
133 2 : }
134 : }
|