diff --git a/modules/core/perf/opencl/perf_arithm.cpp b/modules/core/perf/opencl/perf_arithm.cpp new file mode 100644 index 000000000..8ee691a18 --- /dev/null +++ b/modules/core/perf/opencl/perf_arithm.cpp @@ -0,0 +1,75 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "perf_precomp.hpp" +#include "opencv2/ts/ocl_perf.hpp" + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +///////////// Add //////////////////////// + +typedef Size_MatType AddFixture; + +OCL_PERF_TEST_P(AddFixture, Add, + ::testing::Combine(OCL_TEST_SIZES, + OCL_TEST_TYPES)) +{ + const Size srcSize = GET_PARAM(0); + const int type = GET_PARAM(1); + + checkDeviceMaxMemoryAllocSize(srcSize, type); + + UMat src1(srcSize, type), src2(srcSize, type), dst(srcSize, type); + randu(src1); + randu(src2); + declare.in(src1, src2).out(dst); + + OCL_TEST_CYCLE() cv::add(src1, src2, dst); + + SANITY_CHECK(dst); +} + +} } // namespace cvtest::ocl + +#endif // HAVE_OPENCL diff --git a/modules/imgproc/test/ocl/test_color.cpp b/modules/imgproc/test/ocl/test_color.cpp index 3a5046c79..5bcfa1bac 100644 --- a/modules/imgproc/test/ocl/test_color.cpp +++ b/modules/imgproc/test/ocl/test_color.cpp @@ -44,7 +44,6 @@ //M*/ #include "test_precomp.hpp" -#include "cvconfig.h" #include "opencv2/ts/ocl_test.hpp" #ifdef HAVE_OPENCL diff --git a/modules/imgproc/test/ocl/test_warp.cpp b/modules/imgproc/test/ocl/test_warp.cpp index 6e549a4ec..0090655f2 100644 --- a/modules/imgproc/test/ocl/test_warp.cpp +++ b/modules/imgproc/test/ocl/test_warp.cpp @@ -52,7 +52,6 @@ //M*/ #include "test_precomp.hpp" -#include "cvconfig.h" #include "opencv2/ts/ocl_test.hpp" #ifdef HAVE_OPENCL diff --git a/modules/ts/include/opencv2/ts/ocl_perf.hpp b/modules/ts/include/opencv2/ts/ocl_perf.hpp new file mode 100644 index 000000000..52f815d1c --- /dev/null +++ b/modules/ts/include/opencv2/ts/ocl_perf.hpp @@ -0,0 +1,111 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#ifndef __OPENCV_TS_OCL_PERF_HPP__ +#define __OPENCV_TS_OCL_PERF_HPP__ + +#include "ocl_test.hpp" +#include "ts_perf.hpp" + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +using namespace perf; + +#define OCL_PERF_STRATEGY PERF_STRATEGY_SIMPLE + +#define OCL_PERF_TEST_P(fixture, name, params) SIMPLE_PERF_TEST_P(fixture, name, params) + +#define SIMPLE_PERF_TEST_P(fixture, name, params)\ + class OCL##_##fixture##_##name : public fixture {\ + public:\ + OCL##_##fixture##_##name() {}\ + protected:\ + virtual void PerfTestBody();\ + };\ + TEST_P(OCL##_##fixture##_##name, name){ declare.strategy(OCL_PERF_STRATEGY); RunPerfTestBody(); }\ + INSTANTIATE_TEST_CASE_P(/*none*/, OCL##_##fixture##_##name, params);\ + void OCL##_##fixture##_##name::PerfTestBody() + + +#define OCL_SIZE_1000 Size(1000, 1000) +#define OCL_SIZE_2000 Size(2000, 2000) +#define OCL_SIZE_4000 Size(4000, 4000) + +#define OCL_TEST_SIZES ::testing::Values(OCL_SIZE_1000, OCL_SIZE_2000, OCL_SIZE_4000) +#define OCL_TEST_TYPES ::testing::Values(CV_8UC1, CV_32FC1, CV_8UC4, CV_32FC4) + +#define OCL_PERF_ENUM ::testing::Values + +// TODO Replace finish call to dstUMat.wait() +#define OCL_TEST_CYCLE() \ + for (; startTimer(), next(); cvtest::ocl::perf::safeFinish(), stopTimer()) + +#define OCL_TEST_CYCLE_MULTIRUN(runsNum) \ + for (declare.runs(runsNum); startTimer(), next(); cvtest::ocl::perf::safeFinish(), stopTimer()) \ + for (int r = 0; r < runsNum; cvtest::ocl::perf::safeFinish(), ++r) + +namespace perf { + +// Check for current device limitation +CV_EXPORTS void checkDeviceMaxMemoryAllocSize(const Size& size, int type, int factor = 1); + +// Initialize Mat with random numbers. Range is depends on the data type. +// TODO Parameter type is actually OutputArray +CV_EXPORTS void randu(InputOutputArray dst); + +inline void safeFinish() +{ + if (cv::ocl::useOpenCL()) + cv::ocl::finish2(); +} + +} // namespace perf +using namespace perf; + +} // namespace cvtest::ocl +} // namespace cvtest + +#endif // HAVE_OPENCL + +#endif // __OPENCV_TS_OCL_PERF_HPP__ diff --git a/modules/ts/include/opencv2/ts/ocl_test.hpp b/modules/ts/include/opencv2/ts/ocl_test.hpp index 33520b9b2..b4d28b64b 100644 --- a/modules/ts/include/opencv2/ts/ocl_test.hpp +++ b/modules/ts/include/opencv2/ts/ocl_test.hpp @@ -42,11 +42,11 @@ #ifndef __OPENCV_TS_OCL_TEST_HPP__ #define __OPENCV_TS_OCL_TEST_HPP__ -#ifdef HAVE_OPENCL - -#include "cvconfig.h" +#include "cvconfig.h" // to get definition of HAVE_OPENCL #include "opencv2/opencv_modules.hpp" +#ifdef HAVE_OPENCL + #include "opencv2/ts.hpp" #include "opencv2/highgui.hpp" @@ -123,7 +123,7 @@ using perf::MatType; #define OCL_RNG_SEED 123456 -struct TestUtils +struct CV_EXPORTS TestUtils { cv::RNG rng; @@ -270,7 +270,7 @@ struct TestUtils #define UMAT_UPLOAD_OUTPUT_PARAMETER(name) UMAT_UPLOAD_INPUT_PARAMETER(name) template -struct TSTestWithParam : public TestUtils, public ::testing::TestWithParam +struct CV_EXPORTS TSTestWithParam : public TestUtils, public ::testing::TestWithParam { }; diff --git a/modules/ts/src/ocl_perf.cpp b/modules/ts/src/ocl_perf.cpp new file mode 100644 index 000000000..9151f8889 --- /dev/null +++ b/modules/ts/src/ocl_perf.cpp @@ -0,0 +1,97 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the OpenCV Foundation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "precomp.hpp" + +#include "opencv2/ts/ocl_perf.hpp" + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +namespace perf { + +void checkDeviceMaxMemoryAllocSize(const Size& size, int type, int factor) +{ + assert(factor > 0); + if (!cv::ocl::useOpenCL()) + return; + int cn = CV_MAT_CN(type); + int cn_ocl = cn == 3 ? 4 : cn; + int type_ocl = CV_MAKE_TYPE(CV_MAT_DEPTH(type), cn_ocl); + size_t memSize = size.area() * CV_ELEM_SIZE(type_ocl); + const cv::ocl::Device& dev = cv::ocl::Device::getDefault(); + if (memSize * factor >= dev.maxMemAllocSize()) + { + throw ::perf::TestBase::PerfSkipTestException(); + } +} + +void randu(InputOutputArray dst) +{ + if (dst.depth() == CV_8U) + { + cv::randu(dst, 0, 256); + } + else if (dst.depth() == CV_8S) + { + cv::randu(dst, -128, 128); + } + else if (dst.depth() == CV_16U) + { + cv::randu(dst, 0, 1024); + } + else if (dst.depth() == CV_32F || dst.depth() == CV_64F) + { + cv::randu(dst, -1.0, 1.0); + } + else // (dst.depth() == CV_16S || dst.depth() == CV_32S) + { + cv::randu(dst, -4096, 4096); + } +} + +} // namespace perf + +}} // namespace cvtest::ocl + +#endif // HAVE_OPENCL diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index 91f5e7fc7..08f2ed5c7 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -865,9 +865,18 @@ void TestBase::declareArray(SizeVector& sizes, cv::InputOutputArray a, WarmUpTyp void TestBase::warmup(cv::InputOutputArray a, WarmUpType wtype) { - if (a.empty()) return; - if (a.kind() != cv::_InputArray::STD_VECTOR_MAT && a.kind() != cv::_InputArray::STD_VECTOR_VECTOR) + if (a.empty()) + { + return; + } + else if (a.isUMat()) + { + return; // TODO current warmup_impl is not useful for GPU-based data + } + else if (a.kind() != cv::_InputArray::STD_VECTOR_MAT && a.kind() != cv::_InputArray::STD_VECTOR_VECTOR) + { warmup_impl(a.getMat(), wtype); + } else { size_t total = a.total();