monolish  0.17.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 #include "monolish_tensor.hpp"
4 
5 namespace monolish {
6 template <typename Float> class vector;
7 template <typename TYPE, typename Float> class view1D;
8 namespace matrix {
9 
21 template <typename Float> class Dense {
22 private:
26  size_t rowN;
27 
31  size_t colN;
32 
36  // size_t nnz;
37 
41  mutable bool gpu_status = false;
42 
43 public:
47  std::shared_ptr<Float> val;
48 
52  size_t val_nnz = 0;
53 
57  std::size_t alloc_nnz = 0;
58 
62  bool val_create_flag = false;
63 
64  Dense() { val_create_flag = true; }
65 
74  void convert(const COO<Float> &coo);
75 
84  void convert(const Dense<Float> &dense);
85 
94  Dense(const COO<Float> &coo) {
95  val_create_flag = true;
96  convert(coo);
97  }
98 
111  Dense(const Dense<Float> &dense);
112 
126  Dense(const Dense<Float> &dense, Float value);
127 
137  Dense(const size_t M, const size_t N);
138 
149  Dense(const size_t M, const size_t N, const Float *value);
150 
161  Dense(const size_t M, const size_t N, const std::vector<Float> &value);
162 
173  Dense(const size_t M, const size_t N, const vector<Float> &value);
174 
185  Dense(const size_t M, const size_t N,
186  const std::initializer_list<Float> &list);
187 
200  Dense(const size_t M, const size_t N, const Float min, const Float max);
201 
214  Dense(const size_t M, const size_t N, const Float min, const Float max,
215  const std::uint32_t seed);
216 
227  Dense(const size_t M, const size_t N, const Float value);
228 
239  void set_ptr(const size_t M, const size_t N, const std::vector<Float> &value);
240 
251  void set_ptr(const size_t M, const size_t N, const Float *value);
252 
260  [[nodiscard]] size_t get_row() const { return rowN; }
261 
269  [[nodiscard]] size_t get_col() const { return colN; }
270 
278  [[nodiscard]] size_t get_nnz() const { return get_row() * get_col(); }
279 
287  void set_row(const size_t N) { rowN = N; };
288 
296  void set_col(const size_t M) { colN = M; };
297 
305  // void set_nnz(const size_t NZ) { val_nnz = NZ; };
306 
314  [[nodiscard]] std::string type() const { return "Dense"; }
315 
326  void transpose();
327 
336  void transpose(const Dense &B);
337 
345  [[nodiscard]] double get_data_size() const {
346  return get_nnz() * sizeof(Float) / 1.0e+9;
347  }
348 
359  [[nodiscard]] Float at(const size_t i, const size_t j) const;
360 
371  [[nodiscard]] Float at(const size_t i, const size_t j) {
372  return static_cast<const Dense *>(this)->at(i, j);
373  };
374 
385  void insert(const size_t i, const size_t j, const Float Val);
386 
395  void print_all(bool force_cpu = false) const;
396 
397  // communication
398  // ///////////////////////////////////////////////////////////////////////////
406  void send() const;
407 
415  void recv();
416 
424  void nonfree_recv();
425 
433  void device_free() const;
434 
439  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; }
440 
448  ~Dense() {
449  if (val_create_flag) {
450  if (get_device_mem_stat()) {
451  device_free();
452  }
453  }
454  }
455 
462  [[nodiscard]] const Float *data() const { return val.get(); }
463 
470  [[nodiscard]] Float *data() { return val.get(); }
471 
480  void resize(size_t N, Float Val = 0) {
481  if (get_device_mem_stat()) {
482  throw std::runtime_error("Error, GPU matrix cant use resize");
483  }
484  if (val_create_flag) {
485  std::shared_ptr<Float> tmp(new Float[N], std::default_delete<Float[]>());
486  size_t copy_size = std::min(val_nnz, N);
487  for (size_t i = 0; i < copy_size; ++i) {
488  tmp.get()[i] = data()[i];
489  }
490  for (size_t i = copy_size; i < N; ++i) {
491  tmp.get()[i] = Val;
492  }
493  val = tmp;
494  alloc_nnz = N;
495  val_nnz = N;
496  } else {
497  throw std::runtime_error("Error, not create vector cant use resize");
498  }
499  }
500 
501  void move(const tensor::tensor_Dense<Float> &tensor_dense);
502 
503  void move(const tensor::tensor_Dense<Float> &tensor_dense, int rowN,
504  int colN);
505 
507 
515  void diag(vector<Float> &vec) const;
516  void diag(view1D<vector<Float>, Float> &vec) const;
517  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
518  void diag(view1D<tensor::tensor_Dense<Float>, Float> &vec) const;
519 
529  void row(const size_t r, vector<Float> &vec) const;
530  void row(const size_t r, view1D<vector<Float>, Float> &vec) const;
531  void row(const size_t r, view1D<matrix::Dense<Float>, Float> &vec) const;
532  void row(const size_t r,
533  view1D<tensor::tensor_Dense<Float>, Float> &vec) const;
534 
544  void col(const size_t c, vector<Float> &vec) const;
545  void col(const size_t c, view1D<vector<Float>, Float> &vec) const;
546  void col(const size_t c, view1D<matrix::Dense<Float>, Float> &vec) const;
547  void col(const size_t c,
548  view1D<tensor::tensor_Dense<Float>, Float> &vec) const;
549 
551 
560  void fill(Float value);
561 
574  void operator=(const Dense<Float> &mat);
575 
585  [[nodiscard]] Float &operator[](size_t i) {
586  if (get_device_mem_stat()) {
587  throw std::runtime_error("Error, GPU vector cant use operator[]");
588  }
589  return data()[i];
590  }
591 
602  [[nodiscard]] bool equal(const Dense<Float> &mat,
603  bool compare_cpu_and_device = false) const;
604 
616  [[nodiscard]] bool operator==(const Dense<Float> &mat) const;
617 
629  [[nodiscard]] bool operator!=(const Dense<Float> &mat) const;
630 
640  void reshape(const size_t row, const size_t col);
641 
643 
652  void diag_add(const Float alpha);
653 
662  void diag_sub(const Float alpha);
663 
672  void diag_mul(const Float alpha);
673 
682  void diag_div(const Float alpha);
683 
692  void diag_add(const vector<Float> &vec);
693  void diag_add(const view1D<vector<Float>, Float> &vec);
694  void diag_add(const view1D<matrix::Dense<Float>, Float> &vec);
695  void diag_add(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
696 
705  void diag_sub(const vector<Float> &vec);
706  void diag_sub(const view1D<vector<Float>, Float> &vec);
707  void diag_sub(const view1D<matrix::Dense<Float>, Float> &vec);
708  void diag_sub(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
709 
718  void diag_mul(const vector<Float> &vec);
719  void diag_mul(const view1D<vector<Float>, Float> &vec);
720  void diag_mul(const view1D<matrix::Dense<Float>, Float> &vec);
721  void diag_mul(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
722 
731  void diag_div(const vector<Float> &vec);
732  void diag_div(const view1D<vector<Float>, Float> &vec);
733  void diag_div(const view1D<matrix::Dense<Float>, Float> &vec);
734  void diag_div(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
735 };
738 } // namespace matrix
739 } // 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
std::string type() const
Set # of non-zero elements.
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
size_t val_nnz
# of non-zero element (M * N)
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.
void set_ptr(const size_t M, const size_t N, const Float *value)
Set Dense array from std::vector.
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.
void diag(view1D< tensor::tensor_Dense< Float >, Float > &vec) const
Dense(const COO< Float > &coo)
Create dense matrix from COO matrix.
void reshape(const size_t row, const size_t col)
Reshape 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.
std::shared_ptr< Float > val
Dense format value (pointer)
void diag_mul(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
const Float * data() const
returns a direct pointer to the matrix
size_t get_col() const
get # of col
~Dense()
destructor of Dense matrix, free GPU memory
void diag_mul(const view1D< vector< Float >, Float > &vec)
void transpose()
get transposed matrix (A = A^T)
std::size_t alloc_nnz
alloced matrix size
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_add(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
void diag_div(const view1D< matrix::Dense< Float >, Float > &vec)
bool gpu_status
# of non-zero element (M * 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 resize(size_t N, Float Val=0)
resize matrix value
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_div(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
void diag_sub(const Float alpha)
Scalar and diag. vector of Dense format matrix sub.
Float & operator[](size_t i)
reference to the element at position (v[i])
void diag_div(const vector< Float > &vec)
Vector and diag. vector of Dense format matrix div.
void move(const tensor::tensor_Dense< Float > &tensor_dense)
void col(const size_t c, vector< Float > &vec) const
get column vector
bool val_create_flag
matrix create flag;
Float * data()
returns a direct pointer to the matrix
void col(const size_t c, view1D< tensor::tensor_Dense< Float >, Float > &vec) const
void diag_sub(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
void operator=(const Dense< Float > &mat)
matrix copy
void row(const size_t r, view1D< tensor::tensor_Dense< Float >, Float > &vec) const
void set_col(const size_t M)
Set column number.
void move(const tensor::tensor_Dense< Float > &tensor_dense, int rowN, int colN)
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)
set 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