• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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