aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Lamberti <derek.lamberti@arm.com>2021-10-13 18:26:16 +0100
committerJim Flynn <jim.flynn@arm.com>2021-10-15 13:35:18 +0000
commitac00253514bcb9d60d881f190eba8af83786327e (patch)
tree93f1efb0a216a9896404346c344c17f91a3c454f
parent44c4c985a29e84a374a9dc94a2718b4e2d8eab99 (diff)
downloadarmnn-ac00253514bcb9d60d881f190eba8af83786327e.tar.gz
Instrument runtime network load
Signed-off-by: Derek Lamberti <derek.lamberti@arm.com> Change-Id: I2705fe04b5ec3a6046584d443f10d2d5cb3b5b87
-rw-r--r--src/armnn/Graph.cpp1
-rw-r--r--src/armnn/LoadedNetwork.cpp87
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();