diff options
author | Derek Lamberti <derek.lamberti@arm.com> | 2021-10-13 18:26:16 +0100 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2021-10-15 13:35:18 +0000 |
commit | ac00253514bcb9d60d881f190eba8af83786327e (patch) | |
tree | 93f1efb0a216a9896404346c344c17f91a3c454f /src | |
parent | 44c4c985a29e84a374a9dc94a2718b4e2d8eab99 (diff) | |
download | armnn-ac00253514bcb9d60d881f190eba8af83786327e.tar.gz |
Instrument runtime network load
Signed-off-by: Derek Lamberti <derek.lamberti@arm.com>
Change-Id: I2705fe04b5ec3a6046584d443f10d2d5cb3b5b87
Diffstat (limited to 'src')
-rw-r--r-- | src/armnn/Graph.cpp | 1 | ||||
-rw-r--r-- | src/armnn/LoadedNetwork.cpp | 87 |
2 files changed, 46 insertions, 42 deletions
diff --git a/src/armnn/Graph.cpp b/src/armnn/Graph.cpp index 95104049a2..ebfc829340 100644 --- a/src/armnn/Graph.cpp +++ b/src/armnn/Graph.cpp @@ -180,6 +180,7 @@ Status Graph::AllocateDynamicBuffers() { // Layers must be sorted in topological order ARMNN_ASSERT(m_LayersInOrder); + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "LoadNetwork_AllocateDynamicBuffers"); std::unordered_set<const ITensorHandle*> preallocatedTensors; std::unordered_map<const ITensorHandle*, unsigned int> handleReferenceCounts; diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp index d25575bd93..c161ed35d5 100644 --- a/src/armnn/LoadedNetwork.cpp +++ b/src/armnn/LoadedNetwork.cpp @@ -230,58 +230,58 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<IOptimizedNetwork> net, } //Then create workloads. - for (auto&& layer : order) { - if (timelineUtils) + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "LoadNetwork_CreateWorkloads"); + for (auto&& layer: order) { - // Add layer to the post-optimisation network structure - AddLayerStructure(timelineUtils, *layer, networkGuid); - } - - const IWorkloadFactory& workloadFactory = GetWorkloadFactory(*layer); - - switch (layer->GetType()) - { - case LayerType::Input: - case LayerType::Output: + if (timelineUtils) { - // Inputs and outputs are treated in a special way - see EnqueueInput() and EnqueueOutput(). - break; + // Add layer to the post-optimisation network structure + AddLayerStructure(timelineUtils, *layer, networkGuid); } - default: - { - auto workload = layer->CreateWorkload(workloadFactory); - if (!workload) - { - const char* const layerName = - layer->GetNameStr().length() != 0 ? layer->GetName() : "<Unnamed>"; - throw InvalidArgumentException( - fmt::format("No workload created for layer (name: '{0}' type: '{1}') (compute '{2}')", - layerName, static_cast<int>(layer->GetType()), layer->GetBackendId().Get() - )); - } + const IWorkloadFactory& workloadFactory = GetWorkloadFactory(*layer); - if (timelineUtils) + switch (layer->GetType()) + { + case LayerType::Input: + case LayerType::Output: { - // Add workload to the post-optimisation network structure - AddWorkloadStructure(timelineUtils, workload, *layer); + // Inputs and outputs are treated in a special way - see EnqueueInput() and EnqueueOutput(). + break; } + default: { + auto workload = layer->CreateWorkload(workloadFactory); - // For async networks ConstantWorkloads are managed exclusively by LoadedNetwork - // and are separated out from the other workloads - if (networkProperties.m_AsyncEnabled && layer->GetType() == LayerType::Constant) - { - m_ConstantWorkloads[layer->GetGuid()] = std::move(workload); - } - else - { - m_WorkloadQueue.push_back(move(workload)); - } + if (!workload) + { + const char* const layerName = + layer->GetNameStr().length() != 0 ? layer->GetName() : "<Unnamed>"; + throw InvalidArgumentException( + fmt::format("No workload created for layer (name: '{0}' type: '{1}') (compute '{2}')", + layerName, static_cast<int>(layer->GetType()), layer->GetBackendId().Get() + )); + } - // release the constant data in the layer.. - layer->ReleaseConstantData(); - break; + if (timelineUtils) + { + // Add workload to the post-optimisation network structure + AddWorkloadStructure(timelineUtils, workload, *layer); + } + + // For async networks ConstantWorkloads are managed exclusively by LoadedNetwork + // and are separated out from the other workloads + if (networkProperties.m_AsyncEnabled && layer->GetType() == LayerType::Constant) + { + m_ConstantWorkloads[layer->GetGuid()] = std::move(workload); + } else { + m_WorkloadQueue.push_back(move(workload)); + } + + // release the constant data in the layer.. + layer->ReleaseConstantData(); + break; + } } } } @@ -304,6 +304,7 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<IOptimizedNetwork> net, // Now that the intermediate tensor memory has been set-up, // do any post allocation configuration for each workload. + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "LoadNetwork_PostAllocationConfigure"); for (auto &workload : m_WorkloadQueue) { workload->PostAllocationConfigure(); @@ -317,6 +318,7 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<IOptimizedNetwork> net, void LoadedNetwork::AllocateAndExecuteConstantWorkloads() { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "LoadNetwork_AllocateAndExecuteConstants"); Graph& order = m_OptimizedNetwork->pOptimizedNetworkImpl->GetGraph(); for (auto&& layer : order) { @@ -343,6 +345,7 @@ void LoadedNetwork::AllocateAndExecuteConstantWorkloads() void LoadedNetwork::SendNetworkStructure() { + ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "LoadNetwork_SendNetworkStructure"); Graph& order = m_OptimizedNetwork->pOptimizedNetworkImpl->GetGraph().TopologicalSort(); ProfilingGuid networkGuid = m_OptimizedNetwork->GetGuid(); |