diff --git a/common/unified/multigrid/uniform_coarsening_kernels.cpp b/common/unified/multigrid/uniform_coarsening_kernels.cpp index 3dcaf1279e4..27628cd6fd3 100644 --- a/common/unified/multigrid/uniform_coarsening_kernels.cpp +++ b/common/unified/multigrid/uniform_coarsening_kernels.cpp @@ -78,13 +78,15 @@ void fill_incremental_indices(std::shared_ptr exec, size_type num_jumps, Array* coarse_rows) { - IndexType num_elems = (coarse_rows->get_num_elems() + 1) / num_jumps; + IndexType num_elems = (coarse_rows->get_num_elems()); run_kernel( exec, - [] GKO_KERNEL(auto tidx, auto num_jumps, auto coarse_data) { - coarse_data[tidx] = tidx / num_jumps; + [] GKO_KERNEL(auto tidx, auto num_jumps, auto coarse_data, auto size) { + if (tidx % num_jumps == 0 && tidx < size) { + coarse_data[tidx] = tidx / num_jumps; + } }, - num_elems * num_jumps, num_jumps, coarse_rows->get_data()); + num_elems, num_jumps, coarse_rows->get_data(), num_elems); } GKO_INSTANTIATE_FOR_EACH_INDEX_TYPE( diff --git a/reference/test/multigrid/uniform_coarsening_kernels.cpp b/reference/test/multigrid/uniform_coarsening_kernels.cpp index c1c50f7b23f..c1bcc76c978 100644 --- a/reference/test/multigrid/uniform_coarsening_kernels.cpp +++ b/reference/test/multigrid/uniform_coarsening_kernels.cpp @@ -293,6 +293,27 @@ TYPED_TEST(UniformCoarsening, Generate) } +TYPED_TEST(UniformCoarsening, FillIncrementalIndicesWorks) +{ + using index_type = typename TestFixture::index_type; + auto c2_rows = + gko::Array(this->exec, {0, -1, 1, -1, 2, -1, 3, -1, 4, -1}); + auto c3_rows = gko::Array(this->exec, + {0, -1, -1, 1, -1, -1, 2, -1, -1, 3}); + auto c_rows = gko::Array(this->exec, 10); + c_rows.fill(-gko::one()); + + gko::kernels::reference::uniform_coarsening::fill_incremental_indices( + this->exec, 2, &c_rows); + GKO_ASSERT_ARRAY_EQ(c_rows, c2_rows); + + c_rows.fill(-gko::one()); + gko::kernels::reference::uniform_coarsening::fill_incremental_indices( + this->exec, 3, &c_rows); + GKO_ASSERT_ARRAY_EQ(c_rows, c3_rows); +} + + TYPED_TEST(UniformCoarsening, CoarseFineRestrictApply) { auto uniform_coarsening = diff --git a/test/multigrid/uniform_coarsening_kernels.cpp b/test/multigrid/uniform_coarsening_kernels.cpp index 5e57740a83d..c84ce0c63b6 100644 --- a/test/multigrid/uniform_coarsening_kernels.cpp +++ b/test/multigrid/uniform_coarsening_kernels.cpp @@ -81,6 +81,7 @@ class UniformCoarsening : public ::testing::Test { { ref = gko::ReferenceExecutor::create(); init_executor(ref, exec); + m = 597; } void TearDown() @@ -113,7 +114,6 @@ class UniformCoarsening : public ::testing::Test { void initialize_data(gko::size_type num_jumps = 2) { - m = 597; coarse_rows = gen_coarse_array(m, num_jumps); c_dim = (coarse_rows.get_num_elems() + 1) / num_jumps; @@ -153,8 +153,8 @@ class UniformCoarsening : public ::testing::Test { TEST_F(UniformCoarsening, FillIncrementalIndicesIsEquivalentToRef) { auto c_rows = gko::Array(ref, m); - auto d_c_rows = gko::Array(exec, m); - d_c_rows = c_rows; + c_rows.fill(-gko::one()); + auto d_c_rows = gko::Array(exec, c_rows); { gko::size_type num_jumps = 2; @@ -166,6 +166,8 @@ TEST_F(UniformCoarsening, FillIncrementalIndicesIsEquivalentToRef) } { gko::size_type num_jumps = 3; + c_rows.fill(-gko::one()); + d_c_rows.fill(-gko::one()); gko::kernels::reference::uniform_coarsening::fill_incremental_indices( ref, num_jumps, &c_rows); gko::kernels::EXEC_NAMESPACE::uniform_coarsening:: @@ -174,6 +176,8 @@ TEST_F(UniformCoarsening, FillIncrementalIndicesIsEquivalentToRef) } { gko::size_type num_jumps = 47; + c_rows.fill(-gko::one()); + d_c_rows.fill(-gko::one()); gko::kernels::reference::uniform_coarsening::fill_incremental_indices( ref, num_jumps, &c_rows); gko::kernels::EXEC_NAMESPACE::uniform_coarsening:: @@ -203,60 +207,60 @@ TEST_F(UniformCoarsening, FillRestrictOpIsEquivalentToRef) GKO_ASSERT_MTX_NEAR(restrict_op, d_restrict_op, r::value); } -// TODO: Fix for OpenMP -// TEST_F(UniformCoarsening, GenerateMgLevelIsEquivalentToRef) -// { -// gko::size_type num_jumps = 2; -// initialize_data(num_jumps); -// auto mg_level_factory = -// gko::multigrid::UniformCoarsening::build() -// .with_num_jumps(num_jumps) -// .with_skip_sorting(true) -// .on(ref); -// auto d_mg_level_factory = -// gko::multigrid::UniformCoarsening::build() -// .with_num_jumps(num_jumps) -// .with_skip_sorting(true) -// .on(exec); - -// auto mg_level = mg_level_factory->generate(system_mtx); -// auto d_mg_level = d_mg_level_factory->generate(d_system_mtx); - -// GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_prolong_op()), -// gko::as(mg_level->get_prolong_op()), -// r::value); -// GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_restrict_op()), -// gko::as(mg_level->get_restrict_op()), -// r::value); -// GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_coarse_op()), -// gko::as(mg_level->get_coarse_op()), -// r::value); -// } - - -// TEST_F(UniformCoarsening, GenerateMgLevelIsEquivalentToRefOnUnsortedMatrix) -// { -// initialize_data(); -// gko::test::unsort_matrix(gko::lend(system_mtx), rand_engine); -// d_system_mtx = gko::clone(exec, system_mtx); -// auto mg_level_factory = -// gko::multigrid::UniformCoarsening::build().on(ref); -// auto d_mg_level_factory = -// gko::multigrid::UniformCoarsening::build().on(exec); - -// auto mg_level = mg_level_factory->generate(system_mtx); -// auto d_mg_level = d_mg_level_factory->generate(d_system_mtx); - -// GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_prolong_op()), -// gko::as(mg_level->get_prolong_op()), -// r::value); -// GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_restrict_op()), -// gko::as(mg_level->get_restrict_op()), -// r::value); -// GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_coarse_op()), -// gko::as(mg_level->get_coarse_op()), -// r::value); -// } + +TEST_F(UniformCoarsening, GenerateMgLevelIsEquivalentToRef) +{ + gko::size_type num_jumps = 2; + initialize_data(num_jumps); + auto mg_level_factory = + gko::multigrid::UniformCoarsening::build() + .with_num_jumps(static_cast(num_jumps)) + .with_skip_sorting(true) + .on(ref); + auto d_mg_level_factory = + gko::multigrid::UniformCoarsening::build() + .with_num_jumps(static_cast(num_jumps)) + .with_skip_sorting(true) + .on(exec); + + auto mg_level = mg_level_factory->generate(system_mtx); + auto d_mg_level = d_mg_level_factory->generate(d_system_mtx); + + GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_prolong_op()), + gko::as(mg_level->get_prolong_op()), + r::value); + GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_restrict_op()), + gko::as(mg_level->get_restrict_op()), + r::value); + GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_coarse_op()), + gko::as(mg_level->get_coarse_op()), + r::value); +} + + +TEST_F(UniformCoarsening, GenerateMgLevelIsEquivalentToRefOnUnsortedMatrix) +{ + initialize_data(); + gko::test::unsort_matrix(gko::lend(system_mtx), rand_engine); + d_system_mtx = gko::clone(exec, system_mtx); + auto mg_level_factory = + gko::multigrid::UniformCoarsening::build().on(ref); + auto d_mg_level_factory = + gko::multigrid::UniformCoarsening::build().on(exec); + + auto mg_level = mg_level_factory->generate(system_mtx); + auto d_mg_level = d_mg_level_factory->generate(d_system_mtx); + + GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_prolong_op()), + gko::as(mg_level->get_prolong_op()), + r::value); + GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_restrict_op()), + gko::as(mg_level->get_restrict_op()), + r::value); + GKO_ASSERT_MTX_NEAR(gko::as(d_mg_level->get_coarse_op()), + gko::as(mg_level->get_coarse_op()), + r::value); +} } // namespace