From 3c2a8912ee3b239ac8b22de4233de82eb7f7007f Mon Sep 17 00:00:00 2001 From: peng xiao Date: Mon, 2 Sep 2013 10:06:01 +0800 Subject: [PATCH] Let clAmdBlas library initialize once during program lifetime. --- modules/ocl/src/gemm.cpp | 47 ++++++++++++++++++++++++++++-- modules/ocl/src/initialization.cpp | 3 ++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/modules/ocl/src/gemm.cpp b/modules/ocl/src/gemm.cpp index 44f23da69c..6e04baca4b 100644 --- a/modules/ocl/src/gemm.cpp +++ b/modules/ocl/src/gemm.cpp @@ -46,16 +46,59 @@ #include #include "precomp.hpp" +namespace cv { namespace ocl { + +// used for clAmdBlas library to avoid redundant setup/teardown +void clBlasSetup(); +void clBlasTeardown(); + +}} /* namespace cv { namespace ocl */ + + #if !defined HAVE_CLAMDBLAS void cv::ocl::gemm(const oclMat&, const oclMat&, double, const oclMat&, double, oclMat&, int) { CV_Error(CV_StsNotImplemented, "OpenCL BLAS is not implemented"); } + +void cv::ocl::clBlasSetup() +{ + CV_Error(CV_StsNotImplemented, "OpenCL BLAS is not implemented"); +} + +void cv::ocl::clBlasTeardown() +{ + CV_Error(CV_StsNotImplemented, "OpenCL BLAS is not implemented"); +} + #else #include "clAmdBlas.h" using namespace cv; +static bool clBlasInitialized = false; +static Mutex cs; + +void cv::ocl::clBlasSetup() +{ + AutoLock al(cs); + if(!clBlasInitialized) + { + openCLSafeCall(clAmdBlasSetup()); + clBlasInitialized = true; + } +} + +void cv::ocl::clBlasTeardown() +{ + AutoLock al(cs); + if(clBlasInitialized) + { + clAmdBlasTeardown(); + clBlasInitialized = false; + } +} + void cv::ocl::gemm(const oclMat &src1, const oclMat &src2, double alpha, const oclMat &src3, double beta, oclMat &dst, int flags) { @@ -71,7 +114,8 @@ void cv::ocl::gemm(const oclMat &src1, const oclMat &src2, double alpha, dst.create(src1.rows, src2.cols, src1.type()); dst.setTo(Scalar::all(0)); } - openCLSafeCall( clAmdBlasSetup() ); + + clBlasSetup(); const clAmdBlasTranspose transA = (cv::GEMM_1_T & flags) ? clAmdBlasTrans : clAmdBlasNoTrans; const clAmdBlasTranspose transB = (cv::GEMM_2_T & flags) ? clAmdBlasTrans : clAmdBlasNoTrans; @@ -156,6 +200,5 @@ void cv::ocl::gemm(const oclMat &src1, const oclMat &src2, double alpha, } break; } - clAmdBlasTeardown(); } #endif diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index b990e09fe0..564b403572 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -68,6 +68,7 @@ namespace cv namespace ocl { extern void fft_teardown(); + extern void clBlasTeardown(); /* * The binary caching system to eliminate redundant program source compilation. * Strictly, this is not a cache because we do not implement evictions right now. @@ -1050,6 +1051,7 @@ namespace cv void Info::release() { fft_teardown(); + clBlasTeardown(); impl->release(); impl = new Impl; DeviceName.clear(); @@ -1058,6 +1060,7 @@ namespace cv Info::~Info() { fft_teardown(); + clBlasTeardown(); impl->release(); }