monolish  0.14.2
MONOlithic LIner equation Solvers for Highly-parallel architecture
dense_diag_vector_add.cpp
Go to the documentation of this file.
1 #include "../../../../include/monolish_blas.hpp"
2 #include "../../../internal/monolish_internal.hpp"
3 
4 namespace monolish::matrix {
5 
6 // add vector
7 
8 template <typename T> void Dense<T>::diag_add(const vector<T> &vec) {
9  Logger &logger = Logger::get_instance();
10  logger.func_in(monolish_func);
11 
12  const T *vecd = vec.data();
13 
14  T *vald = val.data();
15  const size_t N = get_col();
16  const size_t Len = get_row() > get_col() ? get_row() : get_col();
17 
18  assert(Len == vec.size());
19 
20  if (gpu_status == true) {
21 #if MONOLISH_USE_NVIDIA_GPU // gpu
22 #pragma omp target teams distribute parallel for
23  for (size_t i = 0; i < Len; i++) {
24  vald[N * i + i] += vecd[i];
25  }
26 #else
27  throw std::runtime_error("error USE_GPU is false, but gpu_status == true");
28 #endif
29  } else {
30 #pragma omp parallel for
31  for (size_t i = 0; i < Len; i++) {
32  vald[N * i + i] += vecd[i];
33  }
34  }
35 
36  logger.func_out();
37 }
38 template void
39 monolish::matrix::Dense<double>::diag_add(const vector<double> &vec);
40 template void
41 monolish::matrix::Dense<float>::diag_add(const vector<float> &vec);
42 
43 template <typename T> void Dense<T>::diag_add(const view1D<vector<T>, T> &vec) {
44  Logger &logger = Logger::get_instance();
45  logger.func_in(monolish_func);
46 
47  const T *vecd = vec.data();
48 
49  T *vald = val.data();
50  const size_t N = get_col();
51  const size_t Len = get_row() > get_col() ? get_row() : get_col();
52 
53  assert(Len == vec.size());
54 
55  if (gpu_status == true) {
56 #if MONOLISH_USE_NVIDIA_GPU // gpu
57 #pragma omp target teams distribute parallel for
58  for (size_t i = 0; i < Len; i++) {
59  vald[N * i + i] += vecd[i];
60  }
61 #else
62  throw std::runtime_error("error USE_GPU is false, but gpu_status == true");
63 #endif
64  } else {
65 #pragma omp parallel for
66  for (size_t i = 0; i < Len; i++) {
67  vald[N * i + i] += vecd[i];
68  }
69  }
70 
71  logger.func_out();
72 }
74  const view1D<vector<double>, double> &vec);
76  const view1D<vector<float>, float> &vec);
77 
78 template <typename T>
79 void Dense<T>::diag_add(const view1D<matrix::Dense<T>, T> &vec) {
80  Logger &logger = Logger::get_instance();
81  logger.func_in(monolish_func);
82 
83  const T *vecd = vec.data();
84 
85  T *vald = val.data();
86  const size_t N = get_col();
87  const size_t Len = get_row() > get_col() ? get_row() : get_col();
88 
89  assert(Len == vec.size());
90 
91  if (gpu_status == true) {
92 #if MONOLISH_USE_NVIDIA_GPU // gpu
93 #pragma omp target teams distribute parallel for
94  for (size_t i = 0; i < Len; i++) {
95  vald[N * i + i] += vecd[i];
96  }
97 #else
98  throw std::runtime_error("error USE_GPU is false, but gpu_status == true");
99 #endif
100  } else {
101 #pragma omp parallel for
102  for (size_t i = 0; i < Len; i++) {
103  vald[N * i + i] += vecd[i];
104  }
105  }
106 
107  logger.func_out();
108 }
110  const view1D<matrix::Dense<double>, double> &vec);
112  const view1D<matrix::Dense<float>, float> &vec);
113 } // namespace monolish::matrix
monolish::matrix
Declare sparse and dense matrix class.
Definition: monolish_coo.hpp:34
monolish_func
#define monolish_func
Definition: monolish_logger.hpp:9
monolish::matrix::Dense::diag_add
void diag_add(const Float alpha)
Scalar and diag. vector of dense matrix add.
monolish::Logger::get_instance
static Logger & get_instance()
Definition: monolish_logger.hpp:42