| 689 | } |
| 690 | |
| 691 | std::shared_ptr<DeviceTensorND> GraphLoaderOSS::OprLoadContextImpl::load_tensor_shared( |
| 692 | bool copy_immediatly) { |
| 693 | mgb_assert( |
| 694 | m_current_opr->tensors() && |
| 695 | m_cur_opr_tensor_cnt < m_current_opr->tensors()->size()); |
| 696 | auto tensor = m_current_opr->tensors()->Get(m_cur_opr_tensor_cnt++); |
| 697 | auto comp_node = load_comp_node(tensor->comp_node()); |
| 698 | auto layout = load_tensor_layout(tensor); |
| 699 | mgb_assert(tensor->data_size()); |
| 700 | if (m_loader->m_shared_tensor_map.size() <= m_cur_shared_tensor_idx) { |
| 701 | m_loader->m_shared_tensor_map.resize(m_cur_shared_tensor_idx + 5); |
| 702 | } |
| 703 | auto&& sh_reg = m_loader->m_shared_tensor_map.at(m_cur_shared_tensor_idx++); |
| 704 | auto&& sh_ptr_ref = sh_reg.second[comp_node.mem_node()]; |
| 705 | if (sh_ptr_ref) { |
| 706 | // cached tensor value is valid so we can reuse it |
| 707 | load_tensor_value(nullptr, layout, tensor); |
| 708 | if (sh_ptr_ref->comp_node() == comp_node) |
| 709 | return sh_ptr_ref; |
| 710 | // same mem node but different comp node, change comp node and share |
| 711 | // value |
| 712 | auto ret = std::make_shared<DeviceTensorND>(*sh_ptr_ref); |
| 713 | ret->comp_node(comp_node); |
| 714 | return ret; |
| 715 | } |
| 716 | if (tensor->name()) { |
| 717 | sh_reg.first = tensor->name()->str(); |
| 718 | } |
| 719 | |
| 720 | if (comp_node.mem_node() == CompNode::default_cpu().mem_node() || copy_immediatly) { |
| 721 | // directly forward CPU memory |
| 722 | HostTensorND hv{comp_node}; |
| 723 | load_tensor_value(&hv, layout, tensor); |
| 724 | sh_ptr_ref = std::make_shared<DeviceTensorND>(); |
| 725 | if (comp_node.mem_node() == CompNode::default_cpu().mem_node()) { |
| 726 | *sh_ptr_ref = DeviceTensorND::make_proxy(hv); |
| 727 | } else { |
| 728 | mgb_assert(copy_immediatly); |
| 729 | sh_ptr_ref->comp_node(comp_node).copy_from(hv).sync(); |
| 730 | } |
| 731 | } else { |
| 732 | // use lazy load for non-CPU devices |
| 733 | HostTensorND hv{CompNode::default_cpu()}; |
| 734 | load_tensor_value(&hv, layout, tensor); |
| 735 | sh_ptr_ref = m_device_value_loader.make(comp_node, std::move(hv)); |
| 736 | } |
| 737 | return sh_ptr_ref; |
| 738 | } |
| 739 | |
| 740 | Metadata GraphLoaderOSS::OprLoadContextImpl::load_metadata() { |
| 741 | const auto* fbmeta = m_loader->m_graph->metadata(); |
no test coverage detected