5 #ifndef DEVICE_MEM_POINTER_CL_H
6 #define DEVICE_MEM_POINTER_CL_H
12 #include <OpenCL/opencl.h>
48 void copyDeviceToDevice(cl_mem copyToPointer,
int numElements,
int dstOffset = 0,
int srcOffset = 0)
const;
54 void copyHostToDevice_internal(T* src, cl_mem dest,
int numElements,
int offset=0)
const;
56 T* m_rootHostDataPointer;
57 T* m_effectiveHostDataPointer;
61 int m_effectiveNumElements;
63 cl_mem m_deviceDataPointer;
64 cl_mem m_effectiveDeviceDataPointer;
69 mutable bool deviceDataHasChanged;
84 size_t sizeVec = numElements*
sizeof(T);
86 DEBUG_TEXT_LEVEL2(
"Alloc: " <<numElements <<
"\n")
87 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
89 #ifdef SKEPU_MEASURE_ONLY_COPY
93 devMemAllocTimer.start();
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";}
99 m_effectiveDeviceDataPointer = m_deviceDataPointer;
101 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
103 #ifdef SKEPU_MEASURE_ONLY_COPY
107 devMemAllocTimer.stop();
109 deviceDataHasChanged =
false;
118 template <
typename T>
121 DEBUG_TEXT_LEVEL2(
"DeAlloc: " <<m_numElements <<
"\n")
123 clReleaseMemObject(m_deviceDataPointer);
135 template <
typename T>
138 if(m_hostDataPointer != NULL)
140 DEBUG_TEXT_LEVEL2(
"DEVICE_TO_DEVICE!!!\n")
145 if(numElements == -1)
146 sizeVec = m_numElements*
sizeof(T);
148 sizeVec = numElements*
sizeof(T);
150 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
152 #ifdef SKEPU_MEASURE_ONLY_COPY
153 clFinish(m_device->getQueue());
159 DEBUG_TEXT_LEVEL2(
"Copying Device to Device: "<<sizeVec/
sizeof(T)<<
" elements.\n")
161 err = clEnqueueCopyBuffer ( m_device->getQueue(),m_deviceDataPointer, copyToPointer, srcOffset*
sizeof(T), dstOffset*
sizeof(T), sizeVec, 0, NULL, NULL);
164 if(err != CL_SUCCESS){std::cerr<<
"Error copying data to device\n";}
166 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
168 #ifdef SKEPU_MEASURE_ONLY_COPY
169 clFinish(m_device->getQueue());
175 deviceDataHasChanged =
true;
189 template <
typename T>
192 DEBUG_TEXT_LEVEL2(
"HOST_TO_DEVICE INTERNAL!!!\n")
197 sizeVec = numElements*sizeof(T);
199 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
201 #ifdef SKEPU_MEASURE_ONLY_COPY
202 clFinish(m_device->getQueue());
210 err = clEnqueueWriteBuffer(m_device->getQueue(), dest_ptr, CL_TRUE, offset*
sizeof(T), sizeVec, (
void*)src_ptr, 0, NULL, NULL);
212 if(err != CL_SUCCESS){std::cerr<<
"Error copying data to device\n";}
214 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
216 #ifdef SKEPU_MEASURE_ONLY_COPY
217 clFinish(m_device->getQueue());
231 template <
typename T>
234 DEBUG_TEXT_LEVEL2(
"HOST_TO_DEVICE!!!\n")
238 if(numElements == -1)
240 sizeVec = m_numElements*
sizeof(T);
242 sizeVec = m_effectiveNumElements*
sizeof(T);
244 sizeVec = numElements*
sizeof(T);
246 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
248 #ifdef SKEPU_MEASURE_ONLY_COPY
249 clFinish(m_device->getQueue());
256 err = clEnqueueWriteBuffer(m_device->getQueue(), m_deviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_hostDataPointer, 0, NULL, NULL);
258 err = clEnqueueWriteBuffer(m_device->getQueue(), m_effectiveDeviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_effectiveHostDataPointer, 0, NULL, NULL);
260 if(err != CL_SUCCESS){std::cerr<<
"Error copying data to device\n";}
262 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
264 #ifdef SKEPU_MEASURE_ONLY_COPY
265 clFinish(m_device->getQueue());
271 deviceDataHasChanged =
false;
280 template <
typename T>
283 if(deviceDataHasChanged)
285 DEBUG_TEXT_LEVEL2(
"DEVICE_TO_HOST!!!\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
299 #ifdef SKEPU_MEASURE_ONLY_COPY
300 clFinish(m_device->getQueue());
303 copyDownTimer.start();
307 err = clEnqueueReadBuffer(m_device->getQueue(), m_deviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_hostDataPointer, 0, NULL, NULL);
309 err = clEnqueueReadBuffer(m_device->getQueue(), m_effectiveDeviceDataPointer, CL_TRUE, 0, sizeVec, (
void*)m_effectiveHostDataPointer, 0, NULL, NULL);
311 if(err != CL_SUCCESS){std::cerr<<
"Error copying data from device "<<sizeVec<<
"\n";}
313 #ifdef SKEPU_MEASURE_TIME_DISTRIBUTION
315 #ifdef SKEPU_MEASURE_ONLY_COPY
316 clFinish(m_device->getQueue());
319 copyDownTimer.stop();
321 deviceDataHasChanged =
false;
328 template <
typename T>
331 return m_deviceDataPointer;
337 template <
typename T>
340 deviceDataHasChanged =
true;
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