10 #include <fmt/format.h> 15 namespace experimental
19 std::vector<InputMemDescriptorCoords> inputLayerInfo,
20 std::vector<OutputMemDescriptorCoords> outputLayerInfo,
21 std::vector<WorkingMemDescriptor> workingMemDescriptors,
22 std::unordered_map<LayerGuid, WorkingMemDescriptor> workingMemDescriptorMap,
23 std::unique_ptr<MemoryManager> memoryManager,
24 std::vector<std::pair<std::shared_ptr<TensorMemory>,
MemorySource>> tensorMemory,
25 std::vector<std::unique_ptr<ITensorHandle>> managedTensorHandles,
26 std::vector<std::unique_ptr<ITensorHandle>> unmanagedTensorHandles)
27 : m_NetworkId(networkId)
28 , m_WorkingMemDescriptors(workingMemDescriptors)
29 , m_WorkingMemDescriptorMap(workingMemDescriptorMap)
30 , m_MemoryManager(
std::move(memoryManager))
31 , m_TensorMemory(
std::move(tensorMemory))
32 , m_ManagedTensorHandles(
std::move(managedTensorHandles))
33 , m_UnmanagedTensorHandles(
std::move(unmanagedTensorHandles))
34 , m_InputSize(
numeric_cast<DifferenceType>(inputLayerInfo.size()))
35 , m_IsAllocated(false)
37 for (
const auto& inputInfo : inputLayerInfo)
39 m_InputValidationMap[inputInfo.m_LayerBindingId] =
false;
42 auto memDesc = m_WorkingMemDescriptors.at(inputInfo.m_InputSlotCoords[0].first);
43 ITensorHandle* inputTensorHandle = memDesc.m_Inputs[inputInfo.m_InputSlotCoords[0].second];
44 m_InputHandleMap[inputInfo.m_LayerBindingId] = inputTensorHandle;
48 for (
auto inputSlot : inputInfo.m_InputSlotCoords)
52 auto inputPos = workingMemDescriptor.
m_Inputs.begin();
56 inputPos +=
numeric_cast<DifferenceType>(inputSlot.second);
57 m_InputConnectionMap[inputInfo.m_LayerBindingId].push_back(inputPos);
60 size_t bindingIdCount = inputLayerInfo.size();
61 for (
const auto& outputInfo : outputLayerInfo)
63 for (
auto bindingId : outputInfo.m_LayerBindingIds)
65 m_OutputValidationMap[bindingId] =
false;
68 auto outputPos = m_WorkingMemDescriptors.at(outputInfo.m_OutputSlotCoords.first).m_Outputs.begin();
69 outputPos +=
numeric_cast<DifferenceType>(outputInfo.m_OutputSlotCoords.second);
71 m_OutputHandleMap[bindingId] = *outputPos;
73 bindingIdCount += outputInfo.m_LayerBindingIds.size();
76 if (outputInfo.m_LayerBindingIds.size() != 1)
82 for (
auto outputSlot : outputInfo.m_InputSlotCoords)
86 auto inputPos = workingMemDescriptor.
m_Inputs.begin();
90 inputPos +=
numeric_cast<DifferenceType>(outputSlot.second);
91 m_OutputConnectionMap[outputInfo.m_LayerBindingIds[0]].push_back(inputPos);
94 m_BindingIdVec = std::vector<LayerBindingId>(bindingIdCount);
104 m_IsAllocated =
true;
106 m_MemoryManager->Allocate();
108 for (
unsigned int i = 0; i < m_TensorMemory.size(); ++i)
110 m_ManagedTensorHandles[i]->Import(m_TensorMemory[i].first->m_Data, m_TensorMemory[i].second);
120 m_IsAllocated =
false;
122 m_MemoryManager->Deallocate();
127 for (
auto output : m_OutputConnectionMap)
129 (*output.second[0])->
Map(
true);
130 (*output.second[0])->
Unmap();
136 auto resetInputValidationMap = [&]()
138 for (
auto& pair: m_InputValidationMap)
144 auto resetOutputValidationMap = [&]()
146 for (
auto& pair: m_OutputValidationMap)
152 std::for_each(m_BindingIdVec.begin(), m_BindingIdVec.begin() + m_InputSize, [&](
LayerBindingId id)
156 bool& isUsed = m_InputValidationMap.at(
id);
159 resetInputValidationMap();
164 catch (
const std::out_of_range&)
166 resetInputValidationMap();
170 resetInputValidationMap();
172 std::for_each(m_BindingIdVec.begin() + m_InputSize, m_BindingIdVec.end(), [&](
LayerBindingId id)
176 bool& isUsed = m_OutputValidationMap.at(
id);
179 resetOutputValidationMap();
184 catch (
const std::out_of_range&)
186 resetOutputValidationMap();
190 resetOutputValidationMap();
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
std::vector< ITensorHandle * > m_Inputs
void ValidateBindingIds()
WorkingMemHandle(NetworkId networkId)
void Allocate() override
Allocate the backing memory required for execution.
MemorySource
Define the Memory Source to reduce copies.
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
void Free() override
Free the backing memory required for execution.