Skip to content

Commit

Permalink
test updates
Browse files Browse the repository at this point in the history
  • Loading branch information
pratikvn committed Apr 24, 2024
1 parent 28cf6dd commit 73c817c
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 14 deletions.
8 changes: 4 additions & 4 deletions core/test/utils/batch_helpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,20 +138,20 @@ std::unique_ptr<MatrixType> generate_diag_dominant_batch_matrix(
static_cast<size_type>(num_cols)},
{}};
auto engine = std::default_random_engine(42);
auto rand_diag_dist = std::normal_distribution<real_type>(8.0, 1.0);
auto rand_diag_dist = std::normal_distribution<real_type>(20.0, 1.0);
for (int row = 0; row < num_rows; ++row) {
std::uniform_int_distribution<index_type> rand_nnz_dist{1, row + 1};
const auto k = rand_nnz_dist(engine);
if (row > 0) {
data.nonzeros.emplace_back(row - 1, row, value_type{-1.0});
data.nonzeros.emplace_back(row - 1, row, value_type{-1.5});
}
data.nonzeros.emplace_back(
row, row,
std::abs(static_cast<value_type>(
detail::get_rand_value<real_type>(rand_diag_dist, engine))));
if (row < num_rows - 1) {
data.nonzeros.emplace_back(row, k, value_type{-1.0});
data.nonzeros.emplace_back(row, row + 1, value_type{-1.0});
data.nonzeros.emplace_back(row, k, value_type{-2.0});
data.nonzeros.emplace_back(row, row + 1, value_type{-4.0});
}
}

Expand Down
82 changes: 72 additions & 10 deletions test/preconditioner/batch_jacobi_kernels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void is_equivalent_to_ref(
gko::array<int>::const_view(exec, num_blocks + 1,
d_prec->get_const_block_pointers()),
gko::array<int>::const_view(exec, num_blocks + 1, block_pointers_ref));
GKO_ASSERT_ARRAY_NEAR(
GKO_EXPECT_ARRAY_NEAR(
gko::array<ValueType>::const_view(exec, nbatch * cumul_block_size,
d_prec->get_const_blocks()),
gko::array<ValueType>::const_view(exec, nbatch * cumul_block_size,
Expand Down Expand Up @@ -120,7 +120,7 @@ class BatchJacobi : public CommonTestFixture {
d_block_jacobi_prec =
BJ::build()
.with_max_block_size(max_blk_sz)
.with_block_pointers(block_pointers_for_device)
// .with_block_pointers(block_pointers_for_device)
.on(exec)
->generate(d_mtx);
}
Expand All @@ -141,13 +141,27 @@ class BatchJacobi : public CommonTestFixture {
};
solver_settings = Settings{max_iters, tol,
gko::batch::stop::tolerance_type::relative};
solver_factory =
solver_type::build()
.with_max_iterations(max_iters)
.with_tolerance(tol)
.with_tolerance_type(gko::batch::stop::tolerance_type::relative)
.on(exec);
precond_solver_factory =
solver_type::build()
.with_max_iterations(max_iters)
.with_tolerance(tol)
.with_tolerance_type(gko::batch::stop::tolerance_type::relative)
.with_preconditioner(
precond_type::build().with_max_block_size(2u))
precond_type::build().with_max_block_size(16u))
.on(exec);
scalar_jac_solver_factory =
solver_type::build()
.with_max_iterations(max_iters)
.with_tolerance(tol)
.with_tolerance_type(gko::batch::stop::tolerance_type::relative)
.with_preconditioner(
precond_type::build().with_max_block_size(1u))
.on(exec);
return gko::test::generate_batch_linear_system(mat, num_rhs);
}
Expand All @@ -156,7 +170,9 @@ class BatchJacobi : public CommonTestFixture {
const Mtx*, const MVec*, MVec*, LogData&)>
solve_lambda;
Settings solver_settings{};
std::shared_ptr<typename solver_type::Factory> solver_factory;
std::shared_ptr<typename solver_type::Factory> precond_solver_factory;
std::shared_ptr<typename solver_type::Factory> scalar_jac_solver_factory;

const size_t nbatch = 3;
const int nrows = 300;
Expand All @@ -183,30 +199,76 @@ TEST_F(BatchJacobi, BatchBlockJacobiGenerationIsEquivalentToRef)
}


TEST_F(BatchJacobi, CanSolveLargeMatrixSizeHpdSystemWithBlockJacobi)
TEST_F(BatchJacobi, CanSolveLargeMatrixSizeHpdSystemWithScalarJacobi)
{
const int num_batch_items = 12;
const int num_rows = 1025;
const int num_rhs = 1;
const real_type tol = 1e-5;
const int max_iters = num_rows * 2;
const int max_iters = num_rows;
std::shared_ptr<Logger> plogger = Logger::create();
std::shared_ptr<Logger> logger = Logger::create();
auto mat =
gko::share(gko::test::generate_diag_dominant_batch_matrix<const CsrMtx>(
exec, num_batch_items, num_rows, false, (4 * num_rows - 3)));
gko::share(gko::test::generate_3pt_stencil_batch_matrix<const CsrMtx>(
exec, num_batch_items, num_rows, (3 * num_rows - 2)));
auto linear_system = setup_linsys_and_solver(mat, num_rhs, tol, max_iters);
auto solver =
gko::share(precond_solver_factory->generate(linear_system.matrix));
auto solver = gko::share(solver_factory->generate(linear_system.matrix));
solver->add_logger(logger);
auto psolver =
gko::share(scalar_jac_solver_factory->generate(linear_system.matrix));
psolver->add_logger(plogger);
auto res2 = gko::test::solve_linear_system(exec, linear_system, solver);

auto res = gko::test::solve_linear_system(exec, linear_system, solver);
auto res = gko::test::solve_linear_system(exec, linear_system, psolver);

psolver->remove_logger(plogger);
solver->remove_logger(logger);
auto p_iter_counts = gko::make_temporary_clone(
exec->get_master(), &plogger->get_num_iterations());
auto iter_counts = gko::make_temporary_clone(exec->get_master(),
&logger->get_num_iterations());
auto res_norm = gko::make_temporary_clone(exec->get_master(),
&logger->get_residual_norm());
GKO_ASSERT_BATCH_MTX_NEAR(res.x, linear_system.exact_sol, tol * 500);
for (size_t i = 0; i < num_batch_items; i++) {
auto comp_res_norm = res.host_res_norm->get_const_values()[i] /
linear_system.host_rhs_norm->get_const_values()[i];
ASSERT_LE(iter_counts->get_const_data()[i], max_iters);
EXPECT_LE(p_iter_counts->get_const_data()[i],
iter_counts->get_const_data()[i]);
EXPECT_LE(res_norm->get_const_data()[i] /
linear_system.host_rhs_norm->get_const_values()[i],
tol);
EXPECT_GT(res_norm->get_const_data()[i], real_type{0.0});
ASSERT_LE(comp_res_norm, tol * 10);
}
}


TEST_F(BatchJacobi, CanSolveLargeMatrixSizeHpdSystemWithBlockJacobi)
{
const int num_batch_items = 12;
const int num_rows = 1025;
const int num_rhs = 1;
const real_type tol = 1e-5;
const int max_iters = num_rows;
std::shared_ptr<Logger> plogger = Logger::create();
auto mat =
gko::share(gko::test::generate_diag_dominant_batch_matrix<const CsrMtx>(
exec, num_batch_items, num_rows, false, (4 * num_rows - 3)));
auto linear_system = setup_linsys_and_solver(mat, num_rhs, tol, max_iters);
auto psolver =
gko::share(precond_solver_factory->generate(linear_system.matrix));
psolver->add_logger(plogger);

auto res = gko::test::solve_linear_system(exec, linear_system, psolver);

psolver->remove_logger(plogger);
auto iter_counts = gko::make_temporary_clone(
exec->get_master(), &plogger->get_num_iterations());
auto res_norm = gko::make_temporary_clone(exec->get_master(),
&plogger->get_residual_norm());
GKO_ASSERT_BATCH_MTX_NEAR(res.x, linear_system.exact_sol, tol * 500);
for (size_t i = 0; i < num_batch_items; i++) {
auto comp_res_norm = res.host_res_norm->get_const_values()[i] /
linear_system.host_rhs_norm->get_const_values()[i];
Expand Down

0 comments on commit 73c817c

Please sign in to comment.