From 12833d063259cb7809a97a4262f821efdc40554f Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Thu, 25 Jul 2019 13:31:10 +0100 Subject: COMPMID-2204: RuntimeContext interface for NEON functions. This patch creates the interfaces for the runtime context for NEON. Only the Neon backend implements the context which currently only holds an instance of the scheduler. The NEActivationLayer function has been updated to use the new context interface and the corresponding validation tests ported. Change-Id: I32e7e6aa888796dcbbfc5039b1e7f784a24f47da Signed-off-by: Pablo Tello Reviewed-on: https://review.mlplatform.org/c/1851 Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio --- tests/framework/Framework.cpp | 12 ++++++++++- tests/framework/Framework.h | 9 ++++++++- tests/framework/instruments/Instruments.h | 9 ++++++++- tests/framework/instruments/SchedulerTimer.cpp | 28 +++++++++++++++++++++++++- tests/framework/instruments/SchedulerTimer.h | 27 +++++++++++++++++++++++-- 5 files changed, 79 insertions(+), 6 deletions(-) (limited to 'tests/framework') diff --git a/tests/framework/Framework.cpp b/tests/framework/Framework.cpp index cc7852906c..fbc2456047 100644 --- a/tests/framework/Framework.cpp +++ b/tests/framework/Framework.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -40,6 +40,8 @@ namespace test { namespace framework { +std::unique_ptr instruments_info; + Framework::Framework() { _available_instruments.emplace(std::pair(InstrumentType::WALL_CLOCK_TIMESTAMPS, ScaleFactor::NONE), Instrument::make_instrument); @@ -83,6 +85,8 @@ Framework::Framework() _available_instruments.emplace(std::pair(InstrumentType::OPENCL_MEMORY_USAGE, ScaleFactor::SCALE_1M), Instrument::make_instrument); #endif /* ARM_COMPUTE_CL */ + + instruments_info = support::cpp14::make_unique(); } std::set Framework::available_instruments() const @@ -679,6 +683,12 @@ LogLevel Framework::log_level() const { return _log_level; } + +void Framework::set_instruments_info(InstrumentsInfo instr_info) +{ + ARM_COMPUTE_ERROR_ON(instruments_info == nullptr); + *instruments_info = instr_info; +} } // namespace framework } // namespace test } // namespace arm_compute diff --git a/tests/framework/Framework.h b/tests/framework/Framework.h index 65ffc0a818..c02416f9b5 100644 --- a/tests/framework/Framework.h +++ b/tests/framework/Framework.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -293,6 +293,13 @@ public: * @return The current logging level. */ LogLevel log_level() const; + /** Sets instruments info + * + * @note TODO(COMPMID-2638) : Remove once instruments are transferred outside the framework. + * + * @param[in] instr_info Instruments info to set + */ + void set_instruments_info(InstrumentsInfo instr_info); private: Framework(); diff --git a/tests/framework/instruments/Instruments.h b/tests/framework/instruments/Instruments.h index 370db8d4dc..8adf501c18 100644 --- a/tests/framework/instruments/Instruments.h +++ b/tests/framework/instruments/Instruments.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -33,6 +33,7 @@ #include "SchedulerTimer.h" #include "WallClockTimer.h" +#include #include #include @@ -59,6 +60,12 @@ enum class InstrumentType : unsigned int SCHEDULER_TIMESTAMPS = 0x0900, }; +struct InstrumentsInfo +{ + std::vector _scheduler_users{}; +}; +extern std::unique_ptr instruments_info; + using InstrumentsDescription = std::pair; InstrumentsDescription instrument_type_from_name(const std::string &name); diff --git a/tests/framework/instruments/SchedulerTimer.cpp b/tests/framework/instruments/SchedulerTimer.cpp index c114dfbd9d..98c9b878d9 100644 --- a/tests/framework/instruments/SchedulerTimer.cpp +++ b/tests/framework/instruments/SchedulerTimer.cpp @@ -23,6 +23,7 @@ */ #include "SchedulerTimer.h" +#include "Instruments.h" #include "WallClockTimer.h" #include "arm_compute/core/CPP/ICPPKernel.h" #include "arm_compute/core/utils/misc/Cast.h" @@ -114,8 +115,12 @@ private: template SchedulerClock::SchedulerClock(ScaleFactor scale_factor) - : _kernels(), _real_scheduler(nullptr), _real_scheduler_type(), _real_graph_function(nullptr), _scale_factor(scale_factor), _interceptor(nullptr) + : _kernels(), _real_scheduler(nullptr), _real_scheduler_type(), _real_graph_function(nullptr), _scale_factor(scale_factor), _interceptor(nullptr), _scheduler_users() { + if(instruments_info != nullptr) + { + _scheduler_users = instruments_info->_scheduler_users; + } } template @@ -157,6 +162,17 @@ void SchedulerClock::test_start() _interceptor = std::make_shared>(_kernels, *_real_scheduler, _scale_factor); Scheduler::set(std::static_pointer_cast(_interceptor)); graph::TaskExecutor::get().execute_function = task_interceptor; + + // Create an interceptor for each scheduler + // TODO(COMPID-2638) : Allow multiple schedulers, now it assumes the same scheduler is used. + std::for_each(std::begin(_scheduler_users), std::end(_scheduler_users), + [&](ISchedulerUser * user) + { + if(user != nullptr && user->scheduler() != nullptr) + { + user->intercept_scheduler(support::cpp14::make_unique>(_kernels, *user->scheduler(), _scale_factor)); + } + }); } } @@ -175,6 +191,16 @@ void SchedulerClock::test_stop() _interceptor = nullptr; graph::TaskExecutor::get().execute_function = _real_graph_function; _real_graph_function = nullptr; + + // Restore schedulers + std::for_each(std::begin(_scheduler_users), std::end(_scheduler_users), + [&](ISchedulerUser * user) + { + if(user != nullptr) + { + user->restore_scheduler(); + } + }); } template diff --git a/tests/framework/instruments/SchedulerTimer.h b/tests/framework/instruments/SchedulerTimer.h index 64adb488ae..ea64b227eb 100644 --- a/tests/framework/instruments/SchedulerTimer.h +++ b/tests/framework/instruments/SchedulerTimer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2019 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -29,6 +29,8 @@ #include "arm_compute/runtime/Scheduler.h" #include +#include +#include namespace arm_compute { @@ -36,6 +38,26 @@ namespace test { namespace framework { +/** Scheduler user interface */ +class ISchedulerUser +{ +public: + /** Default Destructor */ + virtual ~ISchedulerUser() = default; + /** Intercept the scheduler used by + * + * @param interceptor Intercept the scheduler used by the scheduler user. + */ + virtual void intercept_scheduler(std::unique_ptr interceptor) = 0; + /** Restore the original scheduler */ + virtual void restore_scheduler() = 0; + /** Real scheduler accessor + * + * @return The real scheduler + */ + virtual IScheduler *scheduler() = 0; +}; + /** Instrument creating measurements based on the information returned by clGetEventProfilingInfo for each OpenCL kernel executed*/ template class SchedulerClock : public Instrument @@ -46,7 +68,6 @@ public: * @param[in] scale_factor Measurement scale factor. */ SchedulerClock(ScaleFactor scale_factor); - /** Prevent instances of this class from being copy constructed */ SchedulerClock(const SchedulerClock &) = delete; /** Prevent instances of this class from being copied */ @@ -58,6 +79,7 @@ public: /** Use the default destructor */ ~SchedulerClock() = default; + // Inherited overridden methods std::string id() const override; void test_start() override; void start() override; @@ -79,6 +101,7 @@ private: std::function _real_graph_function; ScaleFactor _scale_factor; std::shared_ptr _interceptor; + std::vector _scheduler_users; }; using SchedulerTimer = SchedulerClock; -- cgit v1.2.1