From 185faf99bd580a2108aed479f42aeb51fdb9ae92 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 18 Oct 2017 15:59:16 +0300 Subject: [PATCH] ocl: simplify ocl::Timer interface --- modules/core/include/opencv2/core/ocl.hpp | 11 ++-- modules/core/src/ocl.cpp | 59 +++++-------------- .../src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp | 6 +- 3 files changed, 24 insertions(+), 52 deletions(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index c36252ad3b..5f13e04ea9 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -742,13 +742,16 @@ public: ~Timer(); void start(); void stop(); - float milliSeconds(); - float microSeconds(); - float seconds(); + + uint64 durationNS() const; //< duration in nanoseconds protected: struct Impl; - Impl* p; + Impl* const p; + +private: + Timer(const Timer&); // disabled + Timer& operator=(const Timer&); // disabled }; CV_EXPORTS MatAllocator* getOpenCLAllocator(); diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index b523308022..984307e3fc 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -5288,68 +5288,37 @@ struct Timer::Impl #endif } - float microSeconds() + uint64 durationNS() const { #ifdef HAVE_OPENCL - return (float)timer.getTimeMicro(); + return (uint64)(timer.getTimeSec() * 1e9); #else return 0; #endif } - float milliSeconds() - { -#ifdef HAVE_OPENCL - return (float)timer.getTimeMilli(); -#else - return 0; -#endif - } - - float seconds() - { -#ifdef HAVE_OPENCL - return (float)timer.getTimeSec(); -#else - return 0; -#endif - } TickMeter timer; }; -Timer::Timer(const Queue& q) -{ - p = new Impl(q); -} - -Timer::~Timer() -{ - if(p) - { - delete p; - p = 0; - } -} +Timer::Timer(const Queue& q) : p(new Impl(q)) { } +Timer::~Timer() { delete p; } void Timer::start() { - if(p) - p->start(); + CV_Assert(p); + p->start(); } void Timer::stop() { - if(p) - p->stop(); + CV_Assert(p); + p->stop(); } -float Timer::microSeconds() -{ return p ? p->microSeconds() : 0; } +uint64 Timer::durationNS() const +{ + CV_Assert(p); + return p->durationNS(); +} -float Timer::milliSeconds() -{ return p ? p->milliSeconds() : 0; } - -float Timer::seconds() -{ return p ? p->seconds() : 0; } - -}} +}} // namespace diff --git a/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp b/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp index 13d5afb165..cd94e44509 100644 --- a/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp +++ b/modules/dnn/src/ocl4dnn/src/ocl4dnn_conv_spatial.cpp @@ -890,7 +890,7 @@ float OCL4DNNConvSpatial::timedConvolve(const UMat &bottom, UMat &top, return 1e5; } - float elapsedTime = timer.milliSeconds() / loop_cnt; + float elapsedTime = timer.durationNS() * 1e-6 / loop_cnt; #ifdef dbg double out_w = output_w_; double out_h = output_h_; @@ -899,9 +899,9 @@ float OCL4DNNConvSpatial::timedConvolve(const UMat &bottom, UMat &top, double k_h = kernel_h_; double k_z = channels_; double totalFlops = ((k_w*k_h*k_z -1)*2)*(out_w*out_h*out_z)*num_; - std::cout << "\tEstimated Gflops:" << ((totalFlops/1000)/1000)/1000 + std::cout << "\tEstimated Gflops:" << (totalFlops * 1e-9) << std::endl; - std::cout << "\tEstimated GFLOPS/S: " << (((totalFlops/1000)/1000)/1000)*(1000.0/elapsedTime) + std::cout << "\tEstimated GFLOPS/S: " << ((totalFlops * 1e-9)*(1000.0/elapsedTime)) << std::endl; #if 0 std::cout << "Estimated utilization: " <<