monolish  0.15.1
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 {
14 template <typename Float> class Dense {
15 private:
19  size_t rowN;
20 
24  size_t colN;
25 
29  size_t nnz;
30 
34  mutable bool gpu_status = false;
35 
36 public:
40  std::vector<Float> val;
41 
42  Dense() {}
43 
52  void convert(const COO<Float> &coo);
53 
62  void convert(const Dense<Float> &dense);
63 
72  Dense(const COO<Float> &coo) { convert(coo); }
73 
86  Dense(const Dense<Float> &dense);
87 
97  Dense(const size_t M, const size_t N);
98 
109  Dense(const size_t M, const size_t N, const Float *value);
110 
121  Dense(const size_t M, const size_t N, const std::vector<Float> &value);
122 
133  Dense(const size_t M, const size_t N, const vector<Float> &value);
134 
145  Dense(const size_t M, const size_t N,
146  const std::initializer_list<Float> &list);
147 
159  Dense(const size_t M, const size_t N, const Float min, const Float max);
160 
171  Dense(const size_t M, const size_t N, const Float value);
172 
183  void set_ptr(const size_t M, const size_t N, const std::vector<Float> &value);
184 
192  [[nodiscard]] size_t get_row() const { return rowN; }
193 
201  [[nodiscard]] size_t get_col() const { return colN; }
202 
210  [[nodiscard]] size_t get_nnz() const { return get_row() * get_col(); }
211 
219  void set_row(const size_t N) { rowN = N; };
220 
228  void set_col(const size_t M) { colN = M; };
229 
237  void set_nnz(const size_t NZ) { nnz = NZ; };
238 
246  [[nodiscard]] std::string type() const { return "Dense"; }
247 
258  void transpose();
259 
268  void transpose(const Dense &B);
269 
277  [[nodiscard]] double get_data_size() const {
278  return get_nnz() * sizeof(Float) / 1.0e+9;
279  }
280 
291  [[nodiscard]] Float at(const size_t i, const size_t j) const;
292 
303  [[nodiscard]] Float at(const size_t i, const size_t j) {
304  return static_cast<const Dense *>(this)->at(i, j);
305  };
306 
318  void insert(const size_t i, const size_t j, const Float Val);
319 
328  void print_all(bool force_cpu = false) const;
329 
330  // communication
331  // ///////////////////////////////////////////////////////////////////////////
339  void send() const;
340 
348  void recv();
349 
357  void nonfree_recv();
358 
366  void device_free() const;
367 
372  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; }
373 
381  ~Dense() {
382  if (get_device_mem_stat()) {
383  device_free();
384  }
385  }
386 
388 
396  void diag(vector<Float> &vec) const;
397  void diag(view1D<vector<Float>, Float> &vec) const;
398  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
399 
409  void row(const size_t r, vector<Float> &vec) const;
410  void row(const size_t r, view1D<vector<Float>, Float> &vec) const;
411  void row(const size_t r, view1D<matrix::Dense<Float>, Float> &vec) const;
412 
422  void col(const size_t c, vector<Float> &vec) const;
423  void col(const size_t c, view1D<vector<Float>, Float> &vec) const;
424  void col(const size_t c, view1D<matrix::Dense<Float>, Float> &vec) const;
425 
427 
436  void fill(Float value);
437 
449  void operator=(const Dense<Float> &mat);
450 
462  [[nodiscard]] Float *operator[](size_t m) {
463  if (get_device_mem_stat()) {
464  throw std::runtime_error("Error, GPU matrix dense cant use operator[]");
465  }
466  return val.data() + m * get_col();
467  }
468 
479  [[nodiscard]] bool equal(const Dense<Float> &mat,
480  bool compare_cpu_and_device = false) const;
481 
493  [[nodiscard]] bool operator==(const Dense<Float> &mat) const;
494 
506  [[nodiscard]] bool operator!=(const Dense<Float> &mat) const;
507 
509 
518  void diag_add(const Float alpha);
519 
528  void diag_sub(const Float alpha);
529 
538  void diag_mul(const Float alpha);
539 
548  void diag_div(const Float alpha);
549 
558  void diag_add(const vector<Float> &vec);
559  void diag_add(const view1D<vector<Float>, Float> &vec);
560  void diag_add(const view1D<matrix::Dense<Float>, Float> &vec);
561 
570  void diag_sub(const vector<Float> &vec);
571  void diag_sub(const view1D<vector<Float>, Float> &vec);
572  void diag_sub(const view1D<matrix::Dense<Float>, Float> &vec);
573 
582  void diag_mul(const vector<Float> &vec);
583  void diag_mul(const view1D<vector<Float>, Float> &vec);
584  void diag_mul(const view1D<matrix::Dense<Float>, Float> &vec);
585 
594  void diag_div(const vector<Float> &vec);
595  void diag_div(const view1D<vector<Float>, Float> &vec);
596  void diag_div(const view1D<matrix::Dense<Float>, Float> &vec);
597 };
598 } // namespace matrix
599 } // namespace monolish
monolish::matrix::Dense::Dense
Dense()
Definition: monolish_dense.hpp:42
monolish::matrix::Dense::operator!=
bool operator!=(const Dense< Float > &mat) const
Comparing matricies (A != mat)
monolish::matrix::Dense::transpose
void transpose()
get transposed matrix (A = A^T)
monolish::vml::min
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::matrix::Dense::insert
void insert(const size_t i, const size_t j, const Float Val)
get element A[i][j]
monolish::matrix::Dense::operator=
void operator=(const Dense< Float > &mat)
matrix copy
monolish::matrix::Dense::operator==
bool operator==(const Dense< Float > &mat) const
Comparing matricies (A == mat)
monolish::matrix::Dense::diag_div
void diag_div(const Float alpha)
Scalar and diag. vector of dense matrix div.
monolish::matrix::Dense::~Dense
~Dense()
destructor of CRS matrix, free GPU memory
Definition: monolish_dense.hpp:381
monolish::matrix::Dense::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_dense.hpp:372
monolish::vml::max
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],...
monolish::matrix::Dense::get_row
size_t get_row() const
get # of row
Definition: monolish_dense.hpp:192
monolish::matrix::Dense::val
std::vector< Float > val
Dense format value(size M x N)
Definition: monolish_dense.hpp:40
monolish_matrix.hpp
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:28
monolish::matrix::Dense::operator[]
Float * operator[](size_t m)
reference to the pointer of the begining of the m-th row
Definition: monolish_dense.hpp:462
monolish::matrix::Dense::get_data_size
double get_data_size() const
Memory data space required by the matrix.
Definition: monolish_dense.hpp:277
monolish::matrix::Dense::fill
void fill(Float value)
fill matrix elements with a scalar value
monolish::matrix::Dense::print_all
void print_all(bool force_cpu=false) const
print all elements to standard I/O
monolish::matrix::Dense::set_col
void set_col(const size_t M)
Set column number.
Definition: monolish_dense.hpp:228
monolish::matrix::Dense::convert
void convert(const COO< Float > &coo)
Create Dense matrix from COO matrix.
monolish::matrix::Dense::col
void col(const size_t c, vector< Float > &vec) const
get column vector
monolish::matrix::Dense::diag_add
void diag_add(const Float alpha)
Scalar and diag. vector of dense matrix add.
monolish::matrix::Dense::diag_sub
void diag_sub(const Float alpha)
Scalar and diag. vector of dense matrix sub.
monolish::matrix::Dense::nnz
size_t nnz
# of non-zero element (M * N)
Definition: monolish_dense.hpp:29
monolish::matrix::Dense::gpu_status
bool gpu_status
true: sended, false: not send
Definition: monolish_dense.hpp:34
monolish::matrix::Dense::nonfree_recv
void nonfree_recv()
recv. data to GPU (w/o free)
monolish::matrix::Dense::colN
size_t colN
# of col
Definition: monolish_dense.hpp:24
monolish
Definition: monolish_matrix_blas.hpp:10
monolish::matrix::Dense::rowN
size_t rowN
# of row
Definition: monolish_dense.hpp:19
monolish::matrix::Dense::diag_mul
void diag_mul(const Float alpha)
Scalar and diag. vector of dense matrix mul.
monolish::matrix::Dense::set_nnz
void set_nnz(const size_t NZ)
Set # of non-zero elements.
Definition: monolish_dense.hpp:237
monolish::matrix::Dense::type
std::string type() const
get format name "Dense"
Definition: monolish_dense.hpp:246
monolish::matrix::COO
Coodinate (COO) format Matrix (need to sort)
Definition: monolish_coo.hpp:38
monolish::matrix::Dense::equal
bool equal(const Dense< Float > &mat, bool compare_cpu_and_device=false) const
Comparing matricies (A == mat)
monolish::matrix::Dense::send
void send() const
send data to GPU
monolish::view1D
1D view class
Definition: monolish_coo.hpp:26
monolish::matrix::Dense::set_ptr
void set_ptr(const size_t M, const size_t N, const std::vector< Float > &value)
Set Dense array from std::vector.
monolish::matrix::Dense::get_col
size_t get_col() const
get # of col
Definition: monolish_dense.hpp:201
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::matrix::Dense::get_nnz
size_t get_nnz() const
get # of non-zeros
Definition: monolish_dense.hpp:210
monolish::matrix::Dense::device_free
void device_free() const
free data on GPU
monolish::matrix::Dense::at
Float at(const size_t i, const size_t j)
get element A[i][j] (only CPU)
Definition: monolish_dense.hpp:303
monolish::matrix::Dense::Dense
Dense(const COO< Float > &coo)
Create dense matrix from COO matrix.
Definition: monolish_dense.hpp:72
monolish::matrix::Dense::at
Float at(const size_t i, const size_t j) const
get element A[i][j]
monolish::matrix::Dense::recv
void recv()
recv. data to GPU, and free data on GPU
monolish::matrix::Dense::row
void row(const size_t r, vector< Float > &vec) const
get row vector
monolish::matrix::Dense::set_row
void set_row(const size_t N)
Set row number.
Definition: monolish_dense.hpp:219
monolish::matrix::Dense::diag
void diag(vector< Float > &vec) const
get diag. vector