StatMech
Loading...
Searching...
No Matches
ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > Class Template Reference
Collaboration diagram for ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >:
Collaboration graph

Public Types

using EigenMatrix_t = Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols >
 
using Object_t = Eigen::Map< EigenMatrix_t, Eigen::Unaligned, Eigen::Stride< Eigen::Dynamic, 1 > >
 
using Scalar = _Scalar
 
using RealScalar = typename Eigen::NumTraits< Scalar >::Real
 

Public Member Functions

template<class Derived >
__host__ ObjectOnGPU (Eigen::PlainObjectBase< Derived > const &hObject)
 
__host__ ObjectOnGPU (int rows=_Rows, int cols=_Cols)
 Default constructor.
 
__host__ ObjectOnGPU (ObjectOnGPU const &other)=delete
 Copy constructor.
 
__host__ ObjectOnGPU (ObjectOnGPU &&other)
 Move constructor.
 
__host__ ~ObjectOnGPU ()
 Destructor.
 
__host__ ObjectOnGPUoperator= (ObjectOnGPU const &other)=delete
 Copy assignment operator.
 
__host__ ObjectOnGPUoperator= (ObjectOnGPU &&other)
 Move assignment operator.
 
__host__ operator Object_t * ()
 
__host__ Object_tptr () const
 
__host__ Object_t const * const_ptr () const
 
__host__ void resize (int rows, int cols=_Cols)
 
__host__ Scalardata () const
 
__host__ Scalar const * const_data () const
 
__host__ int rows () const
 
__host__ int cols () const
 
__host__ int LD () const
 
template<class Derived >
__host__ ObjectOnGPUset (Eigen::PlainObjectBase< Derived > const &inMat, magma_queue_t queue)
 
template<class Derived >
__host__ ObjectOnGPUset (Eigen::PlainObjectBase< Derived > const &inMat)
 
__host__ Eigen::MatrixX< Scalarget () const
 

Static Public Attributes

static constexpr bool onGPU = true
 
static constexpr bool IsRowMajor = EigenMatrix_t::IsRowMajor
 

Private Attributes

Object_tm_ptr = nullptr
 
Object_t ** m_ptrptr = nullptr
 
bool is_constructed = false
 
_Scalar * m_data = nullptr
 
int m_rows = 0
 
int m_cols = 0
 
int m_LD = 0
 
int m_reserved = 0
 

Static Private Attributes

static constexpr int GPU_UNIT = 32
 

Friends

__host__ friend ObjectOnGPU operator* (ObjectOnGPU const &mat1, ObjectOnGPU const &mat2)
 
__host__ friend std::ostream & operator<< (std::ostream &os, const ObjectOnGPU &dMat)
 

Member Typedef Documentation

◆ EigenMatrix_t

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
using ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::EigenMatrix_t = Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>

◆ Object_t

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
using ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::Object_t = Eigen::Map< EigenMatrix_t, Eigen::Unaligned, Eigen::Stride<Eigen::Dynamic, 1> >

◆ RealScalar

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
using ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::RealScalar = typename Eigen::NumTraits<Scalar>::Real

◆ Scalar

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
using ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::Scalar = _Scalar

Constructor & Destructor Documentation

◆ ObjectOnGPU() [1/4]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
template<class Derived >
__host__ ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::ObjectOnGPU ( Eigen::PlainObjectBase< Derived > const &  hObject)
inline
43 : ObjectOnGPU(hObject.rows(), hObject.cols()) {
44 debug_constructor_printf(1);
45 this->set(hObject);
46 }
__host__ ObjectOnGPU & set(Eigen::PlainObjectBase< Derived > const &inMat, magma_queue_t queue)
Definition MatrixUtils.cuh:207
Definition ObjectOnGPU.cuh:149

◆ ObjectOnGPU() [2/4]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::ObjectOnGPU ( int  rows = _Rows,
int  cols = _Cols 
)
inline

Default constructor.

Parameters
rows
cols
54 {
55 debug_constructor_printf((Default));
56 cuCHECK(cudaMalloc((void***)&m_ptrptr, sizeof(Object_t*)));
57 this->resize(rows, cols);
58 }
Eigen::Map< EigenMatrix_t, Eigen::Unaligned, Eigen::Stride< Eigen::Dynamic, 1 > > Object_t
Definition MatrixUtils.cuh:31
__host__ void resize(int rows, int cols=_Cols)
Definition MatrixUtils.cuh:163
cuCHECK(cudaFuncGetAttributes(&attr, MatrixElementsInSector))

◆ ObjectOnGPU() [3/4]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::ObjectOnGPU ( ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > const &  other)
delete

Copy constructor.

Parameters
other

◆ ObjectOnGPU() [4/4]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::ObjectOnGPU ( ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > &&  other)
inline

Move constructor.

Parameters
other
71 : m_rows{other.m_rows},
72 m_cols{other.m_cols},
73 m_LD{other.m_LD},
74 m_reserved{other.m_reserved},
75 m_ptr{other.m_ptr},
76 m_ptrptr{other.m_ptrptr},
77 m_data{other.m_data},
78 is_constructed{other.is_constructed} {
79 other.m_rows = 0;
80 other.m_cols = 0;
81 other.m_LD = 0;
82 other.m_reserved = 0;
83 other.m_ptr = nullptr;
84 other.m_ptrptr = nullptr;
85 other.m_data = nullptr;
86 other.is_constructed = false;
87 }
T * m_ptr
Definition ObjectOnGPU.cuh:42
T ** m_ptrptr
Definition ObjectOnGPU.cuh:43

◆ ~ObjectOnGPU()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::~ObjectOnGPU ( )
inline

Destructor.

92 {
93 debug_destructor_printf();
94 debug_print("\tm_data = " << m_data << ", m_ptrptr=" << m_ptrptr
95 << ", m_ptr=" << m_ptr);
96 if(m_ptrptr != nullptr && is_constructed) {
97 debug_print("\tCalling destructObject_kernel.");
98 destructObject_kernel<<<1, 1>>>(m_ptrptr);
99 cuCHECK(cudaPeekAtLastError());
100 cuCHECK(cudaDeviceSynchronize());
101 is_constructed = false;
102 }
103 cuCHECK(cudaFree(m_ptrptr));
104 m_ptrptr = nullptr;
105
106 CHECK(magma_free(m_data));
107 m_data = nullptr;
108 }
debug_print("# Determining GPU configuration.")

Member Function Documentation

◆ cols()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::cols ( ) const
inline
203{ return m_cols; }

◆ const_data()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ Scalar const * ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::const_data ( ) const
inline
201{ return m_data; }

◆ const_ptr()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ Object_t const * ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::const_ptr ( ) const
inline
149{ return m_ptr; }

◆ data()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ Scalar * ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::data ( ) const
inline
200{ return m_data; }

◆ get()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ Eigen::MatrixX< Scalar > ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::get ( ) const
inline
240 {
241 debug_print(__PRETTY_FUNCTION__);
242 Eigen::MatrixX<Scalar> hMat(this->rows(), this->cols());
243 magma_queue_t queue = NULL;
244 magma_int_t dev = 0;
245 magma_getdevice(&dev);
246 magma_queue_create(dev, &queue);
247 magma_getmatrix(this->rows(), this->cols(), sizeof(Scalar), this->data(), this->LD(),
248 hMat.data(), hMat.rows(), queue);
249 magma_queue_destroy(queue);
250 return hMat;
251 }
Definition mytypes.hpp:147
__host__ Scalar * data() const
Definition MatrixUtils.cuh:200

◆ LD()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::LD ( ) const
inline
204{ return m_LD; }

◆ operator Object_t *()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::operator Object_t * ( )
inline
147{ return m_ptr; }

◆ operator=() [1/2]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU & ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::operator= ( ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > &&  other)
inline

Move assignment operator.

Parameters
other
121 {
122 if(this == &other) {
123 debug_printf("\tthis(%p) == &other(%p)\n", this, &other);
124 return *this;
125 }
126 m_rows = other.m_rows;
127 m_cols = other.m_cols;
128 m_LD = other.m_LD;
129 m_reserved = other.m_reserved;
130 m_ptr = other.m_ptr;
131 m_ptrptr = other.m_ptrptr;
132 m_data = other.m_data;
133 is_constructed = other.is_constructed;
134
135 other.m_rows = 0;
136 other.m_cols = 0;
137 other.m_LD = 0;
138 other.m_reserved = 0;
139 other.m_ptr = nullptr;
140 other.m_ptrptr = nullptr;
141 other.m_data = nullptr;
142 other.is_constructed = false;
143
144 return *this;
145 };

◆ operator=() [2/2]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ ObjectOnGPU & ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::operator= ( ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > const &  other)
delete

Copy assignment operator.

Parameters
other

◆ ptr()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ Object_t * ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::ptr ( ) const
inline
148{ return m_ptr; }

◆ resize()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ void ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::resize ( int  rows,
int  cols = _Cols 
)
inline
163 {
164 debug_print(__PRETTY_FUNCTION__);
165 m_rows = rows;
166 m_cols = cols;
167 int newReserved;
168 if constexpr(IsRowMajor) {
169 m_LD = magma_roundup(m_cols, GPU_UNIT);
170 newReserved = m_LD * m_rows;
171 }
172 else {
173 m_LD = magma_roundup(m_rows, GPU_UNIT);
174 newReserved = m_LD * m_cols;
175 }
176
177 if(m_reserved < newReserved) {
178 if(is_constructed) {
179 destructObject_kernel<<<1, 1>>>(m_ptrptr);
180 cuCHECK(cudaPeekAtLastError());
181 cuCHECK(cudaDeviceSynchronize());
182 }
183
184 is_constructed = false;
185 CHECK(magma_free(m_data));
186 m_data = nullptr;
187
188 m_reserved = newReserved;
189 CHECK(magma_malloc((void**)&m_data, m_reserved * sizeof(Scalar)));
190 // Only pass by value to the constructor is supported
191 constructObject_kernel<<<1, 1>>>(m_ptrptr, m_data, m_rows, m_cols,
192 Eigen::Stride<Eigen::Dynamic, 1>(m_LD, 1));
193 cuCHECK(cudaPeekAtLastError());
194 cuCHECK(cudaMemcpy(&m_ptr, m_ptrptr, sizeof(Object_t*), cudaMemcpyDeviceToHost));
195 is_constructed = true;
196 }
197 return;
198 }

◆ rows()

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::rows ( ) const
inline
202{ return m_rows; }

◆ set() [1/2]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
template<class Derived >
__host__ ObjectOnGPU & ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::set ( Eigen::PlainObjectBase< Derived > const &  inMat)
inline
229 {
230 debug_print(__PRETTY_FUNCTION__);
231 magma_queue_t queue = NULL;
232 magma_int_t dev = 0;
233 magma_getdevice(&dev);
234 magma_queue_create(dev, &queue);
235 this->set(inMat, queue);
236 magma_queue_destroy(queue);
237 return *this;
238 }

◆ set() [2/2]

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
template<class Derived >
__host__ ObjectOnGPU & ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::set ( Eigen::PlainObjectBase< Derived > const &  inMat,
magma_queue_t  queue 
)
inline
208 {
209 debug_print(__PRETTY_FUNCTION__);
210 this->resize(inMat.rows(), inMat.cols());
211 if constexpr(Derived::IsRowMajor == IsRowMajor
212 && std::is_same_v<Scalar, typename Derived::Scalar>) {
213 debug_print("\tcase1\n");
214 magma_setmatrix(inMat.innerSize(), inMat.outerSize(), sizeof(Scalar), inMat.data(),
215 inMat.innerSize(), m_data, m_LD, queue);
216 }
217 else {
218 // static_assert(std::is_same_v<Scalar, Complex_t<RealScalar> >);
219 debug_print("\tcase2\n");
220 EigenMatrix_t inMatCopy(inMat.template cast<_Scalar>());
221 magma_setmatrix(inMat.innerSize(), inMat.outerSize(), sizeof(_Scalar),
222 inMatCopy.data(), inMat.innerSize(), m_data, m_LD, queue);
223 }
224 return *this;
225 }
Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > EigenMatrix_t
Definition MatrixUtils.cuh:29

Friends And Related Symbol Documentation

◆ operator*

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ friend ObjectOnGPU operator* ( ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > const &  mat1,
ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > const &  mat2 
)
friend
253 {
254 constexpr Scalar alpha = {1, 0};
255 constexpr Scalar beta = {0, 0};
256 ObjectOnGPU res(mat1.rows(), mat2.cols());
257
258 magma_queue_t queue = NULL;
259 magma_int_t dev = 0;
260 magma_getdevice(&dev);
261 magma_queue_create(dev, &queue);
262 magma_hemm_wrapper(MagmaLeft, MagmaLower, res.rows(), res.cols(), alpha, mat1.data(),
263 mat1.LD(), mat2.data(), mat2.LD(), beta, res.data(), res.LD(),
264 queue);
265 // magma_queue_sync(queue);
266 magma_queue_destroy(queue);
267
268 return res;
269 }

◆ operator<<

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
__host__ friend std::ostream & operator<< ( std::ostream &  os,
const ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > &  dMat 
)
friend
271 {
272 debug_print(__PRETTY_FUNCTION__);
273 std::cout << dMat.get() << std::endl;
274 return os;
275 };

Member Data Documentation

◆ GPU_UNIT

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
constexpr int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::GPU_UNIT = 32
staticconstexprprivate

◆ is_constructed

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
bool ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::is_constructed = false
private

◆ IsRowMajor

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
constexpr bool ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::IsRowMajor = EigenMatrix_t::IsRowMajor
staticconstexpr

◆ m_cols

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_cols = 0
private

◆ m_data

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
_Scalar* ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_data = nullptr
private

◆ m_LD

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_LD = 0
private

◆ m_ptr

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
Object_t* ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_ptr = nullptr
private

◆ m_ptrptr

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
Object_t** ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_ptrptr = nullptr
private

◆ m_reserved

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_reserved = 0
private

◆ m_rows

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
int ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::m_rows = 0
private

◆ onGPU

template<typename _Scalar , int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
constexpr bool ObjectOnGPU< Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > >::onGPU = true
staticconstexpr

The documentation for this class was generated from the following file: