From: Alexander Alekhin Date: Thu, 19 Jun 2014 11:18:52 +0000 (+0400) Subject: ocl: added runtime flags for debugging X-Git-Tag: submit/tizen_ivi/20141117.190038~2^2~228^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d9daa0cbaa203f76ed2260d9ef8f0ea783ff8a44;p=profile%2Fivi%2Fopencv.git ocl: added runtime flags for debugging --- diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 99fa83a..5ab0d49 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -636,6 +636,9 @@ protected: CV_EXPORTS MatAllocator* getOpenCLAllocator(); +CV_EXPORTS_W bool isPerformanceCheckBypassed(); +#define OCL_PERFORMANCE_CHECK(condition) (cv::ocl::isPerformanceCheckBypassed() || (condition)) + }} #endif diff --git a/modules/core/src/arithm.cpp b/modules/core/src/arithm.cpp index 7ca8b4b..b1e69b7 100644 --- a/modules/core/src/arithm.cpp +++ b/modules/core/src/arithm.cpp @@ -1501,7 +1501,7 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst, Size sz1 = dims1 <= 2 ? psrc1->size() : Size(); Size sz2 = dims2 <= 2 ? psrc2->size() : Size(); #ifdef HAVE_OPENCL - bool use_opencl = _dst.isUMat() && dims1 <= 2 && dims2 <= 2; + bool use_opencl = OCL_PERFORMANCE_CHECK(_dst.isUMat()) && dims1 <= 2 && dims2 <= 2; #endif bool src1Scalar = checkScalar(*psrc1, type2, kind1, kind2); bool src2Scalar = checkScalar(*psrc2, type1, kind2, kind1); @@ -2876,7 +2876,7 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op) haveScalar = true; } - CV_OCL_RUN(_src1.dims() <= 2 && _src2.dims() <= 2 && _dst.isUMat(), + CV_OCL_RUN(_src1.dims() <= 2 && _src2.dims() <= 2 && OCL_PERFORMANCE_CHECK(_dst.isUMat()), ocl_compare(_src1, _src2, _dst, op, haveScalar)) int kind1 = _src1.kind(), kind2 = _src2.kind(); @@ -3206,7 +3206,7 @@ void cv::inRange(InputArray _src, InputArray _lowerb, InputArray _upperb, OutputArray _dst) { CV_OCL_RUN(_src.dims() <= 2 && _lowerb.dims() <= 2 && - _upperb.dims() <= 2 && _dst.isUMat(), + _upperb.dims() <= 2 && OCL_PERFORMANCE_CHECK(_dst.isUMat()), ocl_inRange(_src, _lowerb, _upperb, _dst)) int skind = _src.kind(), lkind = _lowerb.kind(), ukind = _upperb.kind(); diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 24ca6ee..38f9107 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -57,6 +57,28 @@ # endif #endif + +// TODO Move to some common place +static bool getBoolParameter(const char* name, bool defaultValue) +{ + const char* envValue = getenv(name); + if (envValue == NULL) + { + return defaultValue; + } + cv::String value = envValue; + if (value == "1" || value == "True" || value == "true" || value == "TRUE") + { + return true; + } + if (value == "0" || value == "False" || value == "false" || value == "FALSE") + { + return false; + } + CV_ErrorNoReturn(cv::Error::StsBadArg, cv::format("Invalid value for %s parameter: %s", name, value.c_str())); +} + + // TODO Move to some common place static size_t getConfigurationParameterForSize(const char* name, size_t defaultValue) { @@ -1302,10 +1324,22 @@ OCL_FUNC(cl_int, clReleaseEvent, (cl_event event), (event)) #endif +static bool isRaiseError() +{ + static bool initialized = false; + static bool value = false; + if (!initialized) + { + value = getBoolParameter("OPENCV_OPENCL_RAISE_ERROR", false); + initialized = true; + } + return value; +} + #ifdef _DEBUG #define CV_OclDbgAssert CV_DbgAssert #else -#define CV_OclDbgAssert(expr) (void)(expr) +#define CV_OclDbgAssert(expr) do { if (isRaiseError()) { CV_Assert(expr); } else { (void)(expr); } } while ((void)0, 0) #endif namespace cv { namespace ocl { @@ -4695,4 +4729,16 @@ void* Image2D::ptr() const return p ? p->handle : 0; } +bool isPerformanceCheckBypassed() +{ + static bool initialized = false; + static bool value = false; + if (!initialized) + { + value = getBoolParameter("OPENCV_OPENCL_PERF_CHECK_BYPASS", false); + initialized = true; + } + return value; +} + }} diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index 79da3c6..4ae5ffb 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -566,7 +566,7 @@ cv::Scalar cv::sum( InputArray _src ) { #ifdef HAVE_OPENCL Scalar _res; - CV_OCL_RUN_(_src.isUMat() && _src.dims() <= 2, + CV_OCL_RUN_(OCL_PERFORMANCE_CHECK(_src.isUMat()) && _src.dims() <= 2, ocl_sum(_src, _res, OCL_OP_SUM), _res) #endif @@ -717,7 +717,7 @@ int cv::countNonZero( InputArray _src ) #ifdef HAVE_OPENCL int res = -1; - CV_OCL_RUN_(_src.isUMat() && _src.dims() <= 2, + CV_OCL_RUN_(OCL_PERFORMANCE_CHECK(_src.isUMat()) && _src.dims() <= 2, ocl_countNonZero(_src, res), res) #endif @@ -1017,7 +1017,7 @@ static bool ocl_meanStdDev( InputArray _src, OutputArray _mean, OutputArray _sdv void cv::meanStdDev( InputArray _src, OutputArray _mean, OutputArray _sdv, InputArray _mask ) { - CV_OCL_RUN(_src.isUMat() && _src.dims() <= 2, + CV_OCL_RUN(OCL_PERFORMANCE_CHECK(_src.isUMat()) && _src.dims() <= 2, ocl_meanStdDev(_src, _mean, _sdv, _mask)) Mat src = _src.getMat(), mask = _mask.getMat(); @@ -1558,7 +1558,7 @@ void cv::minMaxIdx(InputArray _src, double* minVal, CV_Assert( (cn == 1 && (_mask.empty() || _mask.type() == CV_8U)) || (cn > 1 && _mask.empty() && !minIdx && !maxIdx) ); - CV_OCL_RUN(_src.isUMat() && _src.dims() <= 2 && (_mask.empty() || _src.size() == _mask.size()), + CV_OCL_RUN(OCL_PERFORMANCE_CHECK(_src.isUMat()) && _src.dims() <= 2 && (_mask.empty() || _src.size() == _mask.size()), ocl_minMaxIdx(_src, minVal, maxVal, minIdx, maxIdx, _mask)) Mat src = _src.getMat(), mask = _mask.getMat(); @@ -2218,7 +2218,7 @@ double cv::norm( InputArray _src, int normType, InputArray _mask ) #ifdef HAVE_OPENCL double _result = 0; - CV_OCL_RUN_(_src.isUMat() && _src.dims() <= 2, + CV_OCL_RUN_(OCL_PERFORMANCE_CHECK(_src.isUMat()) && _src.dims() <= 2, ocl_norm(_src, normType, _mask, _result), _result) #endif @@ -2578,7 +2578,7 @@ double cv::norm( InputArray _src1, InputArray _src2, int normType, InputArray _m #ifdef HAVE_OPENCL double _result = 0; - CV_OCL_RUN_(_src1.isUMat(), + CV_OCL_RUN_(OCL_PERFORMANCE_CHECK(_src1.isUMat()), ocl_norm(_src1, _src2, normType, _mask, _result), _result) #endif