SkePU 0.7
include/skepu/map.h
Go to the documentation of this file.
00001 
00005 #ifndef MAP_H
00006 #define MAP_H
00007 
00008 #ifdef SKEPU_OPENCL
00009 #include <string>
00010 #include <vector>
00011 #ifdef USE_MAC_OPENCL
00012 #include <OpenCL/opencl.h>
00013 #else
00014 #include <CL/cl.h>
00015 #endif
00016 #include "src/device_cl.h"
00017 #endif
00018 
00019 #include "src/environment.h"
00020 #include "skepu/vector.h"
00021 #include "skepu/matrix.h"
00022 #include "src/operator_macros.h"
00023 #include "src/exec_plan.h"
00024 
00025 namespace skepu
00026 {
00027 
00048 template <typename MapFunc>
00049 class Map
00050 {
00051 
00052 public:
00053 
00054     Map(MapFunc* mapFunc);
00055 
00056     ~Map();
00057 
00061     template <typename T>
00062     void setConstant(T constant1) {m_mapFunc->setConstant(constant1);}
00063 
00067     void finishAll() {m_environment->finishAll();}
00068     void setExecPlan(ExecPlan& plan) {m_execPlan = plan;}
00069 
00070 private:
00071     Environment<int>* m_environment;
00072     MapFunc* m_mapFunc;
00073     ExecPlan m_execPlan;
00074 
00075 public:
00076     template <typename T>
00077     void operator()(Vector<T>& input);
00078     
00079     template <typename T>
00080     void operator()(Vector<T>& input, Vector<T>& output);
00081     
00082     template <typename T>
00083     void operator()(Matrix<T>& input);
00084 
00085     template <typename T>
00086     void operator()(Matrix<T>& input, Matrix<T>& output);
00087     
00088     template <typename InputIterator>
00089     void operator()(InputIterator inputBegin, InputIterator inputEnd);
00090 
00091     template <typename InputIterator, typename OutputIterator>
00092     void operator()(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin);
00093 
00094     template <typename T>
00095     void operator()(Vector<T>& input1, Vector<T>& input2, Vector<T>& output);
00096     
00097     template <typename T>
00098     void operator()(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& output);
00099 
00100     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00101     void operator()(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin);
00102 
00103     template <typename T>
00104     void operator()(Vector<T>& input1, Vector<T>& input2, Vector<T>& input3, Vector<T>& output);
00105     
00106     template <typename T>
00107     void operator()(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& input3, Matrix<T>& output);
00108 
00109     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00110     void operator()(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin);
00111 
00112 
00113 public:
00114     template <typename T>
00115     void CPU(Vector<T>& input);
00116     
00117     template <typename T>
00118     void CPU(Vector<T>& input, Vector<T>& output);
00119     
00120     template <typename T>
00121     void CPU(Matrix<T>& input);
00122 
00123     template <typename T>
00124     void CPU(Matrix<T>& input, Matrix<T>& output);
00125     
00126     template <typename InputIterator>
00127     void CPU(InputIterator inputBegin, InputIterator inputEnd);
00128 
00129     template <typename InputIterator, typename OutputIterator>
00130     void CPU(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin);
00131 
00132     template <typename T>
00133     void CPU(Vector<T>& input1, Vector<T>& input2, Vector<T>& output);
00134     
00135     template <typename T>
00136     void CPU(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& output);
00137 
00138     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00139     void CPU(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin);
00140 
00141     template <typename T>
00142     void CPU(Vector<T>& input1, Vector<T>& input2, Vector<T>& input3, Vector<T>& output);
00143     
00144     template <typename T>
00145     void CPU(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& input3, Matrix<T>& output);
00146 
00147     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00148     void CPU(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin);
00149 
00150 #ifdef SKEPU_OPENMP
00151 public:
00152     template <typename T>
00153     void OMP(Vector<T>& input);
00154     
00155     template <typename T>
00156     void OMP(Vector<T>& input, Vector<T>& output);
00157     
00158     template <typename T>
00159     void OMP(Matrix<T>& input);
00160 
00161     template <typename T>
00162     void OMP(Matrix<T>& input, Matrix<T>& output);
00163     
00164     template <typename InputIterator>
00165     void OMP(InputIterator inputBegin, InputIterator inputEnd);
00166 
00167     template <typename InputIterator, typename OutputIterator>
00168     void OMP(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin);
00169 
00170     template <typename T>
00171     void OMP(Vector<T>& input1, Vector<T>& input2, Vector<T>& output);
00172     
00173     template <typename T>
00174     void OMP(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& output);
00175 
00176     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00177     void OMP(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin);
00178 
00179     template <typename T>
00180     void OMP(Vector<T>& input1, Vector<T>& input2, Vector<T>& input3, Vector<T>& output);
00181     
00182     template <typename T>
00183     void OMP(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& input3, Matrix<T>& output);
00184 
00185     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00186     void OMP(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin);
00187 #endif
00188 
00189 #ifdef SKEPU_CUDA
00190 public:
00191     template <typename T>
00192     void CU(Vector<T>& input, int useNumGPU = 1);
00193     
00194     template <typename T>
00195     void CU(Vector<T>& input, Vector<T>& output, int useNumGPU = 1);
00196     
00197     template <typename T>
00198     void CU(Matrix<T>& input, int useNumGPU = 1);
00199 
00200     template <typename T>
00201     void CU(Matrix<T>& input, Matrix<T>& output, int useNumGPU = 1);
00202     
00203     template <typename InputIterator>
00204     void CU(InputIterator inputBegin, InputIterator inputEnd, int useNumGPU = 1);
00205     
00206     template <typename InputIterator, typename OutputIterator>
00207     void CU(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin, int useNumGPU = 1);
00208     
00209     template <typename InputIterator, typename OutputIterator>
00210     void CU_2(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin, int useNumGPU = 1);
00211 
00212     template <typename T>
00213     void CU(Vector<T>& input1, Vector<T>& input2, Vector<T>& output, int useNumGPU = 1);
00214     
00215     template <typename T>
00216     void CU(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& output, int useNumGPU = 1);
00217 
00218     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00219     void CU(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin, int useNumGPU = 1);
00220 
00221     template <typename T>
00222     void CU(Vector<T>& input1, Vector<T>& input2, Vector<T>& input3, Vector<T>& output, int useNumGPU = 1);
00223     
00224     template <typename T>
00225     void CU(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& input3, Matrix<T>& output, int useNumGPU = 1);
00226 
00227     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00228     void CU(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin, int useNumGPU = 1);
00229 
00230 private:
00231     template <typename InputIterator, typename OutputIterator>
00232     void mapSingleThread_CU(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin, int deviceID);
00233 
00234     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00235     void mapSingleThread_CU(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin, int deviceID);
00236 
00237     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00238     void mapSingleThread_CU(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin, int deviceID);
00239 #endif
00240 
00241 #ifdef SKEPU_OPENCL
00242 public:
00243     template <typename T>
00244     void CL(Vector<T>& input, int useNumGPU = 1);
00245     
00246     template <typename T>
00247     void CL(Vector<T>& input, Vector<T>& output, int useNumGPU = 1);
00248     
00249     template <typename T>
00250     void CL(Matrix<T>& input, int useNumGPU = 1);
00251 
00252     template <typename T>
00253     void CL(Matrix<T>& input, Matrix<T>& output, int useNumGPU = 1);
00254     
00255     template <typename InputIterator>
00256     void CL(InputIterator inputBegin, InputIterator inputEnd, int useNumGPU = 1);
00257 
00258     template <typename InputIterator, typename OutputIterator>
00259     void CL(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin, int useNumGPU = 1);
00260 
00261     template <typename T>
00262     void CL(Vector<T>& input1, Vector<T>& input2, Vector<T>& output, int useNumGPU = 1);
00263     
00264     template <typename T>
00265     void CL(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& output, int useNumGPU = 1);
00266 
00267     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00268     void CL(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin, int useNumGPU = 1);
00269 
00270     template <typename T>
00271     void CL(Vector<T>& input1, Vector<T>& input2, Vector<T>& input3, Vector<T>& output, int useNumGPU = 1);
00272     
00273     template <typename T>
00274     void CL(Matrix<T>& input1, Matrix<T>& input2, Matrix<T>& input3, Matrix<T>& output, int useNumGPU = 1);
00275 
00276     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00277     void CL(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin, int useNumGPU = 1);
00278 
00279 private:
00280     template <typename InputIterator, typename OutputIterator>
00281     void mapNumDevices_CL(InputIterator inputBegin, InputIterator inputEnd, OutputIterator outputBegin, int numDevices);
00282     
00283     template <typename Input1Iterator, typename Input2Iterator, typename OutputIterator>
00284     void mapNumDevices_CL(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, OutputIterator outputBegin, int numDevices);
00285 
00286     template <typename Input1Iterator, typename Input2Iterator, typename Input3Iterator, typename OutputIterator>
00287     void mapNumDevices_CL(Input1Iterator input1Begin, Input1Iterator input1End, Input2Iterator input2Begin, Input2Iterator input2End, Input3Iterator input3Begin, Input3Iterator input3End, OutputIterator outputBegin, int numDevices);
00288 
00289 private:
00290     std::vector<std::pair<cl_kernel, Device_CL*> > m_kernels_CL;
00291 
00292     void replaceText(std::string& text, std::string find, std::string replace);
00293     void createOpenCLProgram();
00294 #endif
00295 
00296 };
00297 
00298 }
00299 
00300 #include "src/map.inl"
00301 
00302 #include "src/map_cpu.inl"
00303 
00304 #ifdef SKEPU_OPENMP
00305 #include "src/map_omp.inl"
00306 #endif
00307 
00308 #ifdef SKEPU_OPENCL
00309 #include "src/map_cl.inl"
00310 #endif
00311 
00312 #ifdef SKEPU_CUDA
00313 #include "src/map_cu.inl"
00314 #endif
00315 
00316 #endif
00317 
 All Classes Namespaces Files Functions Enumerations Friends Defines