monolish  0.15.1
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_vector.hpp
Go to the documentation of this file.
1 #pragma once
2 #include "./monolish_dense.hpp"
3 #include "./monolish_logger.hpp"
4 #include "./monolish_view1D.hpp"
5 #include <exception>
6 #include <fstream>
7 #include <iostream>
8 #include <iterator>
9 #include <memory>
10 #include <omp.h>
11 #include <stdexcept>
12 #include <string>
13 #include <vector>
14 
15 #if USE_SXAT
16 #undef _HAS_CPP17
17 #endif
18 #include <random>
19 #if USE_SXAT
20 #define _HAS_CPP17 1
21 #endif
22 
23 #if defined USE_MPI
24 #include <mpi.h>
25 #endif
26 
27 namespace monolish {
28 
35 template <typename Float> class vector {
36 private:
40  std::vector<Float> val;
41 
45  mutable bool gpu_status = false;
46 
47 public:
48  vector() {}
49 
50  // constructor ///////////////////////////////////////////////////////
59  vector(const size_t N);
60 
70  vector(const size_t N, const Float value);
71 
80  vector(const std::vector<Float> &vec);
81 
90  vector(const std::initializer_list<Float> &list);
91 
104  vector(const vector<Float> &vec);
105 
118  vector(const view1D<vector<Float>, Float> &vec);
119 
132  vector(const view1D<matrix::Dense<Float>, Float> &vec);
133 
143  vector(const Float *start, const Float *end);
144 
155  vector(const size_t N, const Float min, const Float max);
156 
157  // communication
158  // ///////////////////////////////////////////////////////////////////////////
166  void send() const;
167 
175  void recv();
176 
184  void nonfree_recv();
185 
193  void device_free() const;
194 
203  [[nodiscard]] bool get_device_mem_stat() const { return gpu_status; }
204 
213  if (get_device_mem_stat()) {
214  device_free();
215  }
216  }
217 
218  [[nodiscard]] size_t get_offset() const { return 0; }
219 
220  // util
221  // ///////////////////////////////////////////////////////////////////////////
222 
229  [[nodiscard]] const Float *data() const { return val.data(); }
230 
237  [[nodiscard]] Float *data() { return val.data(); }
238 
247  void resize(size_t N) {
248  if (get_device_mem_stat()) {
249  throw std::runtime_error("Error, GPU vector cant use resize");
250  }
251  val.resize(N);
252  }
253 
260  void push_back(Float val) {
261  if (get_device_mem_stat()) {
262  throw std::runtime_error("Error, GPU vector cant use push_back");
263  }
264  val.push_back(val);
265  }
266 
273  [[nodiscard]] const Float *begin() const { return val.data(); }
274 
281  [[nodiscard]] Float *begin() { return val.data(); }
282 
289  [[nodiscard]] const Float *end() const { return val.data() + size(); }
290 
297  [[nodiscard]] Float *end() { return val.data() + size(); }
298 
305  [[nodiscard]] auto size() const { return val.size(); }
306 
313  [[nodiscard]] auto get_nnz() const { return val.size(); }
314 
323  void fill(Float value);
324 
333  void print_all(bool force_cpu = false) const;
334 
343  void print_all(std::string filename) const;
344 
345  // operator
346  // ///////////////////////////////////////////////////////////////////////////
347 
360  void operator=(const vector<Float> &vec);
361 
374  void operator=(const view1D<vector<Float>, Float> &vec);
375 
388  void operator=(const view1D<matrix::Dense<Float>, Float> &vec);
389 
399  void operator=(const std::vector<Float> &vec);
400 
409  [[nodiscard]] vector<Float> operator-();
410 
420  [[nodiscard]] Float &operator[](size_t i) {
421  if (get_device_mem_stat()) {
422  throw std::runtime_error("Error, GPU vector cant use operator[]");
423  }
424  return val[i];
425  }
426 
437  bool equal(const vector<Float> &vec,
438  bool compare_cpu_and_device = false) const;
439 
450  bool equal(const view1D<vector<Float>, Float> &vec,
451  bool compare_cpu_and_device = false) const;
452 
463  bool equal(const view1D<matrix::Dense<Float>, Float> &vec,
464  bool compare_cpu_and_device = false) const;
465 
477  bool operator==(const vector<Float> &vec) const;
478 
490  bool operator==(const view1D<vector<Float>, Float> &vec) const;
491 
503  bool operator==(const view1D<matrix::Dense<Float>, Float> &vec) const;
504 
516  bool operator!=(const vector<Float> &vec) const;
517 
529  bool operator!=(const view1D<vector<Float>, Float> &vec) const;
530 
542  bool operator!=(const view1D<matrix::Dense<Float>, Float> &vec) const;
543 };
544 } // namespace monolish
monolish::vector::vector
vector()
Definition: monolish_vector.hpp:48
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::vector::val
std::vector< Float > val
size N vector data
Definition: monolish_vector.hpp:40
monolish::vector::print_all
void print_all(bool force_cpu=false) const
print all elements to standart I/O
monolish::vector::data
Float * data()
returns a direct pointer to the vector
Definition: monolish_vector.hpp:237
monolish::vector::get_offset
size_t get_offset() const
Definition: monolish_vector.hpp:218
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::vector::end
const Float * end() const
returns a end iterator
Definition: monolish_vector.hpp:289
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:28
monolish::vector::size
auto size() const
get vector size
Definition: monolish_vector.hpp:305
monolish::vector::get_nnz
auto get_nnz() const
get vector size
Definition: monolish_vector.hpp:313
monolish::vector::end
Float * end()
returns a end iterator
Definition: monolish_vector.hpp:297
monolish::vector::nonfree_recv
void nonfree_recv()
recv data from GPU (w/o free)
monolish::vector::data
const Float * data() const
returns a direct pointer to the vector
Definition: monolish_vector.hpp:229
monolish_view1D.hpp
monolish::vector::operator=
void operator=(const vector< Float > &vec)
copy vector, It is same as copy ( Copy the memory on CPU and GPU )
monolish::vector::recv
void recv()
recv data from GPU, and free data on GPU
monolish::vector::operator[]
Float & operator[](size_t i)
reference to the element at position (v[i])
Definition: monolish_vector.hpp:420
monolish::vector::push_back
void push_back(Float val)
Add a new element at the end of the vector (only CPU)
Definition: monolish_vector.hpp:260
monolish::vector::send
void send() const
send data to GPU
monolish::vector::operator-
vector< Float > operator-()
Sign inversion.
monolish::vector::~vector
~vector()
destructor of vector, free GPU memory
Definition: monolish_vector.hpp:212
monolish
Definition: monolish_matrix_blas.hpp:10
monolish_logger.hpp
monolish::vector::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_vector.hpp:203
monolish::vector::fill
void fill(Float value)
fill vector elements with a scalar value
monolish_dense.hpp
monolish::vector::begin
const Float * begin() const
returns a begin iterator
Definition: monolish_vector.hpp:273
monolish::vector::operator!=
bool operator!=(const vector< Float > &vec) const
Comparing vectors (v != vec)
monolish::view1D
1D view class
Definition: monolish_coo.hpp:26
monolish::vector::begin
Float * begin()
returns a begin iterator
Definition: monolish_vector.hpp:281
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::vector::operator==
bool operator==(const vector< Float > &vec) const
Comparing vectors (v == vec)
monolish::vector::equal
bool equal(const vector< Float > &vec, bool compare_cpu_and_device=false) const
Comparing matricies (A == mat)
monolish::vector::device_free
void device_free() const
free data on GPU
monolish::vector::resize
void resize(size_t N)
resize vector (only CPU)
Definition: monolish_vector.hpp:247
monolish::vector::gpu_status
bool gpu_status
true: sended, false: not send
Definition: monolish_vector.hpp:45