COMPASS  5.0.0
End-to-end AO simulation tool using GPU acceleration
carma_sparse_obj.h
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------
2 // This file is part of COMPASS <https://anr-compass.github.io/compass/>
3 //
4 // Copyright (C) 2011-2019 COMPASS Team <https://github.com/ANR-COMPASS>
5 // All rights reserved.
6 // Distributed under GNU - LGPL
7 //
8 // COMPASS is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
9 // General Public License as published by the Free Software Foundation, either version 3 of the License,
10 // or any later version.
11 //
12 // COMPASS: End-to-end AO simulation tool using GPU acceleration
13 // The COMPASS platform was designed to meet the need of high-performance for the simulation of AO systems.
14 //
15 // The final product includes a software package for simulating all the critical subcomponents of AO,
16 // particularly in the context of the ELT and a real-time core based on several control approaches,
17 // with performances consistent with its integration into an instrument. Taking advantage of the specific
18 // hardware architecture of the GPU, the COMPASS tool allows to achieve adequate execution speeds to
19 // conduct large simulation campaigns called to the ELT.
20 //
21 // The COMPASS platform can be used to carry a wide variety of simulations to both testspecific components
22 // of AO of the E-ELT (such as wavefront analysis device with a pyramid or elongated Laser star), and
23 // various systems configurations such as multi-conjugate AO.
24 //
25 // COMPASS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
26 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27 // See the GNU Lesser General Public License for more details.
28 //
29 // You should have received a copy of the GNU Lesser General Public License along with COMPASS.
30 // If not, see <https://www.gnu.org/licenses/lgpl-3.0.txt>.
31 // -----------------------------------------------------------------------------
32 
41 
42 
43 #ifndef CARMA_SPARSE_OBJ_H_
44 #define CARMA_SPARSE_OBJ_H_
45 #include <cusparse_v2.h>
46 #include "carma_obj.h"
47 
48 template <class T_data>
49 class CarmaSparseHostObj;
50 
51 #ifndef USE_MAGMA_SPARSE
52 typedef void *magma_d_sparse_matrix;
53 typedef void *magma_s_sparse_matrix;
54 #else
55 #include "magmasparse.h"
56 #endif
57 
58 template <class T_data>
59 class CarmaSparseObj {
60  public:
61  long dims_data[3];
62  int nz_elem;
63  int device;
65 
66  // ZERO-BASED INDEXING CSR-FORMAT
67  T_data *d_data; // nz_elem elements
68  int *d_rowind; // dim1+1 elements
69  int *d_colind; // nz_elem elements
70  cusparseMatDescr_t descr;
71 
72  char major_dim;
73  std::string format;
74  int block_dim; // blockdim for BSR format
75 
76  // Magma stuff
77  union {
80  };
81 
82  private:
83  public:
89  CarmaSparseObj(CarmaContext *current_context, const long *dims, T_data *M,
90  bool load_from_host);
92  T_data *values, int *colind, int *rowind, int nz,
93  bool load_from_host);
94  virtual ~CarmaSparseObj();
95 
98 
99  void resize(int nnz_, int dim1_, int dim2_);
102  char get_major_dim() const { return major_dim; }
103  void set_majorDim(char c) { major_dim = c; }
104 
106  operator T_data *() { return d_data; }
107  T_data *operator[](int index) { return &d_data[index]; }
108  T_data *get_data() { return d_data; }
109  T_data *get_data(int index) { return &d_data[index]; }
110  const long *get_dims() { return dims_data; }
111  long get_dims(int i) { return dims_data[i]; }
112  int get_nonzero_elem() { return nz_elem; }
114 
115  int get_device() { return device; }
116 
117  void sparse_to_host(int *h_rowInd, int *h_colInd, T_data *h_data);
118 
119  private:
120  void _create(int nnz_, int dim1_, int dim2_);
121  void _clear();
122 
123  template <cusparseStatus_t CUSPARSEAPI (*ptr_nnz)(
124  cusparseHandle_t handle, cusparseDirection_t dirA, int m, int n,
125  const cusparseMatDescr_t descrA, const T_data *A, int lda,
126  int *nnzPerRowCol, int *nnzTotalDevHostPtr),
127  cusparseStatus_t CUSPARSEAPI (*ptr_dense2csr)(
128  cusparseHandle_t handle, int m, int n,
129  const cusparseMatDescr_t descrA, const T_data *A, int lda,
130  const int *nnzPerRow, T_data *csrValA, int *csrRowPtrA,
131  int *csrColIndA)>
132  void init_carma_sparse_obj(CarmaContext *current_context, const long *dims,
133  T_data *M, bool load_from_host);
134 };
135 
136 template <class T_data>
137 cusparseStatus_t carma_gemv(cusparseHandle_t handle, char op_A, T_data alpha,
138  CarmaSparseObj<T_data> *A, T_data *x, T_data beta,
139  T_data *y);
140 
141 template <class T_data>
142 cusparseStatus_t carma_gemm(cusparseHandle_t handle, char op_A, T_data alpha,
144  T_data beta, CarmaObj<T_data> *C);
145 
146 template <class T_data>
147 cusparseStatus_t carma_gemm(cusparseHandle_t handle, char op_A, char op_B,
151 
152 template <class T_data>
153 cusparseStatus_t carma_csr2dense(CarmaSparseObj<T_data> *src, T_data *dest);
154 
155 template <class T_data>
156 cusparseStatus_t carma_csr2bsr(CarmaSparseObj<T_data> *src, int block_dim,
157  CarmaSparseObj<T_data> *dest);
158 
159 template <class T_data>
160 cusparseStatus_t carma_bsr2csr(CarmaSparseObj<T_data> *src,
161  CarmaSparseObj<T_data> *dest);
162 
163 template <class T_data>
164 int carma_kgemv(CarmaSparseObj<T_data> *A, T_data alpha,
165  const T_data *__restrict x, T_data beta, T_data *y);
166 #endif /* CARMA_SPARSE_OBJ_H_ */
CarmaSparseObj::get_context
CarmaContext * get_context()
Definition: carma_sparse_obj.h:113
CarmaSparseObj::is_column_major
bool is_column_major()
CarmaSparseObj::get_dims
const long * get_dims()
Definition: carma_sparse_obj.h:110
CarmaSparseObj::get_device
int get_device()
Definition: carma_sparse_obj.h:115
CarmaSparseObj::d_sparse_mat
magma_d_sparse_matrix d_sparse_mat
Definition: carma_sparse_obj.h:78
CarmaSparseObj::descr
cusparseMatDescr_t descr
Definition: carma_sparse_obj.h:70
CarmaSparseObj::CarmaSparseObj
CarmaSparseObj(CarmaContext *current_context)
CarmaSparseObj::operator=
void operator=(CarmaSparseHostObj< T_data > &M)
magma_s_sparse_matrix
void * magma_s_sparse_matrix
Definition: carma_sparse_obj.h:53
CarmaSparseObj::CarmaSparseObj
CarmaSparseObj(CarmaContext *current_context, const long *dims, T_data *values, int *colind, int *rowind, int nz, bool load_from_host)
CarmaSparseObj::resize
void resize(int nnz_, int dim1_, int dim2_)
magma_d_sparse_matrix
void * magma_d_sparse_matrix
Definition: carma_sparse_obj.h:49
carma_csr2bsr
cusparseStatus_t carma_csr2bsr(CarmaSparseObj< T_data > *src, int block_dim, CarmaSparseObj< T_data > *dest)
CarmaSparseObj::current_context
CarmaContext * current_context
Definition: carma_sparse_obj.h:64
CarmaSparseObj::dims_data
long dims_data[3]
dimensions of the array
Definition: carma_sparse_obj.h:61
CarmaSparseObj::~CarmaSparseObj
virtual ~CarmaSparseObj()
CarmaSparseObj::get_nonzero_elem
int get_nonzero_elem()
Definition: carma_sparse_obj.h:112
CarmaSparseObj::major_dim
char major_dim
Definition: carma_sparse_obj.h:72
CarmaSparseObj::d_colind
int * d_colind
Definition: carma_sparse_obj.h:69
CarmaSparseObj::CarmaSparseObj
CarmaSparseObj(CarmaContext *current_context, CarmaSparseHostObj< T_data > *M)
CarmaSparseObj::init_from_transpose
void init_from_transpose(CarmaSparseObj< T_data > *M)
CarmaSparseObj::set_majorDim
void set_majorDim(char c)
Definition: carma_sparse_obj.h:103
CarmaSparseObj::block_dim
int block_dim
Definition: carma_sparse_obj.h:74
CarmaObj
this class provides wrappers to the generic carma object
Definition: carma_host_obj.h:65
CarmaSparseObj::get_major_dim
char get_major_dim() const
Definition: carma_sparse_obj.h:102
carma_obj.h
CarmaContext
this class provides the context in which CarmaObj are created
Definition: carma_context.h:104
CarmaSparseObj
this class provides wrappers to the generic carma sparse object
Definition: carma_sparse_host_obj.h:48
CarmaSparseObj::d_data
T_data * d_data
Definition: carma_sparse_obj.h:67
CarmaSparseObj::nz_elem
int nz_elem
number of elements in the array
Definition: carma_sparse_obj.h:62
CarmaSparseObj::CarmaSparseObj
CarmaSparseObj(CarmaObj< T_data > *M)
CarmaSparseObj::get_dims
long get_dims(int i)
Definition: carma_sparse_obj.h:111
carma_kgemv
int carma_kgemv(CarmaSparseObj< T_data > *A, T_data alpha, const T_data *__restrict x, T_data beta, T_data *y)
carma_gemm
cusparseStatus_t carma_gemm(cusparseHandle_t handle, char op_A, T_data alpha, CarmaSparseObj< T_data > *A, CarmaObj< T_data > *B, T_data beta, CarmaObj< T_data > *C)
carma_csr2dense
cusparseStatus_t carma_csr2dense(CarmaSparseObj< T_data > *src, T_data *dest)
CarmaSparseObj::CarmaSparseObj
CarmaSparseObj(CarmaSparseObj< T_data > *M)
carma_bsr2csr
cusparseStatus_t carma_bsr2csr(CarmaSparseObj< T_data > *src, CarmaSparseObj< T_data > *dest)
CarmaSparseObj::sparse_to_host
void sparse_to_host(int *h_rowInd, int *h_colInd, T_data *h_data)
carma_gemv
cusparseStatus_t carma_gemv(cusparseHandle_t handle, char op_A, T_data alpha, CarmaSparseObj< T_data > *A, T_data *x, T_data beta, T_data *y)
CarmaSparseObj::operator=
void operator=(CarmaSparseObj< T_data > &M)
CarmaSparseObj::operator[]
T_data * operator[](int index)
Definition: carma_sparse_obj.h:107
CarmaSparseHostObj
this class provides wrappers to the generic carma sparse host object
Definition: carma_sparse_host_obj.h:51
CarmaSparseObj::device
int device
device where the CarmaObj is allocate
Definition: carma_sparse_obj.h:63
CarmaSparseObj::get_data
T_data * get_data(int index)
Definition: carma_sparse_obj.h:109
CarmaSparseObj::d_rowind
int * d_rowind
Definition: carma_sparse_obj.h:68
CarmaSparseObj::get_data
T_data * get_data()
Definition: carma_sparse_obj.h:108
CarmaSparseObj::s_sparse_mat
magma_s_sparse_matrix s_sparse_mat
Definition: carma_sparse_obj.h:79
CarmaSparseObj::format
std::string format
Definition: carma_sparse_obj.h:73
CarmaSparseObj::CarmaSparseObj
CarmaSparseObj(CarmaContext *current_context, const long *dims, T_data *M, bool load_from_host)