You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tbe_task_builder.cc 20 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
4 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. /**
  2. * Copyright 2019-2020 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 "single_op/task/tbe_task_builder.h"
  17. #include <mutex>
  18. #include <vector>
  19. #include "graph/debug/ge_attr_define.h"
  20. #include "graph/load/model_manager/model_utils.h"
  21. #include "graph/manager/graph_var_manager.h"
  22. #include "runtime/rt.h"
  23. #include "single_op/task/build_task_utils.h"
  24. namespace ge {
  25. namespace {
  26. constexpr char const *kAttrSupportDynamicShape = "support_dynamicshape";
  27. constexpr char const *kAttrOpParamSize = "op_para_size";
  28. constexpr char const *kAttrAtomicOpParamSize = "atomic_op_para_size";
  29. std::mutex g_reg_mutex;
  30. } // namespace
  31. KernelHolder::KernelHolder(const char *stub_func, std::shared_ptr<ge::OpKernelBin> kernel_bin)
  32. : stub_func_(stub_func), bin_handle_(nullptr), kernel_bin_(std::move(kernel_bin)) {}
  33. KernelHolder::~KernelHolder() {
  34. if (bin_handle_ != nullptr) {
  35. GE_CHK_RT(rtDevBinaryUnRegister(bin_handle_));
  36. }
  37. }
  38. HandleHolder::HandleHolder(void *bin_handle)
  39. : bin_handle_(bin_handle) {}
  40. HandleHolder::~HandleHolder() {
  41. if (bin_handle_ != nullptr) {
  42. GE_CHK_RT(rtDevBinaryUnRegister(bin_handle_));
  43. }
  44. }
  45. const char *KernelBinRegistry::GetUnique(const string &stub_func) {
  46. std::lock_guard<std::mutex> lock(mutex_);
  47. auto it = unique_stubs_.find(stub_func);
  48. if (it != unique_stubs_.end()) {
  49. return it->c_str();
  50. } else {
  51. it = unique_stubs_.insert(unique_stubs_.end(), stub_func);
  52. return it->c_str();
  53. }
  54. }
  55. const char *KernelBinRegistry::GetStubFunc(const std::string &stub_name) {
  56. std::lock_guard<std::mutex> lock(mutex_);
  57. auto iter = registered_bins_.find(stub_name);
  58. if (iter != registered_bins_.end()) {
  59. return iter->second->stub_func_;
  60. }
  61. return nullptr;
  62. }
  63. bool KernelBinRegistry::AddKernel(const std::string &stub_name, std::unique_ptr<KernelHolder> &&holder) {
  64. std::lock_guard<std::mutex> lock(mutex_);
  65. auto ret = registered_bins_.emplace(stub_name, std::move(holder));
  66. return ret.second;
  67. }
  68. bool HandleRegistry::AddHandle(std::unique_ptr<HandleHolder> &&holder) {
  69. auto ret = registered_handles_.emplace(std::move(holder));
  70. return ret.second;
  71. }
  72. TbeTaskBuilder::TbeTaskBuilder(const std::string &model_name, const NodePtr &node, const domi::TaskDef &task_def)
  73. : node_(node),
  74. op_desc_(node->GetOpDesc()),
  75. task_def_(task_def),
  76. kernel_def_(task_def.kernel()),
  77. kernel_def_with_handle_(task_def.kernel_with_handle()),
  78. model_name_(model_name) {}
  79. TBEKernelPtr TbeTaskBuilder::GetTbeKernel(const OpDescPtr &op_desc) const {
  80. return op_desc->TryGetExtAttr(OP_EXTATTR_NAME_TBE_KERNEL, TBEKernelPtr());
  81. }
  82. void TbeTaskBuilder::GetKernelName(const OpDescPtr &op_desc, std::string &kernel_name) const {
  83. (void)AttrUtils::GetStr(op_desc, op_desc->GetName() + "_kernelname", kernel_name);
  84. }
  85. Status TbeTaskBuilder::DoRegisterBinary(const OpKernelBin &kernel_bin, void **bin_handle,
  86. const SingleOpModelParam &param) const {
  87. rtDevBinary_t binary;
  88. binary.version = 0;
  89. binary.data = kernel_bin.GetBinData();
  90. binary.length = kernel_bin.GetBinDataSize();
  91. GE_CHK_STATUS_RET_NOLOG(GetMagic(binary.magic));
  92. Status ret = 0;
  93. if (task_def_.type() == RT_MODEL_TASK_ALL_KERNEL) {
  94. ret = rtRegisterAllKernel(&binary, bin_handle);
  95. } else {
  96. ret = rtDevBinaryRegister(&binary, bin_handle);
  97. }
  98. if (ret != RT_ERROR_NONE) {
  99. GELOGE(ret, "[DoRegister][Binary] failed, bin key = %s, core_type = %ld, rt ret = %d", stub_name_.c_str(),
  100. param.core_type, static_cast<int>(ret));
  101. REPORT_CALL_ERROR("E19999", "DoRegisterBinary failed, bin key = %s, core_type = %ld, rt ret = %d",
  102. stub_name_.c_str(), param.core_type, static_cast<int>(ret));
  103. return ret;
  104. }
  105. return SUCCESS;
  106. }
  107. Status TbeTaskBuilder::DoRegisterMeta(void *bin_handle) {
  108. std::string meta_data;
  109. (void)AttrUtils::GetStr(op_desc_, GetKeyForTvmMetaData(), meta_data);
  110. GELOGI("TBE: meta data: %s", meta_data.empty() ? "null" : meta_data.c_str());
  111. if (!meta_data.empty()) {
  112. auto rt_ret = rtMetadataRegister(bin_handle, meta_data.c_str());
  113. if (rt_ret != RT_ERROR_NONE) {
  114. GELOGE(rt_ret, "[Invoke][rtMetadataRegister] failed. bin key = %s, meta_data = %s, rt ret = %d",
  115. stub_name_.c_str(), meta_data.c_str(), static_cast<int>(rt_ret));
  116. REPORT_CALL_ERROR("E19999", "rtMetadataRegister failed, bin key = %s, meta_data = %s, rt ret = %d",
  117. stub_name_.c_str(), meta_data.c_str(), static_cast<int>(rt_ret));
  118. return rt_ret;
  119. }
  120. }
  121. return SUCCESS;
  122. }
  123. Status TbeTaskBuilder::DoRegisterFunction(void *bin_handle, const char *stub_name, const char *kernel_name) {
  124. auto rt_ret = rtFunctionRegister(bin_handle, stub_name, stub_name, kernel_name, FUNC_MODE_NORMAL);
  125. if (rt_ret != RT_ERROR_NONE) {
  126. GELOGE(rt_ret, "[Invoke][rtFunctionRegister] failed. bin key = %s, kernel name = %s, rt ret = %d",
  127. stub_name, kernel_name, static_cast<int>(rt_ret));
  128. REPORT_CALL_ERROR("E19999", "rtFunctionRegister failed. bin key = %s, kernel name = %s, rt ret = %d",
  129. stub_name, kernel_name, static_cast<int>(rt_ret));
  130. return rt_ret;
  131. }
  132. return SUCCESS;
  133. }
  134. Status TbeTaskBuilder::DoRegisterKernel(const ge::OpKernelBin &tbe_kernel, const char *bin_file_key, void **bin_handle,
  135. const SingleOpModelParam &param) {
  136. void *handle = nullptr;
  137. auto ret = DoRegisterBinary(tbe_kernel, &handle, param);
  138. if (ret != SUCCESS) {
  139. return ret;
  140. }
  141. if (task_def_.type() == RT_MODEL_TASK_ALL_KERNEL) {
  142. *bin_handle = handle;
  143. return SUCCESS;
  144. }
  145. ret = DoRegisterMeta(handle);
  146. if (ret != SUCCESS) {
  147. GE_CHK_RT(rtDevBinaryUnRegister(handle));
  148. return ret;
  149. }
  150. std::string kernel_name;
  151. GetKernelName(op_desc_, kernel_name);
  152. ret = DoRegisterFunction(handle, bin_file_key, kernel_name.c_str());
  153. if (ret != SUCCESS) {
  154. GE_CHK_RT(rtDevBinaryUnRegister(handle));
  155. return ret;
  156. }
  157. GELOGI("Register function succeeded: kernel_name = %s", kernel_name.c_str());
  158. *bin_handle = handle;
  159. return SUCCESS;
  160. }
  161. Status TbeTaskBuilder::RegisterKernel(TbeOpTask &task, const SingleOpModelParam &param) {
  162. KernelBinRegistry &registry = KernelBinRegistry::GetInstance();
  163. // check if already registered
  164. const char *stub_func = registry.GetStubFunc(stub_name_);
  165. if (stub_func != nullptr) {
  166. task.SetStubFunc(stub_name_, stub_func);
  167. return SUCCESS;
  168. }
  169. // to avoid repeat register
  170. std::lock_guard<std::mutex> lock(g_reg_mutex);
  171. // check again
  172. stub_func = registry.GetStubFunc(stub_name_);
  173. if (stub_func == nullptr) {
  174. stub_func = registry.GetUnique(stub_name_);
  175. GELOGI("RegisterKernel begin, stub_func = %s", stub_func);
  176. auto tbe_kernel = GetTbeKernel(op_desc_);
  177. if (tbe_kernel == nullptr) {
  178. GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Get][TbeKernel] fail for OP EXT ATTR NAME TBE_KERNEL not found. op = %s",
  179. op_desc_->GetName().c_str());
  180. REPORT_CALL_ERROR("E19999", "GetTbeKernel fail for OP EXT ATTR NAME TBE_KERNEL not found. op = %s",
  181. op_desc_->GetName().c_str());
  182. return ACL_ERROR_GE_INTERNAL_ERROR;
  183. }
  184. auto holder = std::unique_ptr<KernelHolder>(new (std::nothrow) KernelHolder(stub_func, tbe_kernel));
  185. if (holder == nullptr) {
  186. GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Create][KernelHodler] failed.");
  187. REPORT_INNER_ERROR("E19999", "Create KernelHodler failed.");
  188. return ACL_ERROR_GE_MEMORY_ALLOCATION;
  189. }
  190. void *bin_handle = nullptr;
  191. auto ret = DoRegisterKernel(*tbe_kernel, stub_func, &bin_handle, param);
  192. if (ret != SUCCESS) {
  193. GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Register][Kernel] failed. stub name = %s", stub_name_.c_str());
  194. REPORT_CALL_ERROR("E19999", "DoRegisterKernel failed, stub name = %s", stub_name_.c_str());
  195. return ACL_ERROR_GE_INTERNAL_ERROR;
  196. }
  197. holder->SetBinHandle(bin_handle);
  198. if (!registry.AddKernel(stub_name_, std::move(holder))) {
  199. // should not happen. only one thread can reach here
  200. GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Add][Kernel] failed. stub name = %s", stub_name_.c_str());
  201. REPORT_CALL_ERROR("E19999", "AddKernel failed. stub name = %s", stub_name_.c_str());
  202. return ACL_ERROR_GE_INTERNAL_ERROR;
  203. }
  204. }
  205. task.SetStubFunc(stub_name_, stub_func);
  206. return SUCCESS;
  207. }
  208. Status TbeTaskBuilder::RegisterKernelWithHandle(TbeOpTask &task, const SingleOpModelParam &param) {
  209. GELOGD("RegisterKernelWithHandle begin.");
  210. HandleRegistry &registry = HandleRegistry::GetInstance();
  211. auto tbe_kernel = GetTbeKernel(op_desc_);
  212. if (tbe_kernel == nullptr) {
  213. GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Get][TbeKernel] fail for OP EXT ATTR NAME TBE_KERNEL not found. op = %s",
  214. op_desc_->GetName().c_str());
  215. REPORT_CALL_ERROR("E19999", "GetTbeKernel fail for OP EXT ATTR NAME TBE_KERNEL not found. op = %s",
  216. op_desc_->GetName().c_str());
  217. return ACL_ERROR_GE_INTERNAL_ERROR;
  218. }
  219. void *bin_handle = nullptr;
  220. auto ret = DoRegisterKernel(*tbe_kernel, nullptr, &bin_handle, param);
  221. if (ret != SUCCESS) {
  222. GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Register][Kernel] failed. node name = %s", op_desc_->GetName().c_str());
  223. REPORT_CALL_ERROR("E19999", "DoRegisterKernel failed, node name = %s", op_desc_->GetName().c_str());
  224. return ACL_ERROR_GE_INTERNAL_ERROR;
  225. }
  226. handle_ = bin_handle;
  227. auto holder = std::unique_ptr<HandleHolder>(new (std::nothrow) HandleHolder(handle_));
  228. if (holder == nullptr) {
  229. GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Create][HandleHolder] failed.");
  230. REPORT_INNER_ERROR("E19999", "Create HandleHolder failed.");
  231. return ACL_ERROR_GE_MEMORY_ALLOCATION;
  232. }
  233. if (!registry.AddHandle(std::move(holder))) {
  234. GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Add][Handle] failed. node name = %s", op_desc_->GetName().c_str());
  235. REPORT_CALL_ERROR("E19999", "AddHandle failed, node name = %s", op_desc_->GetName().c_str());
  236. return ACL_ERROR_GE_INTERNAL_ERROR;
  237. }
  238. return SUCCESS;
  239. }
  240. Status TbeTaskBuilder::GetSmDesc(void **sm_desc, const SingleOpModelParam &param) const {
  241. const std::string &sm_desc_str = kernel_def_.sm_desc();
  242. if (sm_desc_str.empty()) {
  243. *sm_desc = nullptr;
  244. } else {
  245. GELOGD("To process sm desc, size = %zu", sm_desc_str.size());
  246. char *sm_control = const_cast<char *>(sm_desc_str.data());
  247. auto *l2_ctrl_info = reinterpret_cast<rtL2Ctrl_t *>(sm_control);
  248. uint64_t gen_base_addr = param.base_addr;
  249. // There is no weight for te op now. Update L2_mirror_addr by data memory base.
  250. uint64_t data_base_addr = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(param.mem_base)) - gen_base_addr;
  251. for (auto &data_index : l2_ctrl_info->data) {
  252. if (data_index.L2_mirror_addr != 0) {
  253. data_index.L2_mirror_addr += data_base_addr;
  254. }
  255. }
  256. auto rt_ret = rtMemAllocManaged(sm_desc, sm_desc_str.size(), RT_MEMORY_SPM);
  257. if (rt_ret != RT_ERROR_NONE) {
  258. GELOGE(rt_ret, "[Invoke][rtMemAllocManaged] failed, ret: %d.", static_cast<int>(rt_ret));
  259. REPORT_CALL_ERROR("E19999", "rtMemAllocManaged failed, ret: %d.", static_cast<int>(rt_ret));
  260. return rt_ret;
  261. }
  262. rt_ret = rtMemcpy(*sm_desc, sm_desc_str.size(), sm_desc_str.data(), sm_desc_str.size(), RT_MEMCPY_HOST_TO_DEVICE);
  263. if (rt_ret != RT_ERROR_NONE) {
  264. (void)rtMemFreeManaged(*sm_desc);
  265. GELOGE(rt_ret, "[Update][Param:sm_desc] fail for rtMemcpy return: %d.", static_cast<int>(rt_ret));
  266. REPORT_INNER_ERROR("E19999", "rtMemcpy failed, ret:%d.", static_cast<int>(rt_ret));
  267. return rt_ret;
  268. }
  269. }
  270. return SUCCESS;
  271. }
  272. Status TbeTaskBuilder::InitKernelArgs(void *arg_addr, size_t arg_size, const SingleOpModelParam &param) {
  273. // copy args
  274. std::vector<void *> tensor_device_addr_vec = BuildTaskUtils::GetKernelArgs(op_desc_, param);
  275. void *src_addr = reinterpret_cast<void *>(tensor_device_addr_vec.data());
  276. uint64_t src_len = sizeof(void *) * tensor_device_addr_vec.size();
  277. GE_CHK_RT_RET(rtMemcpy(arg_addr, arg_size, src_addr, src_len, RT_MEMCPY_HOST_TO_HOST));
  278. return SUCCESS;
  279. }
  280. Status TbeTaskBuilder::SetKernelArgs(TbeOpTask &task, const SingleOpModelParam &param, const OpDescPtr &op_desc) {
  281. auto task_type = static_cast<rtModelTaskType_t>(task_def_.type());
  282. bool is_task_all_kernel = (task_type == RT_MODEL_TASK_ALL_KERNEL);
  283. size_t arg_size = 0;
  284. std::unique_ptr<uint8_t[]> args = nullptr;
  285. if (is_task_all_kernel) {
  286. GELOGD("SetKernelArgs of %s in branch of RT_MODEL_TASK_ALL_KERNEL.", op_desc->GetName().c_str());
  287. arg_size = kernel_def_with_handle_.args_size();
  288. args = std::unique_ptr<uint8_t[]>(new (std::nothrow) uint8_t[arg_size]);
  289. GE_CHECK_NOTNULL(args);
  290. GE_CHK_RT_RET(rtMemcpy(args.get(), arg_size, kernel_def_with_handle_.args().data(), arg_size,
  291. RT_MEMCPY_HOST_TO_HOST))
  292. } else {
  293. GELOGD("SetKernelArgs of %s in branch of RT_MODEL_TASK_KERNEL.", op_desc->GetName().c_str());
  294. arg_size = kernel_def_.args_size();
  295. args = std::unique_ptr<uint8_t[]>(new (std::nothrow) uint8_t[arg_size]);
  296. GE_CHECK_NOTNULL(args);
  297. GE_CHK_RT_RET(rtMemcpy(args.get(), arg_size, kernel_def_.args().data(), arg_size, RT_MEMCPY_HOST_TO_HOST))
  298. }
  299. const domi::KernelContext &context = task_type == RT_MODEL_TASK_ALL_KERNEL ?
  300. kernel_def_with_handle_.context() : kernel_def_.context();
  301. const auto *args_offset_tmp = reinterpret_cast<const uint16_t *>(context.args_offset().data());
  302. uint16_t offset = *args_offset_tmp;
  303. GE_CHK_STATUS_RET_NOLOG(InitKernelArgs(args.get() + offset, arg_size - offset, param));
  304. if (is_task_all_kernel) {
  305. task.SetKernelWithHandleArgs(std::move(args), arg_size, kernel_def_with_handle_.block_dim(), op_desc,
  306. kernel_def_with_handle_);
  307. } else {
  308. task.SetKernelArgs(std::move(args), arg_size, kernel_def_.block_dim(), op_desc);
  309. }
  310. bool is_dynamic = false;
  311. (void)AttrUtils::GetBool(op_desc_, kAttrSupportDynamicShape, is_dynamic);
  312. if (is_dynamic) {
  313. GE_CHK_STATUS_RET_NOLOG(InitTilingInfo(task));
  314. if (!param.graph_is_dynamic && task.tiling_buffer_ != nullptr) {
  315. GELOGD("Need to update run info when graph is static with dynamic node: %s.", op_desc->GetName().c_str());
  316. task.UpdateRunInfo();
  317. GE_CHK_RT_RET(rtMemcpy(task.tiling_buffer_, task.max_tiling_size_, task.tiling_data_.data(),
  318. task.tiling_data_.size(), RT_MEMCPY_HOST_TO_DEVICE));
  319. }
  320. }
  321. return SUCCESS;
  322. }
  323. Status TbeTaskBuilder::BuildTask(TbeOpTask &task, const SingleOpModelParam &param) {
  324. GELOGD("Build tbe task begin");
  325. auto ret = SetKernelArgs(task, param, op_desc_);
  326. if (ret != SUCCESS) {
  327. return ret;
  328. }
  329. auto task_type = static_cast<rtModelTaskType_t>(task_def_.type());
  330. if (task_type == RT_MODEL_TASK_ALL_KERNEL) {
  331. stub_name_ = model_name_ + "/" + node_->GetName() + "_tvmbin";
  332. ret = RegisterKernelWithHandle(task, param);
  333. } else {
  334. const domi::KernelDef &kernel_def = task_def_.kernel();
  335. stub_name_ = model_name_ + "/" + kernel_def.stub_func() + "_tvmbin";
  336. ret = RegisterKernel(task, param);
  337. }
  338. task.SetHandle(handle_);
  339. if (ret != SUCCESS) {
  340. return ret;
  341. }
  342. auto task_info = BuildTaskUtils::GetTaskInfo(op_desc_);
  343. GELOGI("[TASK_INFO] %s %s", stub_name_.c_str(), task_info.c_str());
  344. if (task_type != RT_MODEL_TASK_ALL_KERNEL) {
  345. void *stub_func = nullptr;
  346. auto rt_ret = rtGetFunctionByName(stub_name_.c_str(), &stub_func);
  347. if (rt_ret != SUCCESS) {
  348. GELOGE(rt_ret, "[Get][FunctionByName] failed. stub_name:%s.", stub_name_.c_str());
  349. REPORT_CALL_ERROR("E19999", "rtGetFunctionByName failed, stub_name:%s.", stub_name_.c_str());
  350. return RT_ERROR_TO_GE_STATUS(rt_ret);
  351. }
  352. task.SetStubFunc(stub_name_, stub_func);
  353. }
  354. GE_CHK_STATUS_RET(task.SetArgIndex(), "[Set][ArgTable] failed.");
  355. task.input_num_ = op_desc_->GetInputsSize();
  356. task.output_num_ = op_desc_->GetOutputsSize();
  357. return SUCCESS;
  358. }
  359. Status TbeTaskBuilder::InitTilingInfo(TbeOpTask &task) {
  360. GELOGD("Start alloc tiling data of node %s.", op_desc_->GetName().c_str());
  361. int64_t max_size = -1;
  362. (void)AttrUtils::GetInt(op_desc_, GetKeyForOpParamSize(), max_size);
  363. GELOGD("Got op param size by key: %s, ret = %ld", GetKeyForOpParamSize().c_str(), max_size);
  364. if (max_size < 0) {
  365. GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Get][Int] %s Invalid op_param_size: %ld.",
  366. op_desc_->GetName().c_str(), max_size);
  367. REPORT_CALL_ERROR("E19999", "AttrUtils::GetInt failed, %s Invalid op_param_size: %ld.",
  368. op_desc_->GetName().c_str(), max_size);
  369. return ACL_ERROR_GE_PARAM_INVALID;
  370. }
  371. void *tiling_buffer = nullptr;
  372. if (max_size > 0) {
  373. GE_CHK_RT_RET(rtMalloc(&tiling_buffer, static_cast<uint64_t>(max_size), RT_MEMORY_HBM));
  374. GE_CHECK_NOTNULL(tiling_buffer);
  375. GELOGD("[%s] Done allocating tiling buffer, size=%ld.", op_desc_->GetName().c_str(), max_size);
  376. }
  377. task.EnableDynamicSupport(node_, tiling_buffer, static_cast<uint32_t>(max_size));
  378. return SUCCESS;
  379. }
  380. Status TbeTaskBuilder::GetMagic(uint32_t &magic) const {
  381. std::string json_string;
  382. GE_IF_BOOL_EXEC(AttrUtils::GetStr(op_desc_, TVM_ATTR_NAME_MAGIC, json_string),
  383. GELOGD("Get original type of session_graph_id."));
  384. if (json_string == "RT_DEV_BINARY_MAGIC_ELF") {
  385. magic = RT_DEV_BINARY_MAGIC_ELF;
  386. } else if (json_string == "RT_DEV_BINARY_MAGIC_ELF_AIVEC") {
  387. magic = RT_DEV_BINARY_MAGIC_ELF_AIVEC;
  388. } else if (json_string == "RT_DEV_BINARY_MAGIC_ELF_AICUBE") {
  389. magic = RT_DEV_BINARY_MAGIC_ELF_AICUBE;
  390. } else {
  391. REPORT_INNER_ERROR("E19999", "Attr:%s in op:%s(%s), value:%s check invalid",
  392. TVM_ATTR_NAME_MAGIC.c_str(), op_desc_->GetName().c_str(),
  393. op_desc_->GetType().c_str(), json_string.c_str());
  394. GELOGE(PARAM_INVALID, "[Check][Param] Attr:%s in op:%s(%s), value:%s check invalid",
  395. TVM_ATTR_NAME_MAGIC.c_str(), op_desc_->GetName().c_str(),
  396. op_desc_->GetType().c_str(), json_string.c_str());
  397. return PARAM_INVALID;
  398. }
  399. return SUCCESS;
  400. }
  401. std::string TbeTaskBuilder::GetKeyForOpParamSize() const {
  402. return kAttrOpParamSize;
  403. }
  404. std::string TbeTaskBuilder::GetKeyForTvmMetaData() const {
  405. return TVM_ATTR_NAME_METADATA;
  406. }
  407. Status AtomicAddrCleanTaskBuilder::InitKernelArgs(void *args_addr, size_t arg_size, const SingleOpModelParam &param) {
  408. return SUCCESS;
  409. }
  410. std::string AtomicAddrCleanTaskBuilder::GetKeyForOpParamSize() const {
  411. return kAttrAtomicOpParamSize;
  412. }
  413. std::string AtomicAddrCleanTaskBuilder::GetKeyForTvmMetaData() const {
  414. return ATOMIC_ATTR_TVM_METADATA;
  415. }
  416. void AtomicAddrCleanTaskBuilder::GetKernelName(const OpDescPtr &op_desc, std::string &kernel_name) const {
  417. (void)AttrUtils::GetStr(op_desc, op_desc->GetName() + "_atomic_kernelname", kernel_name);
  418. }
  419. TBEKernelPtr AtomicAddrCleanTaskBuilder::GetTbeKernel(const OpDescPtr &op_desc) const {
  420. return op_desc->TryGetExtAttr(EXT_ATTR_ATOMIC_TBE_KERNEL, TBEKernelPtr());
  421. }
  422. } // namespace ge

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示