5 #ifndef DEVICE_MEM_POINTER_CL_H
6 #define DEVICE_MEM_POINTER_CL_H
12 #include <OpenCL/opencl.h>
49 void copyDeviceToDevice(cl_mem copyToPointer,
int numElements,
int dstOffset = 0,
int srcOffset = 0)
const;
55 mutable bool m_initialized;
58 void copyHostToDevice_internal(T* src, cl_mem dest,
int numElements,
int offset=0)
const;
60 T* m_rootHostDataPointer;
61 T* m_effectiveHostDataPointer;
65 int m_effectiveNumElements;
67 cl_mem m_deviceDataPointer;
68 cl_mem m_effectiveDeviceDataPointer;
73 mutable bool deviceDataHasChanged;
88 size_t sizeVec = numElements*
sizeof(T);
90 DEBUG_TEXT_LEVEL1(
"Alloc: " <<numElements <<
"\n")
91 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
93 #ifdef SKEPU_MEASURE_ONLY_COPY
97 devMemAllocTimer.start();
100 m_deviceDataPointer = clCreateBuffer(m_device->
getContext(), CL_MEM_READ_WRITE, sizeVec, NULL, &err);
101 if(err != CL_SUCCESS)
103 SKEPU_ERROR(
"Error allocating memory on device. size: " << sizeVec <<
"\n");
106 m_effectiveDeviceDataPointer = m_deviceDataPointer;
108 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
110 #ifdef SKEPU_MEASURE_ONLY_COPY
114 devMemAllocTimer.stop();
116 deviceDataHasChanged =
false;
130 template <
typename T>
134 size_t sizeVec = numElements*
sizeof(T);
136 DEBUG_TEXT_LEVEL1(
"Alloc: " <<numElements <<
"\n")
137 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
139 #ifdef SKEPU_MEASURE_ONLY_COPY
143 devMemAllocTimer.start();
146 m_deviceDataPointer = clCreateBuffer(m_device->
getContext(), CL_MEM_READ_WRITE, sizeVec, NULL, &err);
147 if(err != CL_SUCCESS)
149 SKEPU_ERROR(
"Error allocating memory on device. size: " << sizeVec <<
"\n");
152 m_effectiveDeviceDataPointer = m_deviceDataPointer;
154 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
156 #ifdef SKEPU_MEASURE_ONLY_COPY
160 devMemAllocTimer.stop();
162 deviceDataHasChanged =
false;
170 template <
typename T>
173 DEBUG_TEXT_LEVEL1(
"DeAlloc: " <<m_numElements <<
"\n")
175 clReleaseMemObject(m_deviceDataPointer);
188 template <
typename T>
191 if(m_hostDataPointer != NULL)
193 DEBUG_TEXT_LEVEL1(
"DEVICE_TO_DEVICE!!!\n")
198 if(numElements == -1)
199 sizeVec = m_numElements*
sizeof(T);
201 sizeVec = numElements*
sizeof(T);
203 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
204 #ifdef SKEPU_MEASURE_ONLY_COPY
205 clFinish(m_device->getQueue());
210 err = clEnqueueCopyBuffer(m_device->getQueue(),m_deviceDataPointer, copyToPointer, srcOffset*
sizeof(T), dstOffset*
sizeof(T), sizeVec, 0, NULL, NULL);
212 if(err != CL_SUCCESS)
214 SKEPU_ERROR(
"Error copying data to device. size: " << sizeVec <<
"\n");
217 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
218 #ifdef SKEPU_MEASURE_ONLY_COPY
219 clFinish(m_device->getQueue());
224 deviceDataHasChanged =
true;
238 template <
typename T>
241 DEBUG_TEXT_LEVEL1(
"HOST_TO_DEVICE INTERNAL!!!\n")
246 sizeVec = numElements*sizeof(T);
248 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
249 #ifdef SKEPU_MEASURE_ONLY_COPY
250 clFinish(m_device->getQueue());
255 err = clEnqueueWriteBuffer(m_device->getQueue(), dest_ptr, CL_TRUE, offset*
sizeof(T), sizeVec, (
void*)src_ptr, 0, NULL, NULL);
257 if(err != CL_SUCCESS)
259 SKEPU_ERROR(
"Error copying data to device. size: "<< sizeVec <<
"\n");
262 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
263 #ifdef SKEPU_MEASURE_ONLY_COPY
264 clFinish(m_device->getQueue());
270 m_initialized =
true;
282 template <
typename T>
285 DEBUG_TEXT_LEVEL1(
"HOST_TO_DEVICE!!!\n")
289 if(numElements == -1)
291 sizeVec = m_numElements*
sizeof(T);
293 sizeVec = m_effectiveNumElements*
sizeof(T);
295 sizeVec = numElements*
sizeof(T);
297 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
298 #ifdef SKEPU_MEASURE_ONLY_COPY
299 clFinish(m_device->getQueue());
305 err = clEnqueueWriteBuffer(m_device->getQueue(), m_deviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_hostDataPointer, 0, NULL, NULL);
307 err = clEnqueueWriteBuffer(m_device->getQueue(), m_effectiveDeviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_effectiveHostDataPointer, 0, NULL, NULL);
309 if(err != CL_SUCCESS)
311 SKEPU_ERROR(
"Error copying data to device. size: " << sizeVec <<
"\n");
314 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
315 #ifdef SKEPU_MEASURE_ONLY_COPY
316 clFinish(m_device->getQueue());
322 m_initialized =
true;
324 deviceDataHasChanged =
false;
333 template <
typename T>
336 if(deviceDataHasChanged)
338 DEBUG_TEXT_LEVEL1(
"DEVICE_TO_HOST!!!\n")
342 if(numElements == -1)
344 sizeVec = m_numElements*
sizeof(T);
346 sizeVec = m_effectiveNumElements*
sizeof(T);
348 sizeVec = numElements*
sizeof(T);
350 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
351 #ifdef SKEPU_MEASURE_ONLY_COPY
352 clFinish(m_device->getQueue());
354 copyDownTimer.start();
358 err = clEnqueueReadBuffer(m_device->getQueue(), m_deviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_hostDataPointer, 0, NULL, NULL);
360 err = clEnqueueReadBuffer(m_device->getQueue(), m_effectiveDeviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_effectiveHostDataPointer, 0, NULL, NULL);
362 if(err != CL_SUCCESS)
364 SKEPU_ERROR(
"Error copying data from device. size:"<<sizeVec<<
"\n");
367 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
368 #ifdef SKEPU_MEASURE_ONLY_COPY
369 clFinish(m_device->getQueue());
371 copyDownTimer.stop();
373 deviceDataHasChanged =
false;
380 template <
typename T>
383 return m_deviceDataPointer;
389 template <
typename T>
392 DEBUG_TEXT_LEVEL1(
"CHANGE_DEVICE_DATA!!!\n")
393 deviceDataHasChanged =
true;
394 m_initialized =
true;
void copyHostToDevice(int numElements=-1, bool copyLast=false) const
Definition: device_mem_pointer_cl.h:283
DeviceMemPointer_CL(T *root, T *start, int numElements, Device_CL *device)
Definition: device_mem_pointer_cl.h:131
A class representing an OpenCL device memory allocation for container.
Definition: device_mem_pointer_cl.h:38
cl_mem getDeviceDataPointer() const
Definition: device_mem_pointer_cl.h:381
const cl_command_queue & getQueue() const
Definition: device_cl.h:178
void copyDeviceToDevice(cl_mem copyToPointer, int numElements, int dstOffset=0, int srcOffset=0) const
Definition: device_mem_pointer_cl.h:189
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:334
const cl_context & getContext() const
Definition: device_cl.h:170
void changeDeviceData()
Definition: device_mem_pointer_cl.h:390
~DeviceMemPointer_CL()
Definition: device_mem_pointer_cl.h:171
Contains a class declaration for Environment class.
A class representing an OpenCL device.
Definition: device_cl.h:36