monolish  0.15.1
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_view1D.hpp
Go to the documentation of this file.
1 #pragma once
2 #include "./monolish_logger.hpp"
3 #include <cassert>
4 #include <exception>
5 #include <fstream>
6 #include <iostream>
7 #include <iterator>
8 #include <memory>
9 #include <omp.h>
10 #include <stdexcept>
11 #include <string>
12 #include <vector>
13 
14 #if USE_SXAT
15 #undef _HAS_CPP17
16 #endif
17 #include <random>
18 #if USE_SXAT
19 #define _HAS_CPP17 1
20 #endif
21 
22 #if defined USE_MPI
23 #include <mpi.h>
24 #endif
25 
26 namespace monolish {
27 template <typename Float> class vector;
28 
29 namespace matrix {
30 template <typename Float> class Dense;
31 template <typename Float> class CRS;
32 template <typename Float> class LinearOperator;
33 } // namespace matrix
34 
41 template <typename TYPE, typename Float> class view1D {
42 private:
43  TYPE &target;
44  Float *target_data;
45  size_t first;
46  size_t last;
47  size_t range;
48 
49 public:
60  view1D(vector<Float> &x, const size_t start, const size_t end) : target(x) {
61  first = start;
62  last = end;
63  range = last - first;
64  target_data = x.data();
65  }
66 
77  view1D(matrix::Dense<Float> &A, const size_t start, const size_t end)
78  : target(A) {
79  first = start;
80  last = end;
81  range = last - first;
82  target_data = A.val.data();
83  }
84 
95  view1D(view1D<vector<Float>, Float> &x, const size_t start, const size_t end)
96  : target(x) {
97  first = x.get_first() + start;
98  last = x.get_last() + end;
99  range = last - first;
100  target_data = x.data();
101  }
102 
113  view1D(view1D<matrix::Dense<Float>, Float> &x, const size_t start,
114  const size_t end)
115  : target(x) {
116  first = x.get_first() + start;
117  last = x.get_last() + end;
118  range = last - first;
119  target_data = x.data();
120  }
121 
128  [[nodiscard]] size_t size() const { return range; }
129 
136  [[nodiscard]] size_t get_nnz() const { return range; }
137 
144  [[nodiscard]] size_t get_first() const { return first; }
145 
152  [[nodiscard]] size_t get_last() const { return last; }
153 
160  [[nodiscard]] size_t get_offset() const { return first; }
161 
167  void set_first(size_t i) { first = i; }
168 
174  void set_last(size_t i) {
175  assert(first + i <= target.get_nnz());
176  last = i;
177  }
178 
187  [[nodiscard]] size_t get_device_mem_stat() const {
188  return target.get_device_mem_stat();
189  }
190 
198  [[nodiscard]] Float *data() const { return target_data; }
199 
206  [[nodiscard]] Float *data() { return target_data; }
207 
214  [[nodiscard]] Float *begin() const { return target_data + get_offset(); }
215 
222  [[nodiscard]] Float *begin() { return target_data + get_offset(); }
223 
230  [[nodiscard]] Float *end() const { return target_data + range; }
231 
238  [[nodiscard]] Float *end() { return target_data + range; }
239 
248  void print_all(bool force_cpu = false) const;
249 
260  void resize(size_t N) {
261  assert(first + N <= target.get_nnz());
262  last = first + N;
263  }
264 
274  [[nodiscard]] Float &operator[](const size_t i) {
275  if (target.get_device_mem_stat()) {
276  throw std::runtime_error("Error, GPU vector cant use operator[]");
277  }
278  return target_data[i + first];
279  }
280 
289  void fill(Float value);
290 };
291 
292 } // namespace monolish
monolish::view1D::size
size_t size() const
get view1D size (end-start)
Definition: monolish_view1D.hpp:128
monolish::view1D::view1D
view1D(matrix::Dense< Float > &A, const size_t start, const size_t end)
create view1D(start:end) from Dense matrix
Definition: monolish_view1D.hpp:77
monolish::view1D::end
Float * end() const
returns a end iterator
Definition: monolish_view1D.hpp:230
monolish::view1D::first
size_t first
Definition: monolish_view1D.hpp:45
monolish::view1D::target
TYPE & target
Definition: monolish_view1D.hpp:43
monolish::view1D::get_device_mem_stat
size_t get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_view1D.hpp:187
monolish::matrix::Dense::val
std::vector< Float > val
Dense format value(size M x N)
Definition: monolish_dense.hpp:40
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:28
monolish::view1D::view1D
view1D(view1D< vector< Float >, Float > &x, const size_t start, const size_t end)
create view1D(start:end) from monolish::vector
Definition: monolish_view1D.hpp:95
monolish::vector::data
const Float * data() const
returns a direct pointer to the vector
Definition: monolish_vector.hpp:229
monolish::view1D::last
size_t last
Definition: monolish_view1D.hpp:46
monolish::view1D::resize
void resize(size_t N)
change last postion
Definition: monolish_view1D.hpp:260
monolish::view1D::get_first
size_t get_first() const
get first position
Definition: monolish_view1D.hpp:144
monolish::view1D::get_offset
size_t get_offset() const
get first position (same as get_first())
Definition: monolish_view1D.hpp:160
monolish::view1D::data
Float * data() const
returns a direct pointer to the original vector (dont include offset)
Definition: monolish_view1D.hpp:198
monolish
Definition: monolish_matrix_blas.hpp:10
monolish_logger.hpp
monolish::view1D::set_first
void set_first(size_t i)
change first position
Definition: monolish_view1D.hpp:167
monolish::view1D::view1D
view1D(view1D< matrix::Dense< Float >, Float > &x, const size_t start, const size_t end)
create view1D(start:end) from monolish::matrix::Dense
Definition: monolish_view1D.hpp:113
monolish::view1D::begin
Float * begin() const
returns begin iterator (include offset)
Definition: monolish_view1D.hpp:214
monolish::view1D::view1D
view1D(vector< Float > &x, const size_t start, const size_t end)
create view1D(start:end) from vector
Definition: monolish_view1D.hpp:60
monolish::view1D::print_all
void print_all(bool force_cpu=false) const
print all elements to standart I/O
monolish::view1D::get_last
size_t get_last() const
get end position
Definition: monolish_view1D.hpp:152
monolish::view1D
1D view class
Definition: monolish_coo.hpp:26
monolish::view1D::get_nnz
size_t get_nnz() const
get view1D size (same as size())
Definition: monolish_view1D.hpp:136
monolish::view1D::range
size_t range
Definition: monolish_view1D.hpp:47
monolish::view1D::target_data
Float * target_data
Definition: monolish_view1D.hpp:44
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::view1D::fill
void fill(Float value)
fill vector elements with a scalar value
monolish::view1D::data
Float * data()
returns a direct pointer to the vector (dont include offset)
Definition: monolish_view1D.hpp:206
monolish::view1D::set_last
void set_last(size_t i)
change last position
Definition: monolish_view1D.hpp:174
monolish::view1D::begin
Float * begin()
returns begin iterator (include offset)
Definition: monolish_view1D.hpp:222
monolish::view1D::operator[]
Float & operator[](const size_t i)
reference to the element at position
Definition: monolish_view1D.hpp:274
monolish::view1D::end
Float * end()
returns a end iterator
Definition: monolish_view1D.hpp:238