IVGCVSW-3948 Add Startup method to Profiling
authorJim Flynn <jim.flynn@arm.com>
Tue, 15 Oct 2019 09:18:11 +0000 (10:18 +0100)
committerJim Flynn Arm <jim.flynn@arm.com>
Tue, 15 Oct 2019 14:43:37 +0000 (14:43 +0000)
Change-Id: I591e84048775278bfc728e1b0c189ff4cf2d350b
Signed-off-by: Jim Flynn <jim.flynn@arm.com>
src/armnn/Runtime.cpp
src/profiling/ProfilingService.cpp
src/profiling/ProfilingService.hpp
src/profiling/test/ProfilingTests.cpp

index dd46708..68975a2 100644 (file)
@@ -149,7 +149,7 @@ Runtime::Runtime(const CreationOptions& options)
     BOOST_LOG_TRIVIAL(info) << "ArmNN v" << ARMNN_VERSION << "\n";
 
     // pass configuration info to the profiling service
-    armnn::profiling::ProfilingService::Instance().ResetExternalProfilingOptions(options.m_ProfilingOptions);
+    armnn::profiling::ProfilingService::Instance().ConfigureProfilingService(options.m_ProfilingOptions);
 
     // Load any available/compatible dynamic backend before the runtime
     // goes through the backend registry
index b481695..b87773f 100644 (file)
@@ -28,6 +28,56 @@ void ProfilingService::ResetExternalProfilingOptions(const ExternalProfilingOpti
     }
 }
 
+ProfilingState ProfilingService::ConfigureProfilingService(
+        const ExternalProfilingOptions& options,
+        bool resetProfilingService)
+{
+    ResetExternalProfilingOptions(options, resetProfilingService);
+    ProfilingState currentState = m_StateMachine.GetCurrentState();
+    if (options.m_EnableProfiling)
+    {
+        switch (currentState)
+        {
+            case ProfilingState::Uninitialised:
+                Update(); // should transition to NotConnected
+                Update(); // will either stay in NotConnected because there is no server
+                          // or will enter WaitingForAck.
+                currentState = m_StateMachine.GetCurrentState();
+                if (currentState == ProfilingState::WaitingForAck)
+                {
+                    Update(); // poke it again to send out the metadata packet
+                }
+                currentState = m_StateMachine.GetCurrentState();
+                return currentState;
+            case ProfilingState::NotConnected:
+                Update(); // will either stay in NotConnected because there is no server
+                          // or will enter WaitingForAck
+                currentState = m_StateMachine.GetCurrentState();
+                if (currentState == ProfilingState::WaitingForAck)
+                {
+                    Update(); // poke it again to send out the metadata packet
+                }
+                currentState = m_StateMachine.GetCurrentState();
+                return currentState;
+            default:
+                return currentState;
+        }
+    }
+    else
+    {
+        // Make sure profiling is shutdown
+        switch (currentState)
+        {
+            case ProfilingState::Uninitialised:
+            case ProfilingState::NotConnected:
+                return currentState;
+            default:
+                Stop();
+                return m_StateMachine.GetCurrentState();
+        }
+    }
+}
+
 void ProfilingService::Update()
 {
     if (!m_Options.m_EnableProfiling)
index 1afcb1c..dda37dd 100644 (file)
@@ -42,6 +42,9 @@ public:
 
     // Resets the profiling options, optionally clears the profiling service entirely
     void ResetExternalProfilingOptions(const ExternalProfilingOptions& options, bool resetProfilingService = false);
+    ProfilingState ConfigureProfilingService(const ExternalProfilingOptions& options,
+                                             bool resetProfilingService = false);
+
 
     // Updates the profiling service, making it transition to a new state if necessary
     void Update();
index 033f64a..b32a55c 100644 (file)
@@ -3137,4 +3137,31 @@ BOOST_AUTO_TEST_CASE(CheckProfilingServiceGoodPerJobCounterSelectionPacket)
     profilingService.ResetExternalProfilingOptions(options, true);
 }
 
+BOOST_AUTO_TEST_CASE(CheckConfigureProfilingServiceOn)
+{
+    armnn::Runtime::CreationOptions::ExternalProfilingOptions options;
+    options.m_EnableProfiling = true;
+    ProfilingService& profilingService = ProfilingService::Instance();
+    BOOST_CHECK(profilingService.GetCurrentState() == ProfilingState::Uninitialised);
+    profilingService.ConfigureProfilingService(options);
+    // should get as far as NOT_CONNECTED
+    BOOST_CHECK(profilingService.GetCurrentState() == ProfilingState::NotConnected);
+    // Reset the profiling service to stop any running thread
+    options.m_EnableProfiling = false;
+    profilingService.ResetExternalProfilingOptions(options, true);
+}
+
+BOOST_AUTO_TEST_CASE(CheckConfigureProfilingServiceOff)
+{
+    armnn::Runtime::CreationOptions::ExternalProfilingOptions options;
+    ProfilingService& profilingService = ProfilingService::Instance();
+    BOOST_CHECK(profilingService.GetCurrentState() == ProfilingState::Uninitialised);
+    profilingService.ConfigureProfilingService(options);
+    // should not move from Uninitialised
+    BOOST_CHECK(profilingService.GetCurrentState() == ProfilingState::Uninitialised);
+    // Reset the profiling service to stop any running thread
+    options.m_EnableProfiling = false;
+    profilingService.ResetExternalProfilingOptions(options, true);
+}
+
 BOOST_AUTO_TEST_SUITE_END()