|
SkePU 0.7
|
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
1.7.4