monolish  0.16.2
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_dense.hpp
Go to the documentation of this file.
1 #pragma once
2 #include "monolish_matrix.hpp"
3 
4 namespace monolish {
5 template <typename Float> class vector;
6 template <typename TYPE, typename Float> class view1D;
7 namespace matrix {
8 
20 template <typename Float> class Dense {
21 private:
25  size_t rowN;
26 
30  size_t colN;
31 
35  size_t nnz;
36 
40  mutable bool gpu_status = false;
41 
42 public:
46  std::vector<Float> val;
47 
48  Dense() {}
49 
58  void convert(const COO<Float> &coo);
59 
68  void convert(const Dense<Float> &dense);
69 
78  Dense(const COO<Float> &coo) { convert(coo); }
79 
92  Dense(const Dense<Float> &dense);
93 
107  Dense(const Dense<Float> &dense, Float value);
108 
118  Dense(const size_t M, const size_t N);
119 
130  Dense(const size_t M, const size_t N, const Float *value);
131 
142  Dense(const size_t M, const size_t N, const std::vector<Float> &value);
143 
154  Dense(const size_t M, const size_t N, const vector<Float> &value);
155 
166  Dense(const size_t M, const size_t N,
167  const std::initializer_list<Float> &list);
168 
181  Dense(const size_t M, const size_t N, const Float min, const Float max);
182 
195  Dense(const size_t M, const size_t N, const Float min, const Float max,
196  const std::uint32_t seed);
197 
208  Dense(const size_t M, const size_t N, const Float value);
209 
220  void set_ptr(const size_t M, const size_t N, const std::vector<Float> &value);
221 
229  [[nodiscard]] size_t get_row() const { return rowN; }
230 
238  [[nodiscard]] size_t get_col() const { return colN; }
239 
247  [[nodiscard]] size_t get_nnz() const { return get_row() * get_col(); }
248 
256  void set_row(const size_t N) { rowN = N; };
257 
265  void set_col(const size_t M) { colN = M; };
266 
274  void set_nnz(const size_t NZ) { nnz = NZ; };
275 
283  [[nodiscard]] std::string type() const { return "Dense"; }
284 
295  void transpose();
296 
305  void transpose(const Dense &B);
306 
314  [[nodiscard]] double get_data_size() const {
315  return get_nnz() * sizeof(Float) / 1.0e+9;
316  }
317 
328  [[nodiscard]] Float at(const size_t i, const size_t j) const;
329 
340  [[nodiscard]] Float at(const size_t i, const size_t j) {
341  return static_cast<const Dense *>(this)->at(i, j);
342  };
343 
355  void insert(const size_t i, const size_t j, const Float Val);
356 
365  void print_all(bool force_cpu = false) const;
366 
367  // communication
368  // ///////////////////////////////////////////////////////////////////////////
376  void send() const;
377 
385  void recv();
386 
394  void nonfree_recv();
395 
403  void device_free() const;
404 
409  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; }
410 
418  ~Dense() {
419  if (get_device_mem_stat()) {
420  device_free();
421  }
422  }
423 
425 
433  void diag(vector<Float> &vec) const;
434  void diag(view1D<vector<Float>, Float> &vec) const;
435  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
436 
446  void row(const size_t r, vector<Float> &vec) const;
447  void row(const size_t r, view1D<vector<Float>, Float> &vec) const;
448  void row(const size_t r, view1D<matrix::Dense<Float>, Float> &vec) const;
449 
459  void col(const size_t c, vector<Float> &vec) const;
460  void col(const size_t c, view1D<vector<Float>, Float> &vec) const;
461  void col(const size_t c, view1D<matrix::Dense<Float>, Float> &vec) const;
462 
464 
473  void fill(Float value);
474 
486  void operator=(const Dense<Float> &mat);
487 
499  [[nodiscard]] Float *operator[](size_t m) {
500  if (get_device_mem_stat()) {
501  throw std::runtime_error("Error, GPU matrix dense cant use operator[]");
502  }
503  return val.data() + m * get_col();
504  }
505 
516  [[nodiscard]] bool equal(const Dense<Float> &mat,
517  bool compare_cpu_and_device = false) const;
518 
530  [[nodiscard]] bool operator==(const Dense<Float> &mat) const;
531 
543  [[nodiscard]] bool operator!=(const Dense<Float> &mat) const;
544 
546 
555  void diag_add(const Float alpha);
556 
565  void diag_sub(const Float alpha);
566 
575  void diag_mul(const Float alpha);
576 
585  void diag_div(const Float alpha);
586 
595  void diag_add(const vector<Float> &vec);
596  void diag_add(const view1D<vector<Float>, Float> &vec);
597  void diag_add(const view1D<matrix::Dense<Float>, Float> &vec);
598 
607  void diag_sub(const vector<Float> &vec);
608  void diag_sub(const view1D<vector<Float>, Float> &vec);
609  void diag_sub(const view1D<matrix::Dense<Float>, Float> &vec);
610 
619  void diag_mul(const vector<Float> &vec);
620  void diag_mul(const view1D<vector<Float>, Float> &vec);
621  void diag_mul(const view1D<matrix::Dense<Float>, Float> &vec);
622 
631  void diag_div(const vector<Float> &vec);
632  void diag_div(const view1D<vector<Float>, Float> &vec);
633  void diag_div(const view1D<matrix::Dense<Float>, Float> &vec);
634 };
637 } // namespace matrix
638 } // namespace monolish
Coodinate (COO) format Matrix (need to sort)
Dense format Matrix.
void row(const size_t r, view1D< vector< Float >, Float > &vec) const
Float at(const size_t i, const size_t j) const
get element A[i][j]
Float at(const size_t i, const size_t j)
get element A[i][j] (only CPU)
void row(const size_t r, view1D< matrix::Dense< Float >, Float > &vec) const
void set_nnz(const size_t NZ)
Set # of non-zero elements.
std::string type() const
get format name "Dense"
Dense(const Dense< Float > &dense, Float value)
Create Dense matrix of the same size as input matrix.
bool operator!=(const Dense< Float > &mat) const
Comparing matrices (A != mat)
bool get_device_mem_stat() const
true: sended, false: not send
void print_all(bool force_cpu=false) const
print all elements to standard I/O
void col(const size_t c, view1D< vector< Float >, Float > &vec) const
void diag_add(const view1D< vector< Float >, Float > &vec)
void diag_mul(const view1D< matrix::Dense< Float >, Float > &vec)
void convert(const Dense< Float > &dense)
Create Dense matrix from Dense matrix.
Float * operator[](size_t m)
reference to the pointer of the begining of the m-th row
Dense(const size_t M, const size_t N, const Float min, const Float max, const std::uint32_t seed)
Create random dense matrix from dense matrix.
Dense(const size_t M, const size_t N, const Float value)
Create construct dense matrix.
Dense(const COO< Float > &coo)
Create dense matrix from COO matrix.
Dense(const size_t M, const size_t N, const Float *value)
Create dense matrix from array.
void diag(vector< Float > &vec) const
get diag. vector
Dense(const size_t M, const size_t N, const vector< Float > &value)
Create dense matrix from monolish::vector.
size_t get_col() const
get # of col
~Dense()
destructor of CRS matrix, free GPU memory
void diag_mul(const view1D< vector< Float >, Float > &vec)
void transpose()
get transposed matrix (A = A^T)
bool operator==(const Dense< Float > &mat) const
Comparing matrices (A == mat)
void set_ptr(const size_t M, const size_t N, const std::vector< Float > &value)
Set Dense array from std::vector.
void col(const size_t c, view1D< matrix::Dense< Float >, Float > &vec) const
void diag_sub(const vector< Float > &vec)
Vector and diag. vector of Dense format matrix sub.
Dense(const size_t M, const size_t N)
Allocate dense matrix.
void diag_div(const view1D< matrix::Dense< Float >, Float > &vec)
bool gpu_status
true: sended, false: not send
std::vector< Float > val
Dense format value(size M x N)
void diag(view1D< vector< Float >, Float > &vec) const
bool equal(const Dense< Float > &mat, bool compare_cpu_and_device=false) const
Comparing matrices (A == mat)
size_t get_row() const
get # of row
void recv()
recv. data to GPU, and free data on GPU
void fill(Float value)
fill matrix elements with a scalar value
void transpose(const Dense &B)
create transposed matrix from Dense format matrix (A = B^T)
void diag_add(const Float alpha)
Scalar and diag. vector of Dense format matrix add.
void diag_add(const vector< Float > &vec)
Vector and diag. vector of Dense format matrix add.
void row(const size_t r, vector< Float > &vec) const
get row vector
double get_data_size() const
Memory data space required by the matrix.
void diag_sub(const view1D< matrix::Dense< Float >, Float > &vec)
size_t get_nnz() const
get # of non-zeros
void device_free() const
free data on GPU
Dense(const Dense< Float > &dense)
Create Dense matrix from Dense matrix.
void diag_sub(const view1D< vector< Float >, Float > &vec)
Dense(const size_t M, const size_t N, const std::initializer_list< Float > &list)
Create dense matrix from std::initializer_list.
void diag_sub(const Float alpha)
Scalar and diag. vector of Dense format matrix sub.
void diag_div(const vector< Float > &vec)
Vector and diag. vector of Dense format matrix div.
size_t nnz
# of non-zero element (M * N)
void col(const size_t c, vector< Float > &vec) const
get column vector
void operator=(const Dense< Float > &mat)
matrix copy
void set_col(const size_t M)
Set column number.
void diag_div(const view1D< vector< Float >, Float > &vec)
void diag(view1D< matrix::Dense< Float >, Float > &vec) const
void diag_mul(const Float alpha)
Scalar and diag. vector of Dense format matrix mul.
void insert(const size_t i, const size_t j, const Float Val)
get element A[i][j]
void convert(const COO< Float > &coo)
Create Dense matrix from COO matrix.
void set_row(const size_t N)
Set row number.
void diag_mul(const vector< Float > &vec)
Vector and diag. vector of Dense format matrix mul.
void diag_add(const view1D< matrix::Dense< Float >, Float > &vec)
Dense(const size_t M, const size_t N, const std::vector< Float > &value)
Create dense matrix from std::vector.
Dense(const size_t M, const size_t N, const Float min, const Float max)
Create random dense matrix from dense matrix.
void send() const
send data to GPU
void nonfree_recv()
recv. data to GPU (w/o free)
void diag_div(const Float alpha)
Scalar and diag. vector of Dense format matrix div.
void max(const matrix::CRS< double > &A, const matrix::CRS< double > &B, matrix::CRS< double > &C)
Create a new CRS matrix with greatest elements of two matrices (C[0:nnz] = max(A[0:nnz],...
void min(const matrix::CRS< double > &A, const matrix::CRS< double > &B, matrix::CRS< double > &C)
Create a new CRS matrix with smallest elements of two matrices (C[0:nnz] = min(A[0:nnz],...
monolish namespaces