MCPcopy Create free account
hub / github.com/MegEngine/MegEngine / load_cambricon

Method load_cambricon

src/core/impl/comp_node/cambricon/comp_node.cpp:730–771  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

728}
729
730CompNode::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
773void CambriconCompNode::try_coalesce_all_free_memory() {
774 auto sd = CambriconCompNodeImpl::sd;

Callers

nothing calls this directly

Calls 2

get_device_countFunction · 0.85
initMethod · 0.45

Tested by

no test coverage detected