monolish  0.14.2
MONOlithic LIner equation Solvers for Highly-parallel architecture
vector_constructor.cpp
Go to the documentation of this file.
1 #include "../../include/monolish_blas.hpp"
2 #include "../../include/monolish_vml.hpp"
3 #include "../internal/monolish_internal.hpp"
4 
5 namespace monolish {
6 
8 template <typename T> vector<T>::vector(const size_t N) {
9  Logger &logger = Logger::get_instance();
10  logger.util_in(monolish_func);
11  resize(N);
12  logger.util_out();
13 }
14 template vector<double>::vector(const size_t N);
15 template vector<float>::vector(const size_t N);
16 
17 template <typename T> vector<T>::vector(const size_t N, const T value) {
18  Logger &logger = Logger::get_instance();
19  logger.util_in(monolish_func);
20  resize(N);
21 
22 #pragma omp parallel for
23  for (size_t i = 0; i < val.size(); i++) {
24  val[i] = value;
25  }
26 
27  logger.util_out();
28 }
29 template vector<double>::vector(const size_t N, const double value);
30 template vector<float>::vector(const size_t N, const float value);
31 
32 template <typename T>
33 void util::random_vector(vector<T> &vec, const T min, const T max) {
34  Logger &logger = Logger::get_instance();
35  logger.util_in(monolish_func);
36 
37 #pragma omp parallel
38  {
39  std::random_device random;
40  std::mt19937 mt(random());
41  std::uniform_real_distribution<> rand(min, max);
42 
43 #pragma omp for
44  for (size_t i = 0; i < vec.size(); i++) {
45  vec[i] = rand(mt);
46  }
47  }
48  logger.util_out();
49 }
50 template void util::random_vector(vector<double> &vec, const double min,
51  const double max);
52 template void util::random_vector(vector<float> &vec, const float min,
53  const float max);
54 
55 template <typename T> vector<T>::vector(const T *start, const T *end) {
56  Logger &logger = Logger::get_instance();
57  logger.util_in(monolish_func);
58  size_t size = (end - start);
59  resize(size);
60  std::copy(start, end, val.begin());
61  logger.util_out();
62 }
63 template vector<double>::vector(const double *start, const double *end);
64 template vector<float>::vector(const float *start, const float *end);
65 
66 template <typename T>
67 vector<T>::vector(const size_t N, const T min, const T max) {
68  Logger &logger = Logger::get_instance();
69  logger.util_in(monolish_func);
70  resize(N);
71 #pragma omp parallel
72  {
73  std::random_device random;
74  std::mt19937 mt(random());
75  std::uniform_real_distribution<> rand(min, max);
76 
77 #pragma omp for
78  for (size_t i = 0; i < val.size(); i++) {
79  val[i] = rand(mt);
80  }
81  }
82  logger.util_out();
83 }
84 template vector<double>::vector(const size_t N, const double min,
85  const double max);
86 template vector<float>::vector(const size_t N, const float min,
87  const float max);
88 
89 // copy constructor
90 template <typename T> vector<T>::vector(const std::vector<T> &vec) {
91  Logger &logger = Logger::get_instance();
92  logger.util_in(monolish_func);
93  resize(vec.size());
94  std::copy(vec.begin(), vec.end(), val.begin());
95  logger.util_out();
96 }
97 
98 template vector<double>::vector(const std::vector<double> &vec);
99 template vector<float>::vector(const std::vector<float> &vec);
100 
101 // copy constructor
102 template <typename T> vector<T>::vector(const std::initializer_list<T> &list) {
103  Logger &logger = Logger::get_instance();
104  logger.util_in(monolish_func);
105  resize(list.size());
106  std::copy(list.begin(), list.end(), val.begin());
107  logger.util_out();
108 }
109 
110 template vector<double>::vector(const std::initializer_list<double> &list);
111 template vector<float>::vector(const std::initializer_list<float> &list);
112 
113 template <typename T> vector<T>::vector(const monolish::vector<T> &vec) {
114  Logger &logger = Logger::get_instance();
115  logger.util_in(monolish_func);
116 
117  resize(vec.size());
118 
119  // gpu copy and recv
120 #if MONOLISH_USE_NVIDIA_GPU
121  if (vec.get_device_mem_stat()) {
122  send();
123  internal::vcopy(vec.val.size(), vec.val.data(), val.data(), true);
124  }
125 #endif
126  internal::vcopy(vec.val.size(), vec.val.data(), val.data(), false);
127 
128  logger.util_out();
129 }
130 
131 template vector<double>::vector(const vector<double> &vec);
132 template vector<float>::vector(const vector<float> &vec);
133 
134 template <typename T>
136  Logger &logger = Logger::get_instance();
137  logger.util_in(monolish_func);
138 
139  resize(vec.size());
140 
141  // gpu copy and recv
142 #if MONOLISH_USE_NVIDIA_GPU
143  if (vec.get_device_mem_stat()) {
144  send();
145  internal::vcopy(vec.size(), vec.data() + vec.get_offset(), val.data(),
146  true);
147  }
148 #endif
149  internal::vcopy(vec.size(), vec.data() + vec.get_offset(), val.data(), false);
150 
151  logger.util_out();
152 }
153 
154 template vector<double>::vector(const view1D<vector<double>, double> &vec);
155 template vector<float>::vector(const view1D<vector<float>, float> &vec);
156 
157 template <typename T>
159  Logger &logger = Logger::get_instance();
160  logger.util_in(monolish_func);
161 
162  resize(vec.size());
163 
164  // gpu copy and recv
165 #if MONOLISH_USE_NVIDIA_GPU
166  if (vec.get_device_mem_stat()) {
167  send();
168  internal::vcopy(vec.size(), vec.data() + vec.get_offset(), val.data(),
169  true);
170  }
171 #endif
172  internal::vcopy(vec.size(), vec.data() + vec.get_offset(), val.data(), false);
173 
174  logger.util_out();
175 }
176 
177 template vector<double>::vector(
178  const view1D<matrix::Dense<double>, double> &vec);
179 template vector<float>::vector(const view1D<matrix::Dense<float>, float> &vec);
180 
181 } // namespace monolish
monolish::vector::vector
vector()
Definition: monolish_vector.hpp:55
monolish_func
#define monolish_func
Definition: monolish_logger.hpp:9
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],...
Definition: matrix_vml.cpp:390
monolish::vector::val
std::vector< Float > val
size N vector data
Definition: monolish_vector.hpp:47
monolish::Logger
logger class (singleton, for developper class)
Definition: monolish_logger.hpp:19
monolish::vector::get_offset
size_t get_offset() const
Definition: monolish_vector.hpp:225
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],...
Definition: matrix_vml.cpp:382
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:35
monolish::vector::size
auto size() const
get vector size
Definition: monolish_vector.hpp:312
monolish::Logger::util_out
void util_out()
Definition: logger_utils.cpp:123
monolish::vector::data
const Float * data() const
returns a direct pointer to the vector
Definition: monolish_vector.hpp:236
monolish::Logger::util_in
void util_in(const std::string func_name)
Definition: logger_utils.cpp:113
monolish::blas::copy
void copy(const matrix::Dense< double > &A, matrix::Dense< double > &C)
Dense matrix copy (C=A)
Definition: dense_copy.cpp:25
monolish
Definition: monolish_matrix_blas.hpp:10
monolish::vector::get_device_mem_stat
bool get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_vector.hpp:210
monolish::view1D
1D view class
Definition: monolish_coo.hpp:33
monolish::util::random_vector
void random_vector(vector< T > &vec, const T min, const T max)
create random vector
Definition: vector_constructor.cpp:33
monolish::vector
vector class
Definition: monolish_coo.hpp:32
monolish::util::send
auto send(T &x)
send data to GPU
Definition: monolish_common.hpp:642
monolish::Logger::get_instance
static Logger & get_instance()
Definition: monolish_logger.hpp:42