Skip to content

Commit

Permalink
Fix tests and unified kernel
Browse files Browse the repository at this point in the history
  • Loading branch information
pratikvn committed Mar 10, 2022
1 parent 56a4d0c commit 0e30d47
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 61 deletions.
10 changes: 6 additions & 4 deletions common/unified/multigrid/uniform_coarsening_kernels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,15 @@ void fill_incremental_indices(std::shared_ptr<const DefaultExecutor> exec,
size_type num_jumps,
Array<IndexType>* 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(
Expand Down
21 changes: 21 additions & 0 deletions reference/test/multigrid/uniform_coarsening_kernels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,27 @@ TYPED_TEST(UniformCoarsening, Generate)
}


TYPED_TEST(UniformCoarsening, FillIncrementalIndicesWorks)
{
using index_type = typename TestFixture::index_type;
auto c2_rows =
gko::Array<index_type>(this->exec, {0, -1, 1, -1, 2, -1, 3, -1, 4, -1});
auto c3_rows = gko::Array<index_type>(this->exec,
{0, -1, -1, 1, -1, -1, 2, -1, -1, 3});
auto c_rows = gko::Array<index_type>(this->exec, 10);
c_rows.fill(-gko::one<index_type>());

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<index_type>());
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 =
Expand Down
118 changes: 61 additions & 57 deletions test/multigrid/uniform_coarsening_kernels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class UniformCoarsening : public ::testing::Test {
{
ref = gko::ReferenceExecutor::create();
init_executor(ref, exec);
m = 597;
}

void TearDown()
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -153,8 +153,8 @@ class UniformCoarsening : public ::testing::Test {
TEST_F(UniformCoarsening, FillIncrementalIndicesIsEquivalentToRef)
{
auto c_rows = gko::Array<index_type>(ref, m);
auto d_c_rows = gko::Array<index_type>(exec, m);
d_c_rows = c_rows;
c_rows.fill(-gko::one<index_type>());
auto d_c_rows = gko::Array<index_type>(exec, c_rows);

{
gko::size_type num_jumps = 2;
Expand All @@ -166,6 +166,8 @@ TEST_F(UniformCoarsening, FillIncrementalIndicesIsEquivalentToRef)
}
{
gko::size_type num_jumps = 3;
c_rows.fill(-gko::one<index_type>());
d_c_rows.fill(-gko::one<index_type>());
gko::kernels::reference::uniform_coarsening::fill_incremental_indices(
ref, num_jumps, &c_rows);
gko::kernels::EXEC_NAMESPACE::uniform_coarsening::
Expand All @@ -174,6 +176,8 @@ TEST_F(UniformCoarsening, FillIncrementalIndicesIsEquivalentToRef)
}
{
gko::size_type num_jumps = 47;
c_rows.fill(-gko::one<index_type>());
d_c_rows.fill(-gko::one<index_type>());
gko::kernels::reference::uniform_coarsening::fill_incremental_indices(
ref, num_jumps, &c_rows);
gko::kernels::EXEC_NAMESPACE::uniform_coarsening::
Expand Down Expand Up @@ -203,60 +207,60 @@ TEST_F(UniformCoarsening, FillRestrictOpIsEquivalentToRef)
GKO_ASSERT_MTX_NEAR(restrict_op, d_restrict_op, r<value_type>::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<value_type, int>::build()
// .with_num_jumps(num_jumps)
// .with_skip_sorting(true)
// .on(ref);
// auto d_mg_level_factory =
// gko::multigrid::UniformCoarsening<value_type, int>::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<Csr>(d_mg_level->get_prolong_op()),
// gko::as<Csr>(mg_level->get_prolong_op()),
// r<value_type>::value);
// GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_restrict_op()),
// gko::as<Csr>(mg_level->get_restrict_op()),
// r<value_type>::value);
// GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_coarse_op()),
// gko::as<Csr>(mg_level->get_coarse_op()),
// r<value_type>::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<value_type, int>::build().on(ref);
// auto d_mg_level_factory =
// gko::multigrid::UniformCoarsening<value_type, int>::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<Csr>(d_mg_level->get_prolong_op()),
// gko::as<Csr>(mg_level->get_prolong_op()),
// r<value_type>::value);
// GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_restrict_op()),
// gko::as<Csr>(mg_level->get_restrict_op()),
// r<value_type>::value);
// GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_coarse_op()),
// gko::as<Csr>(mg_level->get_coarse_op()),
// r<value_type>::value);
// }

TEST_F(UniformCoarsening, GenerateMgLevelIsEquivalentToRef)
{
gko::size_type num_jumps = 2;
initialize_data(num_jumps);
auto mg_level_factory =
gko::multigrid::UniformCoarsening<value_type, int>::build()
.with_num_jumps(static_cast<unsigned>(num_jumps))
.with_skip_sorting(true)
.on(ref);
auto d_mg_level_factory =
gko::multigrid::UniformCoarsening<value_type, int>::build()
.with_num_jumps(static_cast<unsigned>(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<Csr>(d_mg_level->get_prolong_op()),
gko::as<Csr>(mg_level->get_prolong_op()),
r<value_type>::value);
GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_restrict_op()),
gko::as<Csr>(mg_level->get_restrict_op()),
r<value_type>::value);
GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_coarse_op()),
gko::as<Csr>(mg_level->get_coarse_op()),
r<value_type>::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<value_type, int>::build().on(ref);
auto d_mg_level_factory =
gko::multigrid::UniformCoarsening<value_type, int>::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<Csr>(d_mg_level->get_prolong_op()),
gko::as<Csr>(mg_level->get_prolong_op()),
r<value_type>::value);
GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_restrict_op()),
gko::as<Csr>(mg_level->get_restrict_op()),
r<value_type>::value);
GKO_ASSERT_MTX_NEAR(gko::as<Csr>(d_mg_level->get_coarse_op()),
gko::as<Csr>(mg_level->get_coarse_op()),
r<value_type>::value);
}


} // namespace

0 comments on commit 0e30d47

Please sign in to comment.