From ac00253514bcb9d60d881f190eba8af83786327e Mon Sep 17 00:00:00 2001 From: Derek Lamberti Date: Wed, 13 Oct 2021 18:26:16 +0100 Subject: Instrument runtime network load Signed-off-by: Derek Lamberti Change-Id: I2705fe04b5ec3a6046584d443f10d2d5cb3b5b87 --- src/armnn/Graph.cpp | 1 + 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 preallocatedTensors; std::unordered_map 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 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() : ""; - throw InvalidArgumentException( - fmt::format("No workload created for layer (name: '{0}' type: '{1}') (compute '{2}')", - layerName, static_cast(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() : ""; + throw InvalidArgumentException( + fmt::format("No workload created for layer (name: '{0}' type: '{1}') (compute '{2}')", + layerName, static_cast(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 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 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(); -- cgit v1.2.1