blob: 5539e885d8cef22a32b09bce0c72f096467353a2 [file] [log] [blame]
telsoa01c577f2c2018-08-31 09:22:23 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa01c577f2c2018-08-31 09:22:23 +01004//
5
6#pragma once
7
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <Instrument.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01009
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010010#include <arm_compute/runtime/CL/CLScheduler.h>
11#include <arm_compute/core/CL/OpenCL.h>
telsoa01c577f2c2018-08-31 09:22:23 +010012
13#include <vector>
14#include <list>
15
16namespace armnn
17{
18
19/// OpenClTimer instrument that times all OpenCl kernels executed between calls to Start() and Stop().
20class OpenClTimer : public Instrument
21{
22public:
23 OpenClTimer();
24 ~OpenClTimer() = default;
25
26 /// Start the OpenCl timer
27 void Start() override;
28
29 /// Stop the OpenCl timer
30 void Stop() override;
31
32 /// Get the name of the timer
33 /// \return Name of the timer
34 const char* GetName() const override { return "OpenClKernelTimer"; }
35
36 /// Get the recorded measurements. This will be a list of the execution durations for all the OpenCl kernels.
37 /// \return Recorded measurements
38 std::vector<Measurement> GetMeasurements() const override;
39
40private:
41 using CLScheduler = arm_compute::CLScheduler;
42 using CLSymbols = arm_compute::CLSymbols;
43 using ClEvent = cl::Event;
44 using ClEnqueueFunc = decltype(CLSymbols::clEnqueueNDRangeKernel_ptr);
45
46 /// Stores info about the OpenCl kernel
47 struct KernelInfo
48 {
49 KernelInfo(const std::string& name, cl_event& event) : m_Name(name), m_Event(event) {}
50
51 std::string m_Name;
52 ClEvent m_Event;
53 };
54
55 std::list<KernelInfo> m_Kernels; ///< List of all kernels executed
56 ClEnqueueFunc m_OriginalEnqueueFunction; ///< Keep track of original OpenCl function
57};
58
59} //namespace armnn