From fcb802bf62a092806041785cd6081cb99c518527 Mon Sep 17 00:00:00 2001 From: Colm Donelan Date: Thu, 13 Feb 2020 20:47:08 +0000 Subject: IVGCVSW-4340 Backend profiling: Add tests for Timeline functions * Add tests for the timeline functions that are part of IBackendProfiling: GetSendTimelinePacket & GetProfilingGuidGenerator * Modify MockBackendProfilingService to store a MockBackendProfilingContext shared pointer. Signed-off-by: Colm Donelan Change-Id: I99fc4b1da019858b9f29409cd59ef8f590c0d3a2 --- .../backendsCommon/test/BackendProfilingTests.cpp | 68 ++++++++++++++++- src/backends/backendsCommon/test/MockBackend.cpp | 4 +- src/backends/backendsCommon/test/MockBackend.hpp | 87 +++++++++++----------- 3 files changed, 112 insertions(+), 47 deletions(-) diff --git a/src/backends/backendsCommon/test/BackendProfilingTests.cpp b/src/backends/backendsCommon/test/BackendProfilingTests.cpp index 6e4a020fa5..455533699d 100644 --- a/src/backends/backendsCommon/test/BackendProfilingTests.cpp +++ b/src/backends/backendsCommon/test/BackendProfilingTests.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -442,4 +443,69 @@ BOOST_AUTO_TEST_CASE(TestBackendCounterLogging) BOOST_CHECK(boost::contains(ss.str(), "ActivateCounters example test error")); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_CASE(BackendProfilingContextGetSendTimelinePacket) +{ + // Reset the profiling service to the uninitialized state + armnn::IRuntime::CreationOptions options; + options.m_ProfilingOptions.m_EnableProfiling = true; + armnn::profiling::ProfilingService& profilingService = armnn::profiling::ProfilingService::Instance(); + profilingService.ConfigureProfilingService(options.m_ProfilingOptions, true); + + armnn::MockBackendInitialiser initialiser; + // Create a runtime. During this the mock backend will be registered and context returned. + armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); + armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance(); + armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext(); + // Check that there is a valid context set. + BOOST_CHECK(mockBackEndProfilingContext); + armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface = + mockBackEndProfilingContext->GetBackendProfiling(); + BOOST_CHECK(backendProfilingIface); + + // Now for the meat of the test. We're just going to send a random packet and make sure there + // are no exceptions or errors. The sending of packets is already tested in SendTimelinePacketTests. + std::unique_ptr timelinePacket = + backendProfilingIface->GetSendTimelinePacket(); + // Send TimelineEntityClassBinaryPacket + const uint64_t entityBinaryPacketProfilingGuid = 123456u; + timelinePacket->SendTimelineEntityBinaryPacket(entityBinaryPacketProfilingGuid); + timelinePacket->Commit(); + + // Reset the profiling servie after the test. + options.m_ProfilingOptions.m_EnableProfiling = false; + profilingService.ResetExternalProfilingOptions(options.m_ProfilingOptions, true); +} + +BOOST_AUTO_TEST_CASE(GetProfilingGuidGenerator) +{ + // Reset the profiling service to the uninitialized state + armnn::IRuntime::CreationOptions options; + options.m_ProfilingOptions.m_EnableProfiling = true; + armnn::profiling::ProfilingService& profilingService = armnn::profiling::ProfilingService::Instance(); + profilingService.ConfigureProfilingService(options.m_ProfilingOptions, true); + + armnn::MockBackendInitialiser initialiser; + // Create a runtime. During this the mock backend will be registered and context returned. + armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); + armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance(); + armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext(); + // Check that there is a valid context set. + BOOST_CHECK(mockBackEndProfilingContext); + armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface = + mockBackEndProfilingContext->GetBackendProfiling(); + BOOST_CHECK(backendProfilingIface); + + // Get the Guid generator and check the getting two Guid's results in the second being greater than the first. + armnn::profiling::IProfilingGuidGenerator& guidGenerator = backendProfilingIface->GetProfilingGuidGenerator(); + BOOST_CHECK(backendProfilingIface); + const armnn::profiling::ProfilingDynamicGuid& firstGuid = guidGenerator.NextGuid(); + BOOST_CHECK(firstGuid); + const armnn::profiling::ProfilingDynamicGuid& secondGuid = guidGenerator.NextGuid(); + BOOST_CHECK(secondGuid > firstGuid); + + // Reset the profiling servie after the test. + options.m_ProfilingOptions.m_EnableProfiling = false; + profilingService.ResetExternalProfilingOptions(options.m_ProfilingOptions, true); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/backendsCommon/test/MockBackend.cpp b/src/backends/backendsCommon/test/MockBackend.cpp index 7ad700c786..b2388cf45a 100644 --- a/src/backends/backendsCommon/test/MockBackend.cpp +++ b/src/backends/backendsCommon/test/MockBackend.cpp @@ -109,8 +109,8 @@ IBackendInternal::IBackendProfilingContextPtr MockBackend::CreateBackendProfilin const IRuntime::CreationOptions& options, IBackendProfilingPtr& backendProfiling) { boost::ignore_unused(options); - IBackendInternal::IBackendProfilingContextPtr context = - std::make_shared(MockBackendProfilingContext(backendProfiling)); + std::shared_ptr context = + std::make_shared(backendProfiling); MockBackendProfilingService::Instance().SetProfilingContextPtr(context); return context; } diff --git a/src/backends/backendsCommon/test/MockBackend.hpp b/src/backends/backendsCommon/test/MockBackend.hpp index 641d67ff24..3227ce52fc 100644 --- a/src/backends/backendsCommon/test/MockBackend.hpp +++ b/src/backends/backendsCommon/test/MockBackend.hpp @@ -5,16 +5,16 @@ #pragma once +#include "MockBackendId.hpp" #include "armnn/backends/profiling/IBackendProfiling.hpp" #include "armnn/backends/profiling/IBackendProfilingContext.hpp" -#include "MockBackendId.hpp" #include #include #include -#include #include #include +#include namespace armnn { @@ -26,35 +26,11 @@ public: ~MockBackendInitialiser(); }; -class MockBackendProfilingService -{ -public: - // Getter for the singleton instance - static MockBackendProfilingService& Instance() - { - static MockBackendProfilingService instance; - return instance; - } - - armnn::profiling::IBackendProfilingContext* GetContext() - { - return m_sharedContext.get(); - } - - void SetProfilingContextPtr(IBackendInternal::IBackendProfilingContextPtr& shared) - { - m_sharedContext = shared; - } - -private: - IBackendInternal::IBackendProfilingContextPtr m_sharedContext; -}; - class MockBackendProfilingContext : public profiling::IBackendProfilingContext { public: MockBackendProfilingContext(IBackendInternal::IBackendProfilingPtr& backendProfiling) - : m_BackendProfiling(backendProfiling) + : m_BackendProfiling(std::move(backendProfiling)) , m_CapturePeriod(0) {} @@ -70,23 +46,23 @@ public: std::unique_ptr counterRegistrar = m_BackendProfiling->GetCounterRegistrationInterface(currentMaxGlobalCounterId); - std::string categoryName("MockCounters"); - counterRegistrar->RegisterCategory(categoryName); - uint16_t nextMaxGlobalCounterId = counterRegistrar->RegisterCounter( - 0, categoryName, 0, 0, 1.f, "Mock Counter One", "Some notional counter"); + std::string categoryName("MockCounters"); + counterRegistrar->RegisterCategory(categoryName); + uint16_t nextMaxGlobalCounterId = + counterRegistrar->RegisterCounter(0, categoryName, 0, 0, 1.f, "Mock Counter One", "Some notional counter"); - nextMaxGlobalCounterId = counterRegistrar->RegisterCounter( - 1, categoryName, 0, 0, 1.f, "Mock Counter Two", "Another notional counter"); + nextMaxGlobalCounterId = counterRegistrar->RegisterCounter(1, categoryName, 0, 0, 1.f, "Mock Counter Two", + "Another notional counter"); - std::string units("microseconds"); - nextMaxGlobalCounterId = counterRegistrar->RegisterCounter( - 2, categoryName, 0, 0, 1.f, "Mock MultiCore Counter", "A dummy four core counter", units, 4); - return nextMaxGlobalCounterId; + std::string units("microseconds"); + nextMaxGlobalCounterId = counterRegistrar->RegisterCounter(2, categoryName, 0, 0, 1.f, "Mock MultiCore Counter", + "A dummy four core counter", units, 4); + return nextMaxGlobalCounterId; } Optional ActivateCounters(uint32_t capturePeriod, const std::vector& counterIds) { - if ( capturePeriod == 0 || counterIds.size() == 0) + if (capturePeriod == 0 || counterIds.size() == 0) { m_ActiveCounters.clear(); } @@ -94,7 +70,7 @@ public: { return armnn::Optional("ActivateCounters example test error"); } - m_CapturePeriod = capturePeriod; + m_CapturePeriod = capturePeriod; m_ActiveCounters = counterIds; return armnn::Optional(); } @@ -103,25 +79,48 @@ public: { std::vector counterValues; - for(auto counterId : m_ActiveCounters) + for (auto counterId : m_ActiveCounters) { - counterValues.emplace_back(profiling::CounterValue{counterId, counterId+1u}); + counterValues.emplace_back(profiling::CounterValue{ counterId, counterId + 1u }); } uint64_t timestamp = m_CapturePeriod; - return {profiling::Timestamp{timestamp, counterValues}}; + return { profiling::Timestamp{ timestamp, counterValues } }; } void EnableProfiling(bool) {} private: - - IBackendInternal::IBackendProfilingPtr& m_BackendProfiling; + IBackendInternal::IBackendProfilingPtr m_BackendProfiling; uint32_t m_CapturePeriod; std::vector m_ActiveCounters; }; +class MockBackendProfilingService +{ +public: + // Getter for the singleton instance + static MockBackendProfilingService& Instance() + { + static MockBackendProfilingService instance; + return instance; + } + + MockBackendProfilingContext* GetContext() + { + return m_sharedContext.get(); + } + + void SetProfilingContextPtr(std::shared_ptr shared) + { + m_sharedContext = shared; + } + +private: + std::shared_ptr m_sharedContext; +}; + class MockBackend : public IBackendInternal { public: -- cgit v1.2.1