1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. 14 // Third party copyrights are property of their respective owners. 15 // 16 // Redistribution and use in source and binary forms, with or without modification, 17 // are permitted provided that the following conditions are met: 18 // 19 // * Redistribution's of source code must retain the above copyright notice, 20 // this list of conditions and the following disclaimer. 21 // 22 // * Redistribution's in binary form must reproduce the above copyright notice, 23 // this list of conditions and the following disclaimer in the documentation 24 // and/or other materials provided with the distribution. 25 // 26 // * The name of the copyright holders may not be used to endorse or promote products 27 // derived from this software without specific prior written permission. 28 // 29 // This software is provided by the copyright holders and contributors "as is" and 30 // any express or implied warranties, including, but not limited to, the implied 31 // warranties of merchantability and fitness for a particular purpose are disclaimed. 32 // In no event shall the OpenCV Foundation or contributors be liable for any direct, 33 // indirect, incidental, special, exemplary, or consequential damages 34 // (including, but not limited to, procurement of substitute goods or services; 35 // loss of use, data, or profits; or business interruption) however caused 36 // and on any theory of liability, whether in contract, strict liability, 37 // or tort (including negligence or otherwise) arising in any way out of 38 // the use of this software, even if advised of the possibility of such damage. 39 // 40 //M*/ 41 42 #include "../../precomp.hpp" 43 44 #ifdef HAVE_CLAMDBLAS 45 46 #include "opencv2/core/opencl/runtime/opencl_core.hpp" 47 #include "opencv2/core/opencl/runtime/opencl_clamdblas.hpp" 48 49 #if defined(_WIN32) 50 #include <windows.h> 51 52 static void* WinGetProcAddress(const char* name) 53 { 54 static HMODULE opencl_module = NULL; 55 if (!opencl_module) 56 { 57 opencl_module = GetModuleHandleA("clAmdBlas.dll"); 58 if (!opencl_module) 59 { 60 opencl_module = LoadLibraryA("clAmdBlas.dll"); 61 if (!opencl_module) 62 return NULL; 63 } 64 } 65 return (void*)GetProcAddress(opencl_module, name); 66 } 67 #define CV_CL_GET_PROC_ADDRESS(name) WinGetProcAddress(name) 68 #endif // _WIN32 69 70 #if defined(__linux__) 71 #include <dlfcn.h> 72 #include <stdio.h> 73 74 static void* GetProcAddress (const char* name) 75 { 76 static void* h = NULL; 77 if (!h) 78 { 79 h = dlopen("libclAmdBlas.so", RTLD_LAZY | RTLD_GLOBAL); 80 if (!h) 81 return NULL; 82 } 83 84 return dlsym(h, name); 85 } 86 #define CV_CL_GET_PROC_ADDRESS(name) GetProcAddress(name) 87 #endif 88 89 #ifndef CV_CL_GET_PROC_ADDRESS 90 #ifdef __GNUC__ 91 #warning("OPENCV: OpenCL BLAS dynamic library loader: check configuration") 92 #else 93 #pragma message("WARNING: OPENCV: OpenCL BLAS dynamic library loader: check configuration") 94 #endif 95 #define CV_CL_GET_PROC_ADDRESS(name) NULL 96 #endif 97 98 static void* openclamdblas_check_fn(int ID); 99 100 #include "runtime_common.hpp" 101 102 // 103 // BEGIN OF CUSTOM FUNCTIONS 104 // 105 106 #define CUSTOM_FUNCTION_ID 1000 107 108 // 109 // END OF CUSTOM FUNCTIONS HERE 110 // 111 112 #include "autogenerated/opencl_clamdblas_impl.hpp" 113 114 static void* openclamdblas_check_fn(int ID) 115 { 116 assert(ID >= 0 && ID < (int)(sizeof(openclamdblas_fn)/sizeof(openclamdblas_fn[0]))); 117 const struct DynamicFnEntry* e = openclamdblas_fn[ID]; 118 void* func = CV_CL_GET_PROC_ADDRESS(e->fnName); 119 if (!func) 120 { 121 throw cv::Exception(cv::Error::OpenCLApiCallError, 122 cv::format("OpenCL AMD BLAS function is not available: [%s]", e->fnName), 123 CV_Func, __FILE__, __LINE__); 124 } 125 *(e->ppFn) = func; 126 return func; 127 } 128 129 #endif 130