From 55634c1f52e9bdaadeba6a5a6f836b2bd2666d65 Mon Sep 17 00:00:00 2001 From: Konstantin Matskevich Date: Mon, 30 Dec 2013 13:06:32 +0400 Subject: [PATCH] fix --- modules/core/include/opencv2/core/ocl.hpp | 1 + modules/core/src/ocl.cpp | 10 ++++++++++ modules/imgproc/src/clahe.cpp | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 3112766796..e3805bcdc1 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -489,6 +489,7 @@ public: bool runTask(bool sync, const Queue& q=Queue()); size_t workGroupSize() const; + size_t preferedWorkGroupSizeMultiple() const; bool compileWorkGroupSize(size_t wsz[]) const; size_t localMemSize() const; diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 7b64440513..2369c470e3 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -2813,6 +2813,16 @@ size_t Kernel::workGroupSize() const sizeof(val), &val, &retsz) >= 0 ? val : 0; } +size_t Kernel::preferedWorkGroupSizeMultiple() const +{ + if(!p) + return 0; + size_t val = 0, retsz = 0; + cl_device_id dev = (cl_device_id)Device::getDefault().ptr(); + return clGetKernelWorkGroupInfo(p->handle, dev, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, + sizeof(val), &val, &retsz) >= 0 ? val : 0; +} + bool Kernel::compileWorkGroupSize(size_t wsz[]) const { if(!p || !wsz) diff --git a/modules/imgproc/src/clahe.cpp b/modules/imgproc/src/clahe.cpp index c4646b40a5..079e635f94 100644 --- a/modules/imgproc/src/clahe.cpp +++ b/modules/imgproc/src/clahe.cpp @@ -51,12 +51,14 @@ namespace clahe const int tilesX, const int tilesY, const cv::Size tileSize, const int clipLimit, const float lutScale) { + cv::ocl::Kernel _k("calcLut", cv::ocl::imgproc::clahe_oclsrc); + bool is_cpu = cv::ocl::Device::getDefault().type() == cv::ocl::Device::TYPE_CPU; cv::String opts; if(is_cpu) opts = "-D CPU "; else - opts = cv::format("-D WAVE_SIZE=%d", cv::ocl::Device::getDefault().maxWorkGroupSize()); + opts = cv::format("-D WAVE_SIZE=%d", _k.preferedWorkGroupSizeMultiple()); cv::ocl::Kernel k("calcLut", cv::ocl::imgproc::clahe_oclsrc, opts); if(k.empty()) -- GitLab