1 /**
2 * Copyright 2021 Huawei Technologies Co., Ltd
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "src/cxx_api/converters.h"
17 #include "src/common/log_adapter.h"
18 #include "nnacl/op_base.h"
19
20 namespace mindspore {
21 constexpr static int kMaxNumOfDevices = 3;
22
SetContextAttr(int32_t thread_num,bool enable_parallel,const std::vector<int32_t> & affinity_core_list,const std::shared_ptr<Delegate> & delegate,lite::InnerContext * inner_context)23 void ContextUtils::SetContextAttr(int32_t thread_num, bool enable_parallel,
24 const std::vector<int32_t> &affinity_core_list,
25 const std::shared_ptr<Delegate> &delegate, lite::InnerContext *inner_context) {
26 inner_context->thread_num_ = thread_num;
27 inner_context->enable_parallel_ = enable_parallel;
28 inner_context->affinity_core_list_ = affinity_core_list;
29 inner_context->delegate = delegate;
30 }
31
AddCpuDevice(const std::shared_ptr<Allocator> & allocator,int affinity_mode,bool enable_fp16,const std::string & provider,const std::string & provider_device,lite::InnerContext * inner_context)32 Status ContextUtils::AddCpuDevice(const std::shared_ptr<Allocator> &allocator, int affinity_mode, bool enable_fp16,
33 const std::string &provider, const std::string &provider_device,
34 lite::InnerContext *inner_context) {
35 inner_context->allocator = allocator;
36 if (!IsAffinityModeValid(affinity_mode)) {
37 MS_LOG(ERROR) << "Invalid affinity mode, only supports 0:no affinities, 1:big cores first, 2:little cores first.";
38 return kLiteInputParamInvalid;
39 }
40 lite::DeviceInfo device_info = {0};
41 device_info.cpu_device_info_ = {enable_fp16, static_cast<lite::CpuBindMode>(affinity_mode)};
42 inner_context->device_list_.push_back({lite::DT_CPU, device_info, provider, provider_device, allocator});
43 return kSuccess;
44 }
45
AddGpuDevice(bool enable_fp16,uint32_t device_id,const std::string & provider,const std::string & provider_device,const std::shared_ptr<Allocator> & allocator,lite::InnerContext * inner_context)46 Status ContextUtils::AddGpuDevice(bool enable_fp16, uint32_t device_id, const std::string &provider,
47 const std::string &provider_device, const std::shared_ptr<Allocator> &allocator,
48 lite::InnerContext *inner_context) {
49 lite::DeviceInfo device_info = {0};
50 device_info.gpu_device_info_ = {enable_fp16, device_id};
51 inner_context->device_list_.push_back({lite::DT_GPU, device_info, provider, provider_device, allocator});
52 return kSuccess;
53 }
54
AddNpuDevice(int frequency,lite::InnerContext * inner_context)55 Status ContextUtils::AddNpuDevice(int frequency, lite::InnerContext *inner_context) {
56 lite::DeviceInfo device_info = {0};
57 device_info.npu_device_info_ = {frequency};
58 inner_context->device_list_.push_back({lite::DT_NPU, device_info});
59 return kSuccess;
60 }
61
AddAscend310Device(lite::InnerContext * inner_context,DeviceInfoContext * device)62 Status ContextUtils::AddAscend310Device(lite::InnerContext *inner_context, DeviceInfoContext *device) {
63 lite::DeviceInfo device_info = {0};
64 auto ascend310_context = device->Cast<Ascend310DeviceInfo>();
65 device_info.ascend310_device_info_ = {ascend310_context->GetDeviceID()};
66 inner_context->device_list_.push_back({lite::DT_ASCEND310, device_info});
67 return kSuccess;
68 }
69
AddNNRtDevice(lite::InnerContext * inner_context)70 Status ContextUtils::AddNNRtDevice(lite::InnerContext *inner_context) {
71 lite::DeviceInfo device_info = {0};
72 inner_context->device_list_.push_back({lite::DT_NNRT, device_info});
73 return kSuccess;
74 }
75
Convert(Context * context)76 lite::InnerContext *ContextUtils::Convert(Context *context) {
77 auto inner_context = std::make_unique<lite::InnerContext>();
78 if ((context == nullptr) || (inner_context == nullptr)) {
79 MS_LOG(ERROR) << "Invalid context pointers.";
80 return nullptr;
81 }
82 auto device_list = context->MutableDeviceInfo();
83 if (device_list.size() == 0 || device_list.size() > kMaxNumOfDevices) {
84 MS_LOG(ERROR) << "Device num, support min: 1, max: " << kMaxNumOfDevices;
85 return nullptr;
86 }
87 SetContextAttr(context->GetThreadNum(), context->GetEnableParallel(), context->GetThreadAffinityCoreList(),
88 context->GetDelegate(), inner_context.get());
89 inner_context->device_list_.clear();
90 Status ret = kLiteError;
91 for (auto &device : device_list) {
92 MS_CHECK_TRUE_RET(device != nullptr, nullptr);
93 if (device->GetDeviceType() == kCPU) {
94 auto cpu_context = device->Cast<CPUDeviceInfo>();
95 if (cpu_context->GetAllocator() == nullptr) {
96 cpu_context->SetAllocator(Allocator::Create());
97 }
98 ret = AddCpuDevice(cpu_context->GetAllocator(), context->GetThreadAffinityMode(), cpu_context->GetEnableFP16(),
99 cpu_context->GetProvider(), cpu_context->GetProviderDevice(), inner_context.get());
100 } else if (device->GetDeviceType() == kGPU) {
101 auto gpu_context = device->Cast<GPUDeviceInfo>();
102 ret = AddGpuDevice(gpu_context->GetEnableFP16(), gpu_context->GetDeviceID(), gpu_context->GetProvider(),
103 gpu_context->GetProviderDevice(), gpu_context->GetAllocator(), inner_context.get());
104 } else if (device->GetDeviceType() == kKirinNPU) {
105 auto npu_context = device->Cast<KirinNPUDeviceInfo>();
106 ret = AddNpuDevice(npu_context->GetFrequency(), inner_context.get());
107 } else if (device->GetDeviceType() == kAscend310) {
108 ret = AddAscend310Device(inner_context.get(), device.get());
109 } else if (device->GetDeviceType() == kNNRt) {
110 ret = AddNNRtDevice(inner_context.get());
111 }
112 if (ret != kSuccess) {
113 MS_LOG(ERROR) << "Add device failed!";
114 return nullptr;
115 }
116 }
117 return inner_context.release();
118 }
119
Convert(const ContextC * context_c)120 lite::InnerContext *ContextUtils::Convert(const ContextC *context_c) {
121 auto inner_context = std::make_unique<lite::InnerContext>();
122 if ((context_c == nullptr) || (inner_context == nullptr)) {
123 MS_LOG(ERROR) << "Invalid context pointers.";
124 return nullptr;
125 }
126 auto device_list = context_c->device_info_list;
127 if (device_list.size() == 0 || device_list.size() > kMaxNumOfDevices) {
128 MS_LOG(ERROR) << "Device num, support min: 1, max: " << kMaxNumOfDevices;
129 return nullptr;
130 }
131 SetContextAttr(context_c->thread_num, context_c->enable_parallel, context_c->affinity_core_list, context_c->delegate,
132 inner_context.get());
133 inner_context->device_list_.clear();
134 Status ret = kLiteError;
135 for (auto &device_info_c : device_list) {
136 MS_CHECK_TRUE_RET(device_info_c != nullptr, nullptr);
137 if (device_info_c->device_type == OH_AI_DEVICETYPE_CPU) {
138 if (device_info_c->allocator == nullptr) {
139 device_info_c->allocator = Allocator::Create();
140 }
141 ret = AddCpuDevice(device_info_c->allocator, context_c->affinity_mode, device_info_c->enable_fp16,
142 device_info_c->provider, device_info_c->provider_device, inner_context.get());
143 } else if (device_info_c->device_type == OH_AI_DEVICETYPE_GPU) {
144 ret = AddGpuDevice(device_info_c->enable_fp16, 0, device_info_c->provider, device_info_c->provider_device,
145 device_info_c->allocator, inner_context.get());
146 } else if (device_info_c->device_type == OH_AI_DEVICETYPE_KIRIN_NPU) {
147 ret = AddNpuDevice(device_info_c->frequency, inner_context.get());
148 } else if (device_info_c->device_type == OH_AI_DEVICETYPE_NNRT) {
149 ret = AddNNRtDevice(inner_context.get());
150 }
151 if (ret != kSuccess) {
152 MS_LOG(ERROR) << "Add device failed!";
153 return nullptr;
154 }
155 }
156 return inner_context.release();
157 }
158 } // namespace mindspore
159