Image Component Library (ICL)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
CLKernel.h
Go to the documentation of this file.
00001 /********************************************************************
00002  **                Image Component Library (ICL)                    **
00003  **                                                                 **
00004  ** Copyright (C) 2006-2013 CITEC, University of Bielefeld          **
00005  **                         Neuroinformatics Group                  **
00006  ** Website: www.iclcv.org and                                      **
00007  **          http://opensource.cit-ec.de/projects/icl               **
00008  **                                                                 **
00009  ** File   : ICLUtils/src/ICLUtils/CLKernel.h                       **
00010  ** Module : ICLUtils                                               **
00011  ** Authors: Viktor Losing                                          **
00012  **                                                                 **
00013  **                                                                 **
00014  ** GNU LESSER GENERAL PUBLIC LICENSE                               **
00015  ** This file may be used under the terms of the GNU Lesser General **
00016  ** Public License version 3.0 as published by the                  **
00017  **                                                                 **
00018  ** Free Software Foundation and appearing in the file LICENSE.GPL  **
00019  ** included in the packaging of this file.  Please review the      **
00020  ** following information to ensure the license requirements will   **
00021  ** be met: http://www.gnu.org/licenses/lgpl-3.0.txt                **
00022  **                                                                 **
00023  ** The development of this software was supported by the           **
00024  ** Excellence Cluster EXC 277 Cognitive Interaction Technology.    **
00025  ** The Excellence Cluster EXC 277 is a grant of the Deutsche       **
00026  ** Forschungsgemeinschaft (DFG) in the context of the German       **
00027  ** Excellence Initiative.                                          **
00028  **                                                                 **
00029  ********************************************************************/
00030 
00031 #pragma once
00032 
00033 #ifdef ICL_HAVE_OPENCL
00034 
00035 #include <ICLUtils/CompatMacros.h>
00036 #include <ICLUtils/CLBuffer.h>
00037 #include <ICLUtils/CLImage2D.h>
00038 #include <ICLUtils/CLException.h>
00039 #include <ICLUtils/FixedArray.h>
00040 #include <string>
00041 
00043 namespace cl{
00044   class CommandQueue;
00045   class Program;
00046 }
00049 namespace icl {
00050   namespace utils {
00052 
00072     class ICLUtils_API CLKernel {
00073       struct Impl; 
00074       Impl *impl;  
00075       
00077       CLKernel(const string &id, cl::Program & program, 
00078                cl::CommandQueue& cmdQueue) throw (CLKernelException);
00079 
00080       public:
00081 
00083       struct LocalMemory {
00084         size_t size; 
00085 
00087         LocalMemory(size_t size) : size(size) { }
00088       };
00089 
00091       CLKernel();
00092       
00094       CLKernel(const CLKernel &other);
00095       
00097       CLKernel const& operator=(CLKernel const& other);
00098 
00100       ~CLKernel();
00101 
00103 
00104       void apply(int gloW, int gloH = 0, int gloC = 0,
00105                  int locW = 0, int locH = 0, int locC = 0) throw (CLKernelException);
00106       
00107       
00109       friend class CLProgram;
00110 
00112       void setArg(const unsigned idx, const unsigned int &value) throw (CLKernelException);
00113 
00115       void setArg(const unsigned idx, const int &value) throw (CLKernelException);
00116 
00118       void setArg(const unsigned idx, const short &value) throw (CLKernelException);
00119 
00121       void setArg(const unsigned idx, const long &value) throw (CLKernelException);
00122 
00124       void setArg(const unsigned idx, const unsigned long &value) throw (CLKernelException);
00125 
00127       void setArg(const unsigned idx, const float &value) throw (CLKernelException);
00128 
00130       void setArg(const unsigned idx, const double &value) throw (CLKernelException);
00131 
00133       void setArg(const unsigned idx, const char &value) throw (CLKernelException);
00134 
00136       void setArg(const unsigned idx, const unsigned char &value) throw (CLKernelException);
00137 
00139       void setArg(const unsigned idx, const FixedArray<float,4> &value) throw (CLKernelException);
00140 
00142       void setArg(const unsigned idx, const FixedArray<float,3> &value) throw (CLKernelException);
00143 
00145       void setArg(const unsigned idx, const CLBuffer &value) throw (CLKernelException);
00146       
00148       void setArg(const unsigned idx, const CLImage2D &value) throw (CLKernelException);
00149 
00151       void setArg(const unsigned idx, const LocalMemory &value) throw (CLKernelException);
00152 
00154       template<typename A>
00155       void setArgs(const A &value) throw (CLKernelException) {
00156         setArg(0, value);
00157       }
00158 
00160       template<typename A, typename B>
00161       void setArgs(const A &valueA, const B &valueB) throw (CLKernelException) {
00162         setArgs(valueA);
00163         setArg(1, valueB);
00164       }
00165       
00167       template<typename A, typename B, typename C>
00168       void setArgs(const A &valueA, const B &valueB, const C &valueC) throw (CLKernelException) {
00169         setArgs(valueA, valueB);
00170         setArg(2, valueC);
00171       }
00172       
00174       template<typename A, typename B, typename C, typename D>
00175       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD) throw (CLKernelException) {
00176         setArgs(valueA, valueB, valueC);
00177         setArg(3, valueD);
00178       }
00179       
00181       template<typename A, typename B, typename C, typename D, typename E>
00182       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00183                    const E &valueE) throw (CLKernelException) {
00184         setArgs(valueA, valueB, valueC, valueD);
00185         setArg(4, valueE);
00186       }
00187       
00189       template<typename A, typename B, typename C, typename D, typename E, typename F>
00190       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00191                    const E &valueE, const F &valueF) throw (CLKernelException) {
00192         setArgs(valueA, valueB, valueC, valueD, valueE);
00193         setArg(5, valueF);
00194       }
00195       
00197       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00198                typename G>
00199       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00200                    const E &valueE, const F &valueF, const G &valueG) 
00201                    throw (CLKernelException) {
00202         setArgs(valueA, valueB, valueC, valueD, valueE, valueF);
00203         setArg(6, valueG);
00204       }
00205       
00207       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00208                typename G, typename H>
00209       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00210                    const E &valueE, const F &valueF, const G &valueG, const H &valueH) 
00211                    throw (CLKernelException) {
00212         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG);
00213         setArg(7, valueH);
00214       }
00215 
00217       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00218                typename G, typename H, typename I>
00219       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00220                    const E &valueE, const F &valueF, const G &valueG, const H &valueH, 
00221                    const I &valueI) throw (CLKernelException) {
00222         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH);
00223         setArg(8, valueI);
00224       }
00225       
00227       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00228                typename G, typename H, typename I, typename J>
00229       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00230                    const E &valueE, const F &valueF, const G &valueG, const H &valueH, 
00231                    const I &valueI, const J &valueJ) throw (CLKernelException) {
00232         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI);
00233         setArg(9, valueJ);
00234       }
00235 
00237       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00238                typename G, typename H, typename I, typename J, typename K>
00239       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00240                    const E &valueE, const F &valueF, const G &valueG, const H &valueH, 
00241                    const I &valueI, const J &valueJ, const K &valueK) 
00242                    throw (CLKernelException) {
00243         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 
00244                 valueJ);
00245         setArg(10, valueK);
00246       }
00248       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00249                typename G, typename H, typename I, typename J, typename K, typename L>
00250       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00251                    const E &valueE, const F &valueF, const G &valueG, const H &valueH, 
00252                    const I &valueI, const J &valueJ, const K &valueK, const L &valueL) 
00253                    throw (CLKernelException) {
00254         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 
00255                 valueJ, valueK);
00256         setArg(11, valueL);
00257       }
00258 
00260       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00261                typename G, typename H, typename I, typename J, typename K, typename L, 
00262                typename M>
00263       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00264                    const E &valueE, const F &valueF, const G &valueG, const H &valueH,
00265                    const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 
00266                    const M &valueM) throw (CLKernelException) {
00267         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 
00268                 valueJ, valueK, valueL);
00269         setArg(12, valueM);
00270       }
00271       
00273       template<typename A, typename B, typename C, typename D, typename E, typename F, 
00274                typename G, typename H, typename I, typename J, typename K, typename L,
00275                typename M, typename N>
00276       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD, 
00277                    const E &valueE, const F &valueF, const G &valueG, const H &valueH, 
00278                    const I &valueI, const J &valueJ, const K &valueK, const L &valueL, 
00279                    const M &valueM, const N &valueN) throw (CLKernelException) {
00280         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI, 
00281                 valueJ, valueK, valueL, valueM);
00282         setArg(13, valueN);
00283       }
00284 
00286       template<typename A, typename B, typename C, typename D, typename E, typename F,
00287                typename G, typename H, typename I, typename J, typename K, typename L,
00288                typename M, typename N, typename O>
00289       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD,
00290                    const E &valueE, const F &valueF, const G &valueG, const H &valueH,
00291                    const I &valueI, const J &valueJ, const K &valueK, const L &valueL,
00292                    const M &valueM, const N &valueN, const O &valueO)
00293                    throw (CLKernelException) {
00294         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI,
00295                 valueJ, valueK, valueL, valueM, valueN);
00296         setArg(14, valueO);
00297       }
00298 
00300       template<typename A, typename B, typename C, typename D, typename E, typename F,
00301                typename G, typename H, typename I, typename J, typename K, typename L,
00302                typename M, typename N, typename O, typename P>
00303       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD,
00304                    const E &valueE, const F &valueF, const G &valueG, const H &valueH,
00305                    const I &valueI, const J &valueJ, const K &valueK, const L &valueL,
00306                    const M &valueM, const N &valueN, const O &valueO, const P &valueP)
00307                    throw (CLKernelException) {
00308         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI,
00309                 valueJ, valueK, valueL, valueM, valueN, valueP);
00310         setArg(15, valueP);
00311       }
00312 
00314       template<typename A, typename B, typename C, typename D, typename E, typename F,
00315                typename G, typename H, typename I, typename J, typename K, typename L,
00316                typename M, typename N, typename O, typename P, typename Q>
00317       void setArgs(const A &valueA, const B &valueB, const C &valueC, const D &valueD,
00318                    const E &valueE, const F &valueF, const G &valueG, const H &valueH,
00319                    const I &valueI, const J &valueJ, const K &valueK, const L &valueL,
00320                    const M &valueM, const N &valueN, const O &valueO, const P &valueP,
00321                    const Q &valueQ)
00322                    throw (CLKernelException) {
00323         setArgs(valueA, valueB, valueC, valueD, valueE, valueF, valueG, valueH, valueI,
00324                 valueJ, valueK, valueL, valueM, valueN, valueP, valueQ);
00325         setArg(16, valueQ);
00326       }
00327       
00329       struct Arg {
00330         CLKernel &k; 
00331         int idx;     
00332         
00334         Arg(CLKernel &k, int idx):k(k),idx(idx) {}
00335 
00337         template<class T>
00338         inline void operator=(const T &t) {
00339           k.setArg(idx,t);
00340         }
00341       };
00342       
00344       inline Arg operator[](int idx) { return Arg(*this,idx); }
00345    
00346     };
00347   }
00348 }
00349 
00350 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines