Skip to content

Commit 0c79656

Browse files
committed
Extend and fix Richardson test
1 parent 517fa11 commit 0c79656

1 file changed

Lines changed: 73 additions & 74 deletions

File tree

reference/test/solver/gmres_kernels.cpp

Lines changed: 73 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ TYPED_TEST(Gmres, KernelRestart)
207207
r<value_type>::value);
208208
}
209209

210+
210211
TYPED_TEST(Gmres, KernelRestartRgs)
211212
{
212213
using value_type = typename TestFixture::value_type;
@@ -280,6 +281,7 @@ TYPED_TEST(Gmres, KernelRestartRgs)
280281
r<value_type>::value);
281282
}
282283

284+
283285
TYPED_TEST(Gmres, KernelRichardsonLsq)
284286
{
285287
using T = typename TestFixture::value_type;
@@ -291,32 +293,6 @@ TYPED_TEST(Gmres, KernelRichardsonLsq)
291293
const gko::size_type num_rhs = 1;
292294
const gko::size_type k_rows = 3;
293295
const gko::size_type krylov_dim = 4;
294-
const gko::size_type iter = 2;
295-
auto hessenberg_iter =
296-
Mtx::create(this->exec, gko::dim<2>{iter + 2, num_rhs});
297-
hessenberg_iter->fill(nan);
298-
auto exp_hessenberg_iter =
299-
Mtx::create(this->exec, gko::dim<2>{iter + 2, num_rhs});
300-
for (gko::size_type i = iter + 1; i < iter + 2; ++i) {
301-
for (gko::size_type r = 0; r < num_rhs; ++r) {
302-
// These entries should not be touched!
303-
hessenberg_iter->at(i, r) = 42.;
304-
exp_hessenberg_iter->at(i, r) = 42.;
305-
}
306-
}
307-
auto d_hessenberg_iter =
308-
Mtx::create(this->exec, gko::dim<2>{krylov_dim + 1, num_rhs});
309-
auto exp_d_hessenberg_iter = gko::clone(d_hessenberg_iter);
310-
auto sketched_next_krylov2 =
311-
Mtx::create(this->exec, gko::dim<2>{k_rows, num_rhs});
312-
auto exp_sketched_next_krylov2 = gko::clone(sketched_next_krylov2);
313-
sketched_next_krylov2->fill(nan);
314-
d_hessenberg_iter->fill(nan);
315-
for (gko::size_type i = k_rows; i < krylov_dim + 1; ++i) {
316-
// These entries should not be touched by kernel
317-
d_hessenberg_iter->at(i, 0) = 13;
318-
exp_d_hessenberg_iter->at(i, 0) = 13;
319-
}
320296
// size of sketched_krylov_bases: gko::dim<2>{k_rows * (krylov_dim + 1),
321297
// num_rhs}
322298
auto sketched_krylov_bases = gko::initialize<Mtx>(
@@ -326,7 +302,7 @@ TYPED_TEST(Gmres, KernelRichardsonLsq)
326302
.5, -.5, 2., 1.5, -1.,
327303
}, this->exec);
328304
// clang-format on
329-
// Normalize vectors
305+
// Normalize all vectors
330306
for (gko::size_type i = 0; i < krylov_dim + 1; ++i) {
331307
gko::remove_complex<T> norm{0};
332308
for (gko::size_type k = 0; k < k_rows; ++k) {
@@ -338,57 +314,76 @@ TYPED_TEST(Gmres, KernelRichardsonLsq)
338314
sketched_krylov_bases->at(k + i * k_rows, 0) /= norm;
339315
}
340316
}
317+
auto d_hessenberg_iter =
318+
Mtx::create(this->exec, gko::dim<2>{krylov_dim + 1, num_rhs});
319+
auto exp_d_hessenberg_iter = gko::clone(d_hessenberg_iter);
320+
// Test all the different iteration steps
321+
for (gko::size_type iter = 1; iter < krylov_dim + 1; ++iter) {
322+
SCOPED_TRACE(iter);
323+
auto hessenberg_iter =
324+
Mtx::create(this->exec, gko::dim<2>{iter + 2, num_rhs});
325+
auto exp_hessenberg_iter = gko::clone(hessenberg_iter);
326+
auto sketched_next_krylov2 =
327+
Mtx::create(this->exec, gko::dim<2>{k_rows, num_rhs});
328+
auto exp_sketched_next_krylov2 = gko::clone(sketched_next_krylov2);
329+
hessenberg_iter->fill(nan);
330+
for (gko::size_type i = iter + 1; i < iter + 2; ++i) {
331+
for (gko::size_type r = 0; r < num_rhs; ++r) {
332+
// These entries should not be touched!
333+
hessenberg_iter->at(i, r) = 42.;
334+
exp_hessenberg_iter->at(i, r) = 42.;
335+
}
336+
}
337+
sketched_next_krylov2->fill(nan);
338+
d_hessenberg_iter->fill(nan);
339+
for (gko::size_type i = iter + 1; i < krylov_dim + 1; ++i) {
340+
// These entries should not be touched by kernel
341+
d_hessenberg_iter->at(i, 0) = 13;
342+
exp_d_hessenberg_iter->at(i, 0) = 13;
343+
}
341344

342-
gko::kernels::reference::gmres::richardson_lsq(
343-
this->exec, sketched_krylov_bases.get(), hessenberg_iter.get(),
344-
d_hessenberg_iter.get(), sketched_next_krylov2.get(), iter, k_rows);
345-
346-
// Adjust the dimensions for the GEMV and AXPY operations
347-
// Note: since this matrix is stored column-major in our code, it appears as
348-
// transposed in its normal state
349-
auto shrunk_sketched_krylov_bases_trans = Mtx::create_const(
350-
this->exec, gko::dim<2>{iter + 1, k_rows},
351-
gko::make_const_array_view<T>(
352-
this->exec, sketched_krylov_bases->get_num_stored_elements(),
353-
sketched_krylov_bases->get_const_values()),
354-
k_rows);
355-
auto shrunk_sketched_krylov_bases =
356-
gko::as<Mtx>(shrunk_sketched_krylov_bases_trans->transpose());
357-
358-
auto exp_shrunk_hessenberg = exp_hessenberg_iter->create_submatrix(
359-
gko::span{0, iter + 1}, gko::span{0, num_rhs});
360-
auto exp_shrunk_d_hessenberg = exp_d_hessenberg_iter->create_submatrix(
361-
gko::span{0, iter + 1}, gko::span{0, num_rhs});
362-
363-
// sketched_krylov2 = sketched_krylov_bases[iter + 1, :];
364-
for (gko::size_type k = 0; k < num_rhs; k++) {
365-
for (gko::size_type j = 0; j < k_rows; j++)
366-
exp_sketched_next_krylov2->at(j, k) =
367-
sketched_krylov_bases->at(j + (iter + 1) * k_rows, k);
368-
}
369-
exp_shrunk_hessenberg->fill(0);
370-
for (int i = 0; i < 3; ++i) {
371-
// d_hessenberg_iter = Transpose(sketched_krylov_bases) *
372-
// sketched_krylov2;
373-
shrunk_sketched_krylov_bases_trans->apply(
374-
exp_sketched_next_krylov2.get(), exp_shrunk_d_hessenberg.get());
375-
376-
// sketched_krylov2 = sketched_krylov2 - sketched_krylov_bases *
377-
// d_hessenberg_iter;
378-
shrunk_sketched_krylov_bases->apply(neg_one_mtx,
379-
exp_shrunk_d_hessenberg, one_mtx,
380-
exp_sketched_next_krylov2.get());
381-
382-
// hessenberg_iter = hessenberg_iter + d_hessenberg_iter;
383-
exp_shrunk_hessenberg->add_scaled(one_mtx, exp_shrunk_d_hessenberg);
384-
}
345+
gko::kernels::reference::gmres::richardson_lsq(
346+
this->exec, sketched_krylov_bases.get(), hessenberg_iter.get(),
347+
d_hessenberg_iter.get(), sketched_next_krylov2.get(), iter, k_rows);
348+
// Adjust the dimensions for the GEMV and AXPY operations
349+
// Note: since this matrix is stored column-major in our code, it
350+
// appears as transposed in its normal state
351+
auto shrunk_sketched_krylov_bases_trans = Mtx::create_const(
352+
this->exec, gko::dim<2>{iter + 1, k_rows},
353+
gko::make_const_array_view<T>(
354+
this->exec, sketched_krylov_bases->get_num_stored_elements(),
355+
sketched_krylov_bases->get_const_values()),
356+
k_rows);
357+
auto shrunk_sketched_krylov_bases =
358+
gko::as<Mtx>(shrunk_sketched_krylov_bases_trans->transpose());
359+
auto exp_shrunk_hessenberg = exp_hessenberg_iter->create_submatrix(
360+
gko::span{0, iter + 1}, gko::span{0, num_rhs});
361+
auto exp_shrunk_d_hessenberg = exp_d_hessenberg_iter->create_submatrix(
362+
gko::span{0, iter + 1}, gko::span{0, num_rhs});
363+
for (gko::size_type k = 0; k < num_rhs; k++) {
364+
for (gko::size_type j = 0; j < k_rows; j++)
365+
exp_sketched_next_krylov2->at(j, k) =
366+
sketched_krylov_bases->at(j + (iter + 1) * k_rows, k);
367+
}
368+
exp_shrunk_hessenberg->fill(0);
369+
for (int i = 0; i < 3; ++i) {
370+
shrunk_sketched_krylov_bases_trans->apply(
371+
exp_sketched_next_krylov2.get(), exp_shrunk_d_hessenberg.get());
372+
shrunk_sketched_krylov_bases->apply(
373+
neg_one_mtx, exp_shrunk_d_hessenberg, one_mtx,
374+
exp_sketched_next_krylov2.get());
375+
exp_shrunk_hessenberg->add_scaled(one_mtx, exp_shrunk_d_hessenberg);
376+
}
385377

386-
GKO_EXPECT_MTX_NEAR(hessenberg_iter, exp_hessenberg_iter, r<T>::value);
387-
GKO_EXPECT_MTX_NEAR(d_hessenberg_iter, exp_d_hessenberg_iter, r<T>::value);
388-
GKO_EXPECT_MTX_NEAR(sketched_next_krylov2, exp_sketched_next_krylov2,
389-
r<T>::value);
378+
GKO_EXPECT_MTX_NEAR(hessenberg_iter, exp_hessenberg_iter, r<T>::value);
379+
GKO_EXPECT_MTX_NEAR(d_hessenberg_iter, exp_d_hessenberg_iter,
380+
r<T>::value);
381+
GKO_EXPECT_MTX_NEAR(sketched_next_krylov2, exp_sketched_next_krylov2,
382+
r<T>::value);
383+
}
390384
}
391385

386+
392387
TYPED_TEST(Gmres, KernelHessenbergQrIter0)
393388
{
394389
using T = typename TestFixture::value_type;
@@ -560,6 +555,7 @@ TYPED_TEST(Gmres, KernelMultiAxpy)
560555
r<T>::value);
561556
}
562557

558+
563559
TYPED_TEST(Gmres, KernelMultiDot)
564560
{
565561
using T = typename TestFixture::value_type;
@@ -599,6 +595,7 @@ TYPED_TEST(Gmres, KernelMultiDot)
599595
r<T>::value);
600596
}
601597

598+
602599
TYPED_TEST(Gmres, SolvesStencilSystem)
603600
{
604601
using Mtx = typename TestFixture::Mtx;
@@ -968,6 +965,7 @@ TYPED_TEST(Gmres, SolvesWithPreconditioner)
968965
}
969966
}
970967

968+
971969
TYPED_TEST(Gmres, SolvesWithRgs)
972970
{
973971
using Mtx = typename TestFixture::Mtx;
@@ -1009,6 +1007,7 @@ TYPED_TEST(Gmres, SolvesWithRgs)
10091007
r<value_type>::value * 1e3);
10101008
}
10111009

1010+
10121011
TYPED_TEST(Gmres, SolvesWithRgsBigAndPreconditioner)
10131012
{
10141013
using Mtx = typename TestFixture::Mtx;

0 commit comments

Comments
 (0)