Go to the documentation of this file.00001
00005 #ifndef DEVICE_MEM_POINTER_CU_H
00006 #define DEVICE_MEM_POINTER_CU_H
00007
00008 #ifdef SKEPU_CUDA
00009
00010 #include <iostream>
00011 #include <cuda.h>
00012
00013 #include "debug.h"
00014
00015 namespace skepu
00016 {
00017
00032 template <typename T>
00033 class DeviceMemPointer_CU
00034 {
00035
00036 public:
00037 DeviceMemPointer_CU(T* start, int numElements, int deviceID);
00038 ~DeviceMemPointer_CU();
00039
00040 void copyHostToDevice(int numElements = -1) const;
00041 void copyDeviceToHost(int numElements = -1) const;
00042 T* getDeviceDataPointer() const;
00043 int getDeviceID() const;
00044 void changeDeviceData();
00045
00046 private:
00047 T* m_hostDataPointer;
00048 T* m_deviceDataPointer;
00049 int m_numElements;
00050 int m_deviceID;
00051
00052 mutable bool deviceDataHasChanged;
00053 };
00054
00063 template <typename T>
00064 DeviceMemPointer_CU<T>::DeviceMemPointer_CU(T* start, int numElements, int deviceID) : m_hostDataPointer(start), m_numElements(numElements), m_deviceID(deviceID)
00065 {
00066 cudaError_t err;
00067 size_t sizeVec = numElements*sizeof(T);
00068
00069 DEBUG_TEXT_LEVEL2("Alloc: " <<numElements <<"\n")
00070
00071 err = cudaMalloc((void**)&m_deviceDataPointer, sizeVec);
00072 if(err != cudaSuccess){std::cerr<<"Error allocating memory on device\n";}
00073
00074 deviceDataHasChanged = false;
00075 }
00076
00080 template <typename T>
00081 DeviceMemPointer_CU<T>::~DeviceMemPointer_CU()
00082 {
00083 DEBUG_TEXT_LEVEL2("DeAlloc: " <<m_numElements <<"\n")
00084
00085 cudaFree(m_deviceDataPointer);
00086 }
00087
00093 template <typename T>
00094 void DeviceMemPointer_CU<T>::copyHostToDevice(int numElements) const
00095 {
00096 if(m_hostDataPointer != NULL)
00097 {
00098 DEBUG_TEXT_LEVEL2("HOST_TO_DEVICE!!!\n")
00099
00100 cudaError_t err;
00101 size_t sizeVec;
00102
00103 if(numElements == -1)
00104 sizeVec = m_numElements*sizeof(T);
00105 else
00106 sizeVec = numElements*sizeof(T);
00107
00108 err = cudaMemcpy(m_deviceDataPointer, m_hostDataPointer, sizeVec, cudaMemcpyHostToDevice);
00109 if(err != cudaSuccess){std::cerr<<"Error copying data to device\n" <<cudaGetErrorString(err) <<"\n";}
00110
00111 deviceDataHasChanged = false;
00112 }
00113 }
00114
00120 template <typename T>
00121 void DeviceMemPointer_CU<T>::copyDeviceToHost(int numElements) const
00122 {
00123 if(deviceDataHasChanged && m_hostDataPointer != NULL)
00124 {
00125 DEBUG_TEXT_LEVEL2("DEVICE_TO_HOST!!!\n")
00126
00127 cudaError_t err;
00128 size_t sizeVec;
00129
00130 if(numElements == -1)
00131 sizeVec = m_numElements*sizeof(T);
00132 else
00133 sizeVec = numElements*sizeof(T);
00134
00135 err = cudaMemcpy(m_hostDataPointer, m_deviceDataPointer, sizeVec, cudaMemcpyDeviceToHost);
00136 if(err != cudaSuccess){std::cerr<<"Error copying data from device: " <<cudaGetErrorString(err) <<"\n";}
00137
00138 deviceDataHasChanged = false;
00139 }
00140 }
00141
00145 template <typename T>
00146 T* DeviceMemPointer_CU<T>::getDeviceDataPointer() const
00147 {
00148 return m_deviceDataPointer;
00149 }
00150
00154 template <typename T>
00155 int DeviceMemPointer_CU<T>::getDeviceID() const
00156 {
00157 return m_deviceID;
00158 }
00159
00163 template <typename T>
00164 void DeviceMemPointer_CU<T>::changeDeviceData()
00165 {
00166 deviceDataHasChanged = true;
00167 }
00168
00169 }
00170
00171 #endif
00172
00173 #endif