SkePU(integratedwithStarPU)  0.8.1
 All Classes Namespaces Files Functions Enumerations Friends Macros Groups Pages
device_mem_pointer_cl.h
Go to the documentation of this file.
1 
5 #ifndef DEVICE_MEM_POINTER_CL_H
6 #define DEVICE_MEM_POINTER_CL_H
7 
8 #ifdef SKEPU_OPENCL
9 
10 #include <iostream>
11 #ifdef USE_MAC_OPENCL
12 #include <OpenCL/opencl.h>
13 #else
14 #include <CL/cl.h>
15 #endif
16 
17 #include <skepu/src/environment.h>
18 
19 #include "device_cl.h"
20 #include "debug.h"
21 
22 namespace skepu
23 {
24 
37 template <typename T>
39 {
40 
41 public:
42  DeviceMemPointer_CL(T* start, int numElements, Device_CL* device);
44 
45  void copyHostToDevice(int numElements = -1, bool copyLast=false) const;
46  void copyDeviceToHost(int numElements = -1, bool copyLast=false) const;
47 
48  void copyDeviceToDevice(cl_mem copyToPointer,int numElements, int dstOffset = 0, int srcOffset = 0) const;
49 
50  cl_mem getDeviceDataPointer() const;
51  void changeDeviceData();
52 
53 private:
54  void copyHostToDevice_internal(T* src, cl_mem dest, int numElements, int offset=0) const;
55 
56  T* m_rootHostDataPointer;
57  T* m_effectiveHostDataPointer;
58  T* m_hostDataPointer;
59 
60 
61  int m_effectiveNumElements;
62 
63  cl_mem m_deviceDataPointer;
64  cl_mem m_effectiveDeviceDataPointer;
65 
66  int m_numElements;
67  Device_CL* m_device;
68 
69  mutable bool deviceDataHasChanged;
70 };
71 
80 template <typename T>
81 DeviceMemPointer_CL<T>::DeviceMemPointer_CL(T* start, int numElements, Device_CL* device) : m_effectiveHostDataPointer(start), m_hostDataPointer(start), m_numElements(numElements), m_effectiveNumElements(numElements), m_device(device)
82 {
83  cl_int err;
84  size_t sizeVec = numElements*sizeof(T);
85 
86  DEBUG_TEXT_LEVEL2("Alloc: " <<numElements <<"\n")
87 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
88 
89 #ifdef SKEPU_MEASURE_ONLY_COPY
90 clFinish(m_device->getQueue());
91 #endif
92 
93 devMemAllocTimer.start();
94 #endif
95 
96  m_deviceDataPointer = clCreateBuffer(m_device->getContext(), CL_MEM_READ_WRITE, sizeVec, NULL, &err);
97  if(err != CL_SUCCESS){std::cerr<<"Error allocating memory on device\n";}
98 
99  m_effectiveDeviceDataPointer = m_deviceDataPointer;
100 
101 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
102 
103 #ifdef SKEPU_MEASURE_ONLY_COPY
104 clFinish(m_device->getQueue());
105 #endif
106 
107 devMemAllocTimer.stop();
108 #endif
109  deviceDataHasChanged = false;
110 }
111 
112 
113 
114 
118 template <typename T>
120 {
121  DEBUG_TEXT_LEVEL2("DeAlloc: " <<m_numElements <<"\n")
122 
123  clReleaseMemObject(m_deviceDataPointer);
124 }
125 
126 
135 template <typename T>
136 void DeviceMemPointer_CL<T>::copyDeviceToDevice(cl_mem copyToPointer,int numElements, int dstOffset, int srcOffset) const
137 {
138  if(m_hostDataPointer != NULL)
139  {
140  DEBUG_TEXT_LEVEL2("DEVICE_TO_DEVICE!!!\n")
141 
142  cl_int err;
143  size_t sizeVec;
144 
145  if(numElements == -1)
146  sizeVec = m_numElements*sizeof(T);
147  else
148  sizeVec = numElements*sizeof(T);
149 
150 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
151 
152 #ifdef SKEPU_MEASURE_ONLY_COPY
153 clFinish(m_device->getQueue());
154 #endif
155 
156 copyUpTimer.start();
157 #endif
158 
159  DEBUG_TEXT_LEVEL2("Copying Device to Device: "<<sizeVec/sizeof(T)<<" elements.\n")
160 
161  err = clEnqueueCopyBuffer ( m_device->getQueue(),m_deviceDataPointer, copyToPointer, srcOffset*sizeof(T), dstOffset*sizeof(T), sizeVec, 0, NULL, NULL);
162 
163 
164  if(err != CL_SUCCESS){std::cerr<<"Error copying data to device\n";}
165 
166 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
167 
168 #ifdef SKEPU_MEASURE_ONLY_COPY
169 clFinish(m_device->getQueue());
170 #endif
171 
172 copyUpTimer.stop();
173 #endif
174 
175  deviceDataHasChanged = true;
176  }
177 }
178 
179 
180 
189 template <typename T>
190 void DeviceMemPointer_CL<T>::copyHostToDevice_internal(T* src_ptr, cl_mem dest_ptr, int numElements, int offset) const
191 {
192  DEBUG_TEXT_LEVEL2("HOST_TO_DEVICE INTERNAL!!!\n")
193 
194  cl_int err;
195  size_t sizeVec;
196 
197  sizeVec = numElements*sizeof(T);
198 
199 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
200 
201 #ifdef SKEPU_MEASURE_ONLY_COPY
202 clFinish(m_device->getQueue());
203 #endif
204 
205 copyUpTimer.start();
206 #endif
207 
208 
209 
210  err = clEnqueueWriteBuffer(m_device->getQueue(), dest_ptr, CL_TRUE, offset*sizeof(T), sizeVec, (void*)src_ptr, 0, NULL, NULL);
211 
212  if(err != CL_SUCCESS){std::cerr<<"Error copying data to device\n";}
213 
214 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
215 
216 #ifdef SKEPU_MEASURE_ONLY_COPY
217 clFinish(m_device->getQueue());
218 #endif
219 
220 copyUpTimer.stop();
221 #endif
222 }
223 
224 
231 template <typename T>
232 void DeviceMemPointer_CL<T>::copyHostToDevice(int numElements, bool copyLast) const
233 {
234  DEBUG_TEXT_LEVEL2("HOST_TO_DEVICE!!!\n")
235 
236  cl_int err;
237  size_t sizeVec;
238  if(numElements == -1)
239  if(copyLast)
240  sizeVec = m_numElements*sizeof(T);
241  else
242  sizeVec = m_effectiveNumElements*sizeof(T);
243  else
244  sizeVec = numElements*sizeof(T);
245 
246 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
247 
248 #ifdef SKEPU_MEASURE_ONLY_COPY
249 clFinish(m_device->getQueue());
250 #endif
251 
252 copyUpTimer.start();
253 #endif
254 
255  if(copyLast)
256  err = clEnqueueWriteBuffer(m_device->getQueue(), m_deviceDataPointer, CL_TRUE, 0, sizeVec, (void*)m_hostDataPointer, 0, NULL, NULL);
257  else
258  err = clEnqueueWriteBuffer(m_device->getQueue(), m_effectiveDeviceDataPointer, CL_TRUE, 0, sizeVec, (void*)m_effectiveHostDataPointer, 0, NULL, NULL);
259 
260  if(err != CL_SUCCESS){std::cerr<<"Error copying data to device\n";}
261 
262 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
263 
264 #ifdef SKEPU_MEASURE_ONLY_COPY
265 clFinish(m_device->getQueue());
266 #endif
267 
268 copyUpTimer.stop();
269 #endif
270 
271  deviceDataHasChanged = false;
272 }
273 
280 template <typename T>
281 void DeviceMemPointer_CL<T>::copyDeviceToHost(int numElements, bool copyLast) const
282 {
283  if(deviceDataHasChanged)
284  {
285  DEBUG_TEXT_LEVEL2("DEVICE_TO_HOST!!!\n")
286 
287  cl_int err;
288  size_t sizeVec;
289  if(numElements == -1)
290  if(copyLast)
291  sizeVec = m_numElements*sizeof(T);
292  else
293  sizeVec = m_effectiveNumElements*sizeof(T);
294  else
295  sizeVec = numElements*sizeof(T);
296 
297 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
298 
299 #ifdef SKEPU_MEASURE_ONLY_COPY
300 clFinish(m_device->getQueue());
301 #endif
302 
303 copyDownTimer.start();
304 #endif
305 // std::cerr<<"Copying Device to host: "<<sizeVec/sizeof(T)<<" elements.\n";
306  if(copyLast)
307  err = clEnqueueReadBuffer(m_device->getQueue(), m_deviceDataPointer, CL_TRUE, 0, sizeVec, (void*)m_hostDataPointer, 0, NULL, NULL);
308  else
309  err = clEnqueueReadBuffer(m_device->getQueue(), m_effectiveDeviceDataPointer, CL_TRUE, 0, sizeVec, (void*)m_effectiveHostDataPointer, 0, NULL, NULL);
310 
311  if(err != CL_SUCCESS){std::cerr<<"Error copying data from device "<<sizeVec<<"\n";}
312 
313 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
314 
315 #ifdef SKEPU_MEASURE_ONLY_COPY
316 clFinish(m_device->getQueue());
317 #endif
318 
319 copyDownTimer.stop();
320 #endif
321  deviceDataHasChanged = false;
322  }
323 }
324 
328 template <typename T>
330 {
331  return m_deviceDataPointer;
332 }
333 
337 template <typename T>
339 {
340  deviceDataHasChanged = true;
341 }
342 
343 }
344 
345 #endif
346 
347 #endif
348 
DeviceMemPointer_CL(T *start, int numElements, Device_CL *device)
Definition: device_mem_pointer_cl.h:81
void copyHostToDevice(int numElements=-1, bool copyLast=false) const
Definition: device_mem_pointer_cl.h:232
Defines a few macros that can be used to output text when debugging. The macros use std::cerr...
A class representing an OpenCL device memory allocation.
Definition: device_mem_pointer_cl.h:38
cl_mem getDeviceDataPointer() const
Definition: device_mem_pointer_cl.h:329
const cl_command_queue & getQueue() const
Definition: device_cl.h:164
void copyDeviceToDevice(cl_mem copyToPointer, int numElements, int dstOffset=0, int srcOffset=0) const
Definition: device_mem_pointer_cl.h:136
Contains a class declaration for the object that represents an OpenCL device.
void copyDeviceToHost(int numElements=-1, bool copyLast=false) const
Definition: device_mem_pointer_cl.h:281
const cl_context & getContext() const
Definition: device_cl.h:159
void changeDeviceData()
Definition: device_mem_pointer_cl.h:338
~DeviceMemPointer_CL()
Definition: device_mem_pointer_cl.h:119
Contains a class declaration for Environment class.
A class representing an OpenCL device.
Definition: device_cl.h:37