monolish  0.17.1
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_crs.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <exception>
3 #include <memory>
4 #include <omp.h>
5 #include <stdexcept>
6 #include <string>
7 #include <vector>
8 
9 #if USE_SXAT
10 #undef _HAS_CPP17
11 #endif
12 #include <random>
13 #if USE_SXAT
14 #define _HAS_CPP17 1
15 #endif
16 
17 namespace monolish {
18 template <typename Float> class vector;
19 template <typename TYPE, typename Float> class view1D;
20 namespace tensor {
21 template <typename Float> class tensor_Dense;
22 template <typename Float> class tensor_COO;
23 } // namespace tensor
24 namespace matrix {
25 template <typename Float> class Dense;
26 template <typename Float> class COO;
27 
39 template <typename Float> class CRS {
40 private:
44  size_t rowN;
45 
49  size_t colN;
50 
54  // size_t nnz;
55 
59  mutable bool gpu_status = false;
60 
65 
66 public:
71  std::shared_ptr<Float> val;
72 
76  size_t val_nnz = 0;
77 
81  std::size_t alloc_nnz = 0;
82 
86  bool val_create_flag = false;
87 
92  std::vector<int> col_ind;
93 
98  std::vector<int> row_ptr;
99 
100  CRS() { val_create_flag = true; }
101 
112  CRS(const size_t M, const size_t N, const size_t NNZ);
113 
129  CRS(const size_t M, const size_t N, const size_t NNZ, const int *rowptr,
130  const int *colind, const Float *value);
131 
149  CRS(const size_t M, const size_t N, const size_t NNZ, const int *rowptr,
150  const int *colind, const Float *value, const size_t origin);
151 
166  CRS(const size_t M, const size_t N, const std::vector<int> &rowptr,
167  const std::vector<int> &colind, const std::vector<Float> &value);
168 
183  CRS(const size_t M, const size_t N, const std::vector<int> &rowptr,
184  const std::vector<int> &colind, const vector<Float> &value);
185 
193  void convert(COO<Float> &coo);
194 
202  void convert(CRS<Float> &crs);
203 
212  CRS(COO<Float> &coo) {
213  val_create_flag = true;
214  convert(coo);
215  }
216 
229  CRS(const CRS<Float> &mat);
230 
244  CRS(const CRS<Float> &mat, Float value);
245 
260  void set_ptr(const size_t M, const size_t N, const std::vector<int> &rowptr,
261  const std::vector<int> &colind, const std::vector<Float> &value);
262 
277  void set_ptr(const size_t M, const size_t N, const std::vector<int> &rowptr,
278  const std::vector<int> &colind, const size_t vsize,
279  const Float *value);
280 
289  void print_all(bool force_cpu = false) const;
290 
298  [[nodiscard]] size_t get_row() const { return rowN; }
299 
307  [[nodiscard]] size_t get_col() const { return colN; }
308 
316  [[nodiscard]] size_t get_nnz() const { return val_nnz; }
317 
325  [[nodiscard]] std::string type() const { return "CRS"; }
326 
334  void compute_hash();
335 
341  [[nodiscard]] size_t get_hash() const { return structure_hash; }
342 
343  // communication
344  // ///////////////////////////////////////////////////////////////////////////
352  void send() const;
353 
361  void recv();
362 
370  void nonfree_recv();
371 
379  void device_free() const;
380 
385  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; }
386 
394  ~CRS() {
395  if (val_create_flag) {
396  if (get_device_mem_stat()) {
397  device_free();
398  }
399  }
400  }
401 
408  [[nodiscard]] const Float *data() const { return val.get(); }
409 
416  [[nodiscard]] Float *data() { return val.get(); }
417 
426  void resize(size_t N, Float Val = 0) {
427  if (get_device_mem_stat()) {
428  throw std::runtime_error("Error, GPU matrix cant use resize");
429  }
430  if (val_create_flag) {
431  std::shared_ptr<Float> tmp(new Float[N], std::default_delete<Float[]>());
432  size_t copy_size = std::min(val_nnz, N);
433  for (size_t i = 0; i < copy_size; ++i) {
434  tmp.get()[i] = data()[i];
435  }
436  for (size_t i = copy_size; i < N; ++i) {
437  tmp.get()[i] = Val;
438  }
439  val = tmp;
440  alloc_nnz = N;
441  val_nnz = N;
442  } else {
443  throw std::runtime_error("Error, not create vector cant use resize");
444  }
445  }
446 
448 
456  void diag(vector<Float> &vec) const;
457  void diag(view1D<vector<Float>, Float> &vec) const;
458  void diag(view1D<matrix::Dense<Float>, Float> &vec) const;
459  void diag(view1D<tensor::tensor_Dense<Float>, Float> &vec) const;
460 
470  void row(const size_t r, vector<Float> &vec) const;
471  void row(const size_t r, view1D<vector<Float>, Float> &vec) const;
472  void row(const size_t r, view1D<matrix::Dense<Float>, Float> &vec) const;
473  void row(const size_t r,
474  view1D<tensor::tensor_Dense<Float>, Float> &vec) const;
475 
485  void col(const size_t c, vector<Float> &vec) const;
486  void col(const size_t c, view1D<vector<Float>, Float> &vec) const;
487  void col(const size_t c, view1D<matrix::Dense<Float>, Float> &vec) const;
488  void col(const size_t c,
489  view1D<tensor::tensor_Dense<Float>, Float> &vec) const;
490 
492 
504  void diag_add(const Float alpha);
505 
518  void diag_sub(const Float alpha);
519 
532  void diag_mul(const Float alpha);
533 
546  void diag_div(const Float alpha);
547 
560  void diag_add(const vector<Float> &vec);
561  void diag_add(const view1D<vector<Float>, Float> &vec);
562  void diag_add(const view1D<matrix::Dense<Float>, Float> &vec);
563  void diag_add(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
564 
577  void diag_sub(const vector<Float> &vec);
578  void diag_sub(const view1D<vector<Float>, Float> &vec);
579  void diag_sub(const view1D<matrix::Dense<Float>, Float> &vec);
580  void diag_sub(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
581 
594  void diag_mul(const vector<Float> &vec);
595  void diag_mul(const view1D<vector<Float>, Float> &vec);
596  void diag_mul(const view1D<matrix::Dense<Float>, Float> &vec);
597  void diag_mul(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
598 
611  void diag_div(const vector<Float> &vec);
612  void diag_div(const view1D<vector<Float>, Float> &vec);
613  void diag_div(const view1D<matrix::Dense<Float>, Float> &vec);
614  void diag_div(const view1D<tensor::tensor_Dense<Float>, Float> &vec);
615 
617 
626  void transpose();
627 
636  void transpose(const CRS &B);
637 
638  /*
639  * @brief Memory data space required by the matrix
640  * @note
641  * - # of computation: 3
642  * - Multi-threading: false
643  * - GPU acceleration: false
644  **/
645  [[nodiscard]] double get_data_size() const {
646  return (get_nnz() * sizeof(Float) + (get_row() + 1) * sizeof(int) +
647  get_nnz() * sizeof(int)) /
648  1.0e+9;
649  }
650 
659  void fill(Float value);
660 
671  void operator=(const CRS<Float> &mat);
672 
682  [[nodiscard]] Float &operator[](size_t i) {
683  if (get_device_mem_stat()) {
684  throw std::runtime_error("Error, GPU vector cant use operator[]");
685  }
686  return data()[i];
687  }
688 
699  [[nodiscard]] bool equal(const CRS<Float> &mat,
700  bool compare_cpu_and_device = false) const;
701 
713  [[nodiscard]] bool operator==(const CRS<Float> &mat) const;
714 
726  [[nodiscard]] bool operator!=(const CRS<Float> &mat) const;
727 };
730 } // namespace matrix
731 } // namespace monolish
Coodinate (COO) format Matrix (need to sort)
Compressed Row Storage (CRS) format Matrix.
bool gpu_status
# of non-zero element
void diag_mul(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
bool equal(const CRS< Float > &mat, bool compare_cpu_and_device=false) const
Comparing matrices (A == mat)
size_t rowN
# of row
CRS(const CRS< Float > &mat)
Create CRS matrix from CRS matrix.
const Float * data() const
returns a direct pointer to the matrix
Float * data()
returns a direct pointer to the matrix
void diag_mul(const Float alpha)
Scalar and diag. vector of CRS format matrix mul.
size_t get_col() const
get # of col
CRS(const size_t M, const size_t N, const size_t NNZ)
declare CRS matrix
void diag(vector< Float > &vec) const
get diag. vector
void diag_mul(const view1D< matrix::Dense< Float >, Float > &vec)
CRS(const size_t M, const size_t N, const size_t NNZ, const int *rowptr, const int *colind, const Float *value, const size_t origin)
Create CRS matrix from array, also compute the hash.
size_t val_nnz
# of non-zero element (M * N)
CRS(COO< Float > &coo)
Create CRS matrix from COO matrix, also compute the hash.
void diag_mul(const vector< Float > &vec)
Vector and diag. vector of CRS format matrix mul.
void set_ptr(const size_t M, const size_t N, const std::vector< int > &rowptr, const std::vector< int > &colind, const size_t vsize, const Float *value)
Set CRS array from std::vector.
double get_data_size() const
void diag_sub(const Float alpha)
Scalar and diag. vector of CRS format matrix sub.
void compute_hash()
compute index array hash (to compare structure)
void diag_sub(const view1D< vector< Float >, Float > &vec)
CRS(const size_t M, const size_t N, const size_t NNZ, const int *rowptr, const int *colind, const Float *value)
Create CRS matrix from array, also compute the hash.
void row(const size_t r, view1D< matrix::Dense< Float >, Float > &vec) const
bool operator!=(const CRS< Float > &mat) const
Comparing matrices (A != mat)
void diag_add(const view1D< vector< Float >, Float > &vec)
void fill(Float value)
fill matrix elements with a scalar value
void row(const size_t r, view1D< tensor::tensor_Dense< Float >, Float > &vec) const
bool val_create_flag
matrix create flag;
size_t get_hash() const
get index array hash (to compare structure)
void diag_add(const view1D< matrix::Dense< Float >, Float > &vec)
bool operator==(const CRS< Float > &mat) const
Comparing matrices (A == mat)
void send() const
send data to GPU
void convert(CRS< Float > &crs)
Convert CRS matrix from COO matrix.
void print_all(bool force_cpu=false) const
print all elements to standard I/O
void resize(size_t N, Float Val=0)
resize matrix value
void col(const size_t c, vector< Float > &vec) const
get column vector
void diag_sub(const vector< Float > &vec)
Vector and diag. vector of CRS format matrix sub.
void operator=(const CRS< Float > &mat)
matrix copy
void transpose(const CRS &B)
create transposed matrix from CRS format matrix (B = A^T)
CRS(const CRS< Float > &mat, Float value)
Create CRS matrix of the same size as input matrix.
std::shared_ptr< Float > val
CRS format value (pointer), which stores values of the non-zero elements.
size_t get_nnz() const
get # of non-zeros
size_t structure_hash
hash, created from row_ptr and col_ind
void col(const size_t c, view1D< vector< Float >, Float > &vec) const
void diag_div(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
void diag(view1D< vector< Float >, Float > &vec) const
void diag(view1D< tensor::tensor_Dense< Float >, Float > &vec) const
void diag(view1D< matrix::Dense< Float >, Float > &vec) const
size_t get_row() const
get # of row
std::vector< int > col_ind
CRS format column index, which stores column numbers of the non-zero elements (size nnz)
void diag_sub(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
~CRS()
destructor of CRS matrix, free GPU memory
std::string type() const
get format name "CRS"
void diag_add(const view1D< tensor::tensor_Dense< Float >, Float > &vec)
void nonfree_recv()
recv. data to GPU (w/o free)
void convert(COO< Float > &coo)
Convert CRS matrix from COO matrix, also compute the hash.
void diag_add(const Float alpha)
Scalar and diag. vector of CRS format matrix add.
void col(const size_t c, view1D< tensor::tensor_Dense< Float >, Float > &vec) const
void transpose()
get transposed matrix (A^T)
void device_free() const
free data on GPU
void row(const size_t r, view1D< vector< Float >, Float > &vec) const
void diag_add(const vector< Float > &vec)
Vector and diag. vector of CRS format matrix add.
void diag_div(const view1D< matrix::Dense< Float >, Float > &vec)
void diag_div(const Float alpha)
Scalar and diag. vector of CRS format matrix div.
void diag_mul(const view1D< vector< Float >, Float > &vec)
void recv()
recv. data to GPU, and free data on GPU
Float & operator[](size_t i)
reference to the element at position (v[i])
void row(const size_t r, vector< Float > &vec) const
get row vector
void diag_div(const vector< Float > &vec)
Vector and diag. vector of CRS format matrix div.
size_t colN
# of col
void set_ptr(const size_t M, const size_t N, const std::vector< int > &rowptr, const std::vector< int > &colind, const std::vector< Float > &value)
Set CRS array from std::vector.
void col(const size_t c, view1D< matrix::Dense< Float >, Float > &vec) const
std::vector< int > row_ptr
CRS format row pointer, which stores the starting points of the rows of the arrays value and col_ind ...
CRS(const size_t M, const size_t N, const std::vector< int > &rowptr, const std::vector< int > &colind, const std::vector< Float > &value)
Create CRS matrix from std::vector, also compute the hash.
std::size_t alloc_nnz
alloced matrix size
bool get_device_mem_stat() const
true: sended, false: not send
void diag_sub(const view1D< matrix::Dense< Float >, Float > &vec)
CRS(const size_t M, const size_t N, const std::vector< int > &rowptr, const std::vector< int > &colind, const vector< Float > &value)
Create CRS matrix from std::vector, also compute the hash.
void diag_div(const view1D< vector< Float >, Float > &vec)
Dense format Matrix.
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