1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*M/////////////////////////////////////////////////////////////////////////////////////// 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// By downloading, copying, installing or using the software you agree to this license. 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// If you do not agree to this license, do not download, install, 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// copy or use the software. 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// License Agreement 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// For Open Source Computer Vision Library 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Third party copyrights are property of their respective owners. 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// @Authors 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Peng Xiao, pengxiao@multicorewareinc.com 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Redistribution and use in source and binary forms, with or without modification, 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// are permitted provided that the following conditions are met: 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Redistribution's of source code must retain the above copyright notice, 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// this list of conditions and the following disclaimer. 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Redistribution's in binary form must reproduce the above copyright notice, 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// this list of conditions and the following disclaimer in the documentation 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and/or other materials provided with the distribution. 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * The name of the copyright holders may not be used to endorse or promote products 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// derived from this software without specific prior written permission. 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// This software is provided by the copyright holders and contributors as is and 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// any express or implied warranties, including, but not limited to, the implied 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// warranties of merchantability and fitness for a particular purpose are disclaimed. 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// In no event shall the Intel Corporation or contributors be liable for any direct, 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// indirect, incidental, special, exemplary, or consequential damages 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// (including, but not limited to, procurement of substitute goods or services; 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// loss of use, data, or profits; or business interruption) however caused 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and on any theory of liability, whether in contract, strict liability, 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// or tort (including negligence or otherwise) arising in any way out of 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// the use of this software, even if advised of the possibility of such damage. 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//M*/ 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "../test_precomp.hpp" 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/ts/ocl_test.hpp" 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENCL 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace cvtest { 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace ocl { 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//////////////////////////////////////////////////////////////////////////// 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// GEMM 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPARAM_TEST_CASE(Gemm, 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MatType, 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool, // GEMM_1_T 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool, // GEMM_2_T 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool, // GEMM_3_T 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool // ROI 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ) 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool use_roi; 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int type, flags; 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool atrans, btrans, ctrans; 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double alpha, beta; 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TEST_DECLARE_INPUT_PARAMETER(A); 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TEST_DECLARE_INPUT_PARAMETER(B); 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TEST_DECLARE_INPUT_PARAMETER(C); 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler TEST_DECLARE_OUTPUT_PARAMETER(D); 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void SetUp() 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler atrans = btrans = ctrans = false; 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler type = GET_PARAM(0); 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler use_roi = GET_PARAM(4); 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler flags = 0; 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (GET_PARAM(1)) 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler flags |= GEMM_1_T, atrans = true; 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (GET_PARAM(2)) 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler flags |= GEMM_2_T, btrans = true; 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (GET_PARAM(3)) 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler flags |= GEMM_3_T, ctrans = true; 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void generateTestData() 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // set minimum size to 20, since testing less sizes doesn't make sense 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Size ARoiSize = randomSize(20, MAX_VALUE); 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Border ABorder = randomBorder(0, use_roi ? MAX_VALUE : 0); 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler randomSubMat(A, A_roi, ARoiSize, ABorder, type, -11, 11); 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (atrans) 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ARoiSize = Size(ARoiSize.height, ARoiSize.width); 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Size BRoiSize = randomSize(20, MAX_VALUE); 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (btrans) 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BRoiSize.width = ARoiSize.width; 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BRoiSize.height = ARoiSize.width; 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Border BBorder = randomBorder(0, use_roi ? MAX_VALUE : 0); 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler randomSubMat(B, B_roi, BRoiSize, BBorder, type, -11, 11); 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (btrans) 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler BRoiSize = Size(BRoiSize.height, BRoiSize.width); 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Size DRoiSize = Size(BRoiSize.width, ARoiSize.height), CRoiSizeT(DRoiSize.height, DRoiSize.width); 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Border CBorder = randomBorder(0, use_roi ? MAX_VALUE : 0); 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler randomSubMat(C, C_roi, ctrans ? CRoiSizeT : DRoiSize, CBorder, type, -11, 11); 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Border DBorder = randomBorder(0, use_roi ? MAX_VALUE : 0); 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler randomSubMat(D, D_roi, DRoiSize, DBorder, type, -11, 11); 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler alpha = randomDouble(-4, 4); 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler beta = randomDouble(-4, 4); 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UMAT_UPLOAD_INPUT_PARAMETER(A); 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UMAT_UPLOAD_INPUT_PARAMETER(B); 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UMAT_UPLOAD_INPUT_PARAMETER(C); 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UMAT_UPLOAD_OUTPUT_PARAMETER(D); 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_TEST_P(Gemm, Accuracy) 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (int i = 0; i < test_loop_times; ++i) 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler generateTestData(); 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_OFF(cv::gemm(A_roi, B_roi, alpha, C_roi, beta, D_roi, flags)); 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_ON(cv::gemm(uA_roi, uB_roi, alpha, uC_roi, beta, uD_roi, flags)); 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double eps = D_roi.size().area() * 1e-4; 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_EXPECT_MATS_NEAR(D, eps); 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_INSTANTIATE_TEST_CASE_P(Core, Gemm, ::testing::Combine( 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler testing::Values(CV_32FC1, CV_32FC2, CV_64FC1, CV_64FC2), 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Bool(), Bool(), Bool(), Bool())); 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} } // namespace cvtest::ocl 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // HAVE_OPENCL 151