| 728 | } |
| 729 | |
| 730 | CompNode::Impl* CambriconCompNode::load_cambricon( |
| 731 | const Locator& locator, const Locator& locator_logical) { |
| 732 | int nr_devs = get_device_count(); |
| 733 | mgb_assert( |
| 734 | locator.device >= 0 && locator.device < nr_devs, |
| 735 | "request device%d out of range [0, %d)", locator.device, nr_devs); |
| 736 | |
| 737 | auto&& sdptr = CambriconCompNodeImpl::sd; |
| 738 | { |
| 739 | MGB_LOCK_GUARD(CambriconCompNodeImpl::sd_mtx); |
| 740 | if (!sdptr) { |
| 741 | using T = CambriconCompNodeImpl::StaticData; |
| 742 | static std::aligned_storage_t<sizeof(T), alignof(T)> storage; |
| 743 | sdptr = new (&storage) T; |
| 744 | } |
| 745 | } |
| 746 | auto&& sd = *sdptr; |
| 747 | MGB_LOCK_GUARD(sd.mtx); |
| 748 | |
| 749 | CompNodeImpl* available_node = nullptr; |
| 750 | for (int i = 0; i < sd.nr_node; ++i) { |
| 751 | auto&& cur = sd.node[i]; |
| 752 | if (cur.m_initialized) { |
| 753 | if (cur.m_locator == locator && cur.m_locator_logical == locator_logical) { |
| 754 | return &cur; |
| 755 | } |
| 756 | } else { |
| 757 | available_node = &cur; |
| 758 | } |
| 759 | } |
| 760 | |
| 761 | if (!available_node) { |
| 762 | mgb_assert(sd.nr_node < sd.MAX_NR_COMP_NODE, "too many CompNode allocated"); |
| 763 | mgb_assert(locator.device < sd.MAX_NR_COMP_NODE, "device number too large"); |
| 764 | available_node = &sd.node[sd.nr_node++]; |
| 765 | } |
| 766 | |
| 767 | mgb_assert(!available_node->m_initialized); |
| 768 | available_node->init(locator, locator_logical); |
| 769 | |
| 770 | return available_node; |
| 771 | } |
| 772 | |
| 773 | void CambriconCompNode::try_coalesce_all_free_memory() { |
| 774 | auto sd = CambriconCompNodeImpl::sd; |
nothing calls this directly
no test coverage detected