[Mesa-dev] [PATCH 1/6] st/clover: Profiling support

Tom Stellard tom at stellard.net
Mon Aug 26 18:28:47 PDT 2013


I've pushed this patch, thanks.

-Tom

On Fri, Aug 09, 2013 at 11:59:25AM +0200, Niels Ole Salscheider wrote:
> Signed-off-by: Niels Ole Salscheider <niels_ole at salscheider-online.de>
> ---
>  src/gallium/state_trackers/clover/api/event.cpp  |  26 ++++-
>  src/gallium/state_trackers/clover/core/event.cpp | 116 ++++++++++++++++++++---
>  src/gallium/state_trackers/clover/core/event.hpp |  18 +++-
>  3 Dateien geändert, 142 Zeilen hinzugefügt(+), 18 Zeilen entfernt(-)
> 
> diff --git a/src/gallium/state_trackers/clover/api/event.cpp b/src/gallium/state_trackers/clover/api/event.cpp
> index 39a647b..ea1576c 100644
> --- a/src/gallium/state_trackers/clover/api/event.cpp
> +++ b/src/gallium/state_trackers/clover/api/event.cpp
> @@ -217,7 +217,31 @@ clEnqueueWaitForEvents(cl_command_queue q, cl_uint num_evs,
>  PUBLIC cl_int
>  clGetEventProfilingInfo(cl_event ev, cl_profiling_info param,
>                          size_t size, void *buf, size_t *size_ret) {
> -   return CL_PROFILING_INFO_NOT_AVAILABLE;
> +   hard_event *hev = dynamic_cast<hard_event *>(ev);
> +   soft_event *sev = dynamic_cast<soft_event *>(ev);
> +
> +   if (!hev && !sev)
> +      return CL_INVALID_EVENT;
> +   if (!hev || !(hev->queue()->props() & CL_QUEUE_PROFILING_ENABLE) ||
> +       hev->status() != CL_COMPLETE)
> +      return CL_PROFILING_INFO_NOT_AVAILABLE;
> +
> +   switch (param) {
> +   case CL_PROFILING_COMMAND_QUEUED:
> +      return scalar_property<cl_ulong>(buf, size, size_ret, hev->ts_queued());
> +
> +   case CL_PROFILING_COMMAND_SUBMIT:
> +      return scalar_property<cl_ulong>(buf, size, size_ret, hev->ts_submit());
> +
> +   case CL_PROFILING_COMMAND_START:
> +      return scalar_property<cl_ulong>(buf, size, size_ret, hev->ts_start());
> +
> +   case CL_PROFILING_COMMAND_END:
> +      return scalar_property<cl_ulong>(buf, size, size_ret, hev->ts_end());
> +
> +   default:
> +      return CL_INVALID_VALUE;
> +   }
>  }
>  
>  PUBLIC cl_int
> diff --git a/src/gallium/state_trackers/clover/core/event.cpp b/src/gallium/state_trackers/clover/core/event.cpp
> index 93d3b58..de21f0c 100644
> --- a/src/gallium/state_trackers/clover/core/event.cpp
> +++ b/src/gallium/state_trackers/clover/core/event.cpp
> @@ -38,18 +38,6 @@ _cl_event::~_cl_event() {
>  }
>  
>  void
> -_cl_event::trigger() {
> -   if (!--wait_count) {
> -      action_ok(*this);
> -
> -      while (!__chain.empty()) {
> -         __chain.back()->trigger();
> -         __chain.pop_back();
> -      }
> -   }
> -}
> -
> -void
>  _cl_event::abort(cl_int status) {
>     __status = status;
>     action_fail(*this);
> @@ -77,14 +65,61 @@ _cl_event::chain(clover::event *ev) {
>  hard_event::hard_event(clover::command_queue &q, cl_command_type command,
>                         std::vector<clover::event *> deps, action action) :
>     _cl_event(q.ctx, deps, action, [](event &ev){}),
> -   __queue(q), __command(command), __fence(NULL) {
> +   __queue(q), __command(command), __fence(NULL),
> +   __query_start(NULL), __query_end(NULL) {
>     q.sequence(this);
> +
> +   if(q.props() & CL_QUEUE_PROFILING_ENABLE) {
> +      pipe_screen *screen = q.dev.pipe;
> +      __ts_queued = screen->get_timestamp(screen);
> +   }
> +
>     trigger();
>  }
>  
>  hard_event::~hard_event() {
>     pipe_screen *screen = queue()->dev.pipe;
> +   pipe_context *pipe = queue()->pipe;
>     screen->fence_reference(screen, &__fence, NULL);
> +
> +   if(__query_start) {
> +      pipe->destroy_query(pipe, __query_start);
> +      __query_start = 0;
> +   }
> +
> +   if(__query_end) {
> +      pipe->destroy_query(pipe, __query_end);
> +      __query_end = 0;
> +   }
> +}
> +
> +void
> +hard_event::trigger() {
> +   if (!--wait_count) {
> +   /* XXX: Currently, a timestamp query gives wrong results for memory
> +    * transfers. This is, because we use memcpy instead of the DMA engines. */
> +
> +      if(queue()->props() & CL_QUEUE_PROFILING_ENABLE) {
> +         pipe_context *pipe = queue()->pipe;
> +         __query_start = pipe->create_query(pipe, PIPE_QUERY_TIMESTAMP);
> +         pipe->end_query(queue()->pipe, __query_start);
> +      }
> +
> +      action_ok(*this);
> +
> +      if(queue()->props() & CL_QUEUE_PROFILING_ENABLE) {
> +         pipe_context *pipe = queue()->pipe;
> +         pipe_screen *screen = queue()->dev.pipe;
> +         __query_end = pipe->create_query(pipe, PIPE_QUERY_TIMESTAMP);
> +         pipe->end_query(pipe, __query_end);
> +         __ts_submit = screen->get_timestamp(screen);
> +      }
> +
> +      while (!__chain.empty()) {
> +         __chain.back()->trigger();
> +         __chain.pop_back();
> +      }
> +   }
>  }
>  
>  cl_int
> @@ -126,6 +161,49 @@ hard_event::wait() const {
>        throw error(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
>  }
>  
> +cl_ulong
> +hard_event::ts_queued() const {
> +   return __ts_queued;
> +}
> +
> +cl_ulong
> +hard_event::ts_submit() const {
> +   return __ts_submit;
> +}
> +
> +cl_ulong
> +hard_event::ts_start() {
> +   get_query_results();
> +   return __ts_start;
> +}
> +
> +cl_ulong
> +hard_event::ts_end() {
> +   get_query_results();
> +   return __ts_end;
> +}
> +
> +void
> +hard_event::get_query_results() {
> +   pipe_context *pipe = queue()->pipe;
> +
> +   if(__query_start) {
> +      pipe_query_result result;
> +      pipe->get_query_result(pipe, __query_start, true, &result);
> +      __ts_start = result.u64;
> +      pipe->destroy_query(pipe, __query_start);
> +      __query_start = 0;
> +   }
> +
> +   if(__query_end) {
> +      pipe_query_result result;
> +      pipe->get_query_result(pipe, __query_end, true, &result);
> +      __ts_end = result.u64;
> +      pipe->destroy_query(pipe, __query_end);
> +      __query_end = 0;
> +   }
> +}
> +
>  void
>  hard_event::fence(pipe_fence_handle *fence) {
>     pipe_screen *screen = queue()->dev.pipe;
> @@ -140,6 +218,18 @@ soft_event::soft_event(clover::context &ctx,
>        trigger();
>  }
>  
> +void
> +soft_event::trigger() {
> +   if (!--wait_count) {
> +      action_ok(*this);
> +
> +      while (!__chain.empty()) {
> +         __chain.back()->trigger();
> +         __chain.pop_back();
> +      }
> +   }
> +}
> +
>  cl_int
>  soft_event::status() const {
>     if (__status < 0)
> diff --git a/src/gallium/state_trackers/clover/core/event.hpp b/src/gallium/state_trackers/clover/core/event.hpp
> index eb81953..de92de0 100644
> --- a/src/gallium/state_trackers/clover/core/event.hpp
> +++ b/src/gallium/state_trackers/clover/core/event.hpp
> @@ -57,7 +57,7 @@ public:
>               action action_ok, action action_fail);
>     virtual ~_cl_event();
>  
> -   void trigger();
> +   virtual void trigger() = 0;
>     void abort(cl_int status);
>     bool signalled() const;
>  
> @@ -72,12 +72,10 @@ protected:
>     void chain(clover::event *ev);
>  
>     cl_int __status;
> -   std::vector<clover::ref_ptr<clover::event>> deps;
> -
> -private:
>     unsigned wait_count;
>     action action_ok;
>     action action_fail;
> +   std::vector<clover::ref_ptr<clover::event>> deps;
>     std::vector<clover::ref_ptr<clover::event>> __chain;
>  };
>  
> @@ -101,11 +99,19 @@ namespace clover {
>                   action action = [](event &){});
>        ~hard_event();
>  
> +      virtual void trigger();
> +
>        virtual cl_int status() const;
>        virtual cl_command_queue queue() const;
>        virtual cl_command_type command() const;
>        virtual void wait() const;
>  
> +      cl_ulong ts_queued() const;
> +      cl_ulong ts_submit() const;
> +      cl_ulong ts_start();
> +      cl_ulong ts_end();
> +      void get_query_results();
> +
>        friend class ::_cl_command_queue;
>  
>     private:
> @@ -114,6 +120,8 @@ namespace clover {
>        clover::command_queue &__queue;
>        cl_command_type __command;
>        pipe_fence_handle *__fence;
> +      cl_ulong __ts_queued, __ts_submit, __ts_start, __ts_end;
> +      struct pipe_query *__query_start, *__query_end;
>     };
>  
>     ///
> @@ -128,6 +136,8 @@ namespace clover {
>        soft_event(clover::context &ctx, std::vector<clover::event *> deps,
>                   bool trigger, action action = [](event &){});
>  
> +      virtual void trigger();
> +
>        virtual cl_int status() const;
>        virtual cl_command_queue queue() const;
>        virtual cl_command_type command() const;
> -- 
> 1.7.11.7
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list