@@ -207,6 +207,7 @@ TYPED_TEST(Gmres, KernelRestart)
207207 r<value_type>::value);
208208}
209209
210+
210211TYPED_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+
283285TYPED_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+
392387TYPED_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+
563559TYPED_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+
602599TYPED_TEST (Gmres, SolvesStencilSystem)
603600{
604601 using Mtx = typename TestFixture::Mtx;
@@ -968,6 +965,7 @@ TYPED_TEST(Gmres, SolvesWithPreconditioner)
968965 }
969966}
970967
968+
971969TYPED_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+
10121011TYPED_TEST (Gmres, SolvesWithRgsBigAndPreconditioner)
10131012{
10141013 using Mtx = typename TestFixture::Mtx;
0 commit comments