diff options
-rw-r--r-- | include/armnn/IRuntime.hpp | 2 | ||||
-rw-r--r-- | src/profiling/ProfilingConnectionFactory.cpp | 6 | ||||
-rw-r--r-- | src/profiling/test/ProfilingTests.cpp | 37 | ||||
-rw-r--r-- | tests/ExecuteNetwork/ExecuteNetwork.cpp | 15 |
4 files changed, 55 insertions, 5 deletions
diff --git a/include/armnn/IRuntime.hpp b/include/armnn/IRuntime.hpp index 712355bb3a..8391ed3b15 100644 --- a/include/armnn/IRuntime.hpp +++ b/include/armnn/IRuntime.hpp @@ -65,6 +65,7 @@ public: , m_IncomingCaptureFile("") , m_FileOnly(false) , m_CapturePeriod(LOWEST_CAPTURE_PERIOD) + , m_FileFormat("binary") {} bool m_EnableProfiling; @@ -72,6 +73,7 @@ public: std::string m_IncomingCaptureFile; bool m_FileOnly; uint32_t m_CapturePeriod; + std::string m_FileFormat; }; ExternalProfilingOptions m_ProfilingOptions; diff --git a/src/profiling/ProfilingConnectionFactory.cpp b/src/profiling/ProfilingConnectionFactory.cpp index 4af81a024e..1d264def57 100644 --- a/src/profiling/ProfilingConnectionFactory.cpp +++ b/src/profiling/ProfilingConnectionFactory.cpp @@ -18,6 +18,12 @@ namespace profiling std::unique_ptr<IProfilingConnection> ProfilingConnectionFactory::GetProfilingConnection( const Runtime::CreationOptions::ExternalProfilingOptions& options) const { + // Before proceed to create the IProfilingConnection, check if the file format is supported + if (!(options.m_FileFormat == "binary")) + { + throw armnn::UnimplementedException("Unsupported profiling file format, only binary is supported"); + } + // We can create 3 different types of IProfilingConnection. // 1: If no relevant options are specified then a SocketProfilingConnection is returned. // 2: If both incoming and outgoing capture files are specified then a SocketProfilingConnection decorated by a diff --git a/src/profiling/test/ProfilingTests.cpp b/src/profiling/test/ProfilingTests.cpp index 29c5299bd3..a631cb2356 100644 --- a/src/profiling/test/ProfilingTests.cpp +++ b/src/profiling/test/ProfilingTests.cpp @@ -3448,4 +3448,41 @@ BOOST_AUTO_TEST_CASE(CheckRegisterCounters) BOOST_TEST(93 == readValue); } +BOOST_AUTO_TEST_CASE(CheckFileFormat) { + // Locally reduce log level to "Warning", as this test needs to parse a warning message from the standard output + LogLevelSwapper logLevelSwapper(armnn::LogSeverity::Warning); + + // Create profiling options. + armnn::Runtime::CreationOptions::ExternalProfilingOptions options; + options.m_EnableProfiling = true; + // Check the default value set to binary + BOOST_CHECK(options.m_FileFormat == "binary"); + + // Change file format to an unsupported value + options.m_FileFormat = "json"; + // Enable the profiling service + armnn::profiling::ProfilingService profilingService; + profilingService.ResetExternalProfilingOptions(options, true); + // Start the command handler and the send thread + profilingService.Update(); + BOOST_CHECK(profilingService.GetCurrentState()==ProfilingState::NotConnected); + + // Redirect the output to a local stream so that we can parse the warning message + std::stringstream ss; + StreamRedirector streamRedirector(std::cout, ss.rdbuf()); + + // When Update is called and the current state is ProfilingState::NotConnected + // an exception will be raised from GetProfilingConnection and displayed as warning in the output local stream + profilingService.Update(); + + streamRedirector.CancelRedirect(); + + // Check that the expected error has occurred and logged to the standard output + if (!boost::contains(ss.str(), "Unsupported profiling file format, only binary is supported")) + { + std::cout << ss.str(); + BOOST_FAIL("Expected string not found."); + } +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/ExecuteNetwork/ExecuteNetwork.cpp b/tests/ExecuteNetwork/ExecuteNetwork.cpp index 3c0301010d..3a63fffeae 100644 --- a/tests/ExecuteNetwork/ExecuteNetwork.cpp +++ b/tests/ExecuteNetwork/ExecuteNetwork.cpp @@ -33,6 +33,7 @@ int main(int argc, const char* argv[]) std::string outgoingCaptureFile; std::string incomingCaptureFile; uint32_t counterCapturePeriod; + std::string fileFormat; double thresholdTime = 0.0; @@ -114,6 +115,8 @@ int main(int argc, const char* argv[]) "If enabled then the 'file-only' test mode of external profiling will be enabled") ("counter-capture-period,u", po::value<uint32_t>(&counterCapturePeriod)->default_value(150u), "If profiling is enabled in 'file-only' mode this is the capture period that will be used in the test") + ("file-format,ff", po::value(&fileFormat), + "If profiling is enabled specifies the output file format") ("parse-unsupported", po::bool_switch()->default_value(false), "Add unsupported operators as stand-in layers (where supported by parser)"); } @@ -187,13 +190,14 @@ int main(int argc, const char* argv[]) // Create runtime armnn::IRuntime::CreationOptions options; - options.m_EnableGpuProfiling = enableProfiling; - options.m_DynamicBackendsPath = dynamicBackendsPath; - options.m_ProfilingOptions.m_EnableProfiling = enableExternalProfiling; + options.m_EnableGpuProfiling = enableProfiling; + options.m_DynamicBackendsPath = dynamicBackendsPath; + options.m_ProfilingOptions.m_EnableProfiling = enableExternalProfiling; options.m_ProfilingOptions.m_IncomingCaptureFile = incomingCaptureFile; options.m_ProfilingOptions.m_OutgoingCaptureFile = outgoingCaptureFile; - options.m_ProfilingOptions.m_FileOnly = fileOnlyExternalProfiling; - options.m_ProfilingOptions.m_CapturePeriod = counterCapturePeriod; + options.m_ProfilingOptions.m_FileOnly = fileOnlyExternalProfiling; + options.m_ProfilingOptions.m_CapturePeriod = counterCapturePeriod; + options.m_ProfilingOptions.m_FileFormat = fileFormat; std::shared_ptr<armnn::IRuntime> runtime(armnn::IRuntime::Create(options)); const std::string executableName("ExecuteNetwork"); @@ -271,6 +275,7 @@ int main(int argc, const char* argv[]) options.m_ProfilingOptions.m_OutgoingCaptureFile = outgoingCaptureFile; options.m_ProfilingOptions.m_FileOnly = fileOnlyExternalProfiling; options.m_ProfilingOptions.m_CapturePeriod = counterCapturePeriod; + options.m_ProfilingOptions.m_FileFormat = fileFormat; std::shared_ptr<armnn::IRuntime> runtime(armnn::IRuntime::Create(options)); return RunTest(modelFormat, inputTensorShapes, computeDevices, dynamicBackendsPath, modelPath, inputNames, |