18
18
#include " core/distributed/helpers.hpp"
19
19
#include " core/solver/pipe_cg_kernels.hpp"
20
20
#include " core/solver/solver_boilerplate.hpp"
21
+ #include " ginkgo/core/base/range.hpp"
21
22
22
23
23
24
namespace gko {
@@ -112,32 +113,25 @@ void PipeCg<ValueType>::apply_dense_impl(const VectorType* dense_b,
112
113
113
114
LocalVector* rw = this ->template create_workspace_op <LocalVector>(
114
115
GKO_SOLVER_TRAITS::rw, conjoined_size);
115
- auto r_unique = LocalVector::create (
116
- exec, original_size,
117
- make_array_view (exec, original_size[0 ] * b_stride * 2 ,
118
- rw->get_values ()),
119
- b_stride * 2 );
116
+ auto r_unique =
117
+ rw->create_submatrix (local_span{0 , original_size[0 ]},
118
+ local_span{0 , original_size[1 ]}, original_size);
120
119
auto * r = r_unique.get ();
121
- auto w_unique = LocalVector::create (
122
- exec, original_size,
123
- make_array_view (exec, original_size[0 ] * b_stride * 2 ,
124
- rw->get_values () + b_stride),
125
- b_stride * 2 );
120
+ auto w_unique = rw->create_submatrix (
121
+ local_span{0 , original_size[0 ]},
122
+ local_span{b_stride, b_stride + original_size[1 ]}, original_size);
126
123
auto * w = w_unique.get ();
127
124
128
125
// z now consists of two identical repeating parts: z1 and z2, again, for
129
126
// the same reason
130
127
GKO_SOLVER_VECTOR (z, rw);
131
- auto z1_unique = LocalVector::create (
132
- exec, original_size,
133
- make_array_view (exec, original_size[0 ] * b_stride * 2 , z->get_values ()),
134
- b_stride * 2 );
128
+ auto z1_unique =
129
+ z->create_submatrix (local_span{0 , original_size[0 ]},
130
+ local_span{0 , original_size[1 ]}, original_size);
135
131
auto * z1 = z1_unique.get ();
136
- auto z2_unique = LocalVector::create (
137
- exec, original_size,
138
- make_array_view (exec, original_size[0 ] * b_stride * 2 ,
139
- z->get_values () + b_stride),
140
- b_stride * 2 );
132
+ auto z2_unique = z->create_submatrix (
133
+ local_span{0 , original_size[0 ]},
134
+ local_span{b_stride, b_stride + original_size[1 ]}, original_size);
141
135
auto * z2 = z2_unique.get ();
142
136
143
137
GKO_SOLVER_VECTOR (p, dense_b);
@@ -149,15 +143,13 @@ void PipeCg<ValueType>::apply_dense_impl(const VectorType* dense_b,
149
143
150
144
// rho and delta become combined as well
151
145
GKO_SOLVER_SCALAR (rhodelta, rw);
152
- auto rho_unique = LocalVector::create (
153
- exec, dim< 2 >{ 1 , original_size[1 ]},
154
- make_array_view (exec, b_stride, rhodelta-> get_values ()), b_stride * 2 );
146
+ auto rho_unique = rhodelta-> create_submatrix (
147
+ local_span{ 0 , 1 }, local_span{ 0 , original_size[1 ]},
148
+ dim< 2 >{ 1 , original_size[ 1 ]} );
155
149
auto * rho = rho_unique.get ();
156
-
157
- auto delta_unique = LocalVector::create (
158
- exec, dim<2 >{1 , original_size[1 ]},
159
- make_array_view (exec, b_stride, rhodelta->get_values () + b_stride),
160
- b_stride * 2 );
150
+ auto delta_unique = rhodelta->create_submatrix (
151
+ local_span{0 , 1 }, local_span{b_stride, b_stride + original_size[1 ]},
152
+ dim<2 >{1 , original_size[1 ]});
161
153
auto * delta = delta_unique.get ();
162
154
163
155
GKO_SOLVER_SCALAR (beta, dense_b);
0 commit comments