diff --git a/paddle/fluid/pybind/cuda_streams_py.cc b/paddle/fluid/pybind/cuda_streams_py.cc index 22910ce9756d6f..422664b678a9a2 100644 --- a/paddle/fluid/pybind/cuda_streams_py.cc +++ b/paddle/fluid/pybind/cuda_streams_py.cc @@ -374,6 +374,32 @@ void BindCudaStream(py::module *m_ptr) { >>> event = paddle.device.cuda.Event() >>> is_done = event.query() + )DOC") + .def( + "elapsed_time", + [](phi::CudaEvent &self, phi::CudaEvent &end_event) { + return self.ElapsedTime(&end_event); + }, + R"DOC( + Returns the time elapsed in milliseconds after the event was + recorded and before the end_event was recorded. + + Returns: A int which indicates the elapsed time. + + Examples: + .. code-block:: python + + >>> # doctest: +REQUIRES(env:GPU) + >>> import paddle + + >>> paddle.set_device('gpu') + >>> e1 = paddle.device.Event(enable_timing=True) + >>> e1.record() + + >>> e2 = paddle.device.Event(enable_timing=True) + >>> e2.record() + >>> e1.elapsed_time(e2) + )DOC") .def( "synchronize", diff --git a/paddle/phi/api/profiler/event.h b/paddle/phi/api/profiler/event.h index eb765ebdcb9dd3..e8d6d2202be11f 100644 --- a/paddle/phi/api/profiler/event.h +++ b/paddle/phi/api/profiler/event.h @@ -196,6 +196,20 @@ class CudaEvent { return false; } + float ElapsedTime(CudaEvent *end_event) { + float milliseconds = 0; +#ifdef PADDLE_WITH_HIP + hipEventSynchronize(end_event->GetRawCudaEvent()); + PADDLE_ENFORCE_GPU_SUCCESS(hipEventElapsedTime( + &milliseconds, event_, end_event->GetRawCudaEvent())); +#else + cudaEventSynchronize(end_event->GetRawCudaEvent()); + PADDLE_ENFORCE_GPU_SUCCESS(cudaEventElapsedTime( + &milliseconds, event_, end_event->GetRawCudaEvent())); +#endif + return milliseconds; + } + void Synchronize() { #ifdef PADDLE_WITH_HIP PADDLE_ENFORCE_GPU_SUCCESS(hipEventSynchronize(event_)); diff --git a/python/paddle/device/__init__.py b/python/paddle/device/__init__.py index 8152d8597a3637..0bc52dfcfd00a5 100644 --- a/python/paddle/device/__init__.py +++ b/python/paddle/device/__init__.py @@ -604,7 +604,7 @@ def elapsed_time(self, end_event: Event) -> int: >>> e1.elapsed_time(e2) ''' - return 0 + return self.event_base.elapsed_time(end_event.event_base) def synchronize(self) -> None: '''