Skip to content

Commit

Permalink
Splines LAPACK backend (#479)
Browse files Browse the repository at this point in the history
  • Loading branch information
blegouix authored Jul 3, 2024
1 parent 8a78249 commit e45b4aa
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 19 deletions.
37 changes: 32 additions & 5 deletions include/ddc/kernels/splines/spline_builder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ namespace ddc {
* An enum determining the backend solver of a SplineBuilder or SplineBuilder2d.
*/
enum class SplineSolver {
GINKGO ///< Enum member to identify the Ginkgo-based solver (iterative method)
GINKGO, ///< Enum member to identify the Ginkgo-based solver (iterative method)
LAPACK ///< Enum member to identify the LAPACK-based solver (direct method)
};

/**
Expand Down Expand Up @@ -599,10 +600,36 @@ void SplineBuilder<
return;
*/

matrix = ddc::detail::SplinesLinearProblemMaker::make_new_sparse<ExecSpace>(
ddc::discrete_space<BSplines>().nbasis(),
cols_per_chunk,
preconditionner_max_block_size);
if constexpr (Solver == ddc::SplineSolver::LAPACK) {
int upper_band_width;
if (bsplines_type::is_uniform()) {
upper_band_width = bsplines_type::degree() / 2;
} else {
upper_band_width = bsplines_type::degree() - 1;
}
if constexpr (bsplines_type::is_periodic()) {
matrix = ddc::detail::SplinesLinearProblemMaker::make_new_periodic_band_matrix<
ExecSpace>(
ddc::discrete_space<BSplines>().nbasis(),
upper_band_width,
upper_band_width,
bsplines_type::is_uniform());
} else {
matrix = ddc::detail::SplinesLinearProblemMaker::
make_new_block_matrix_with_band_main_block<ExecSpace>(
ddc::discrete_space<BSplines>().nbasis(),
upper_band_width,
upper_band_width,
bsplines_type::is_uniform(),
lower_block_size,
upper_block_size);
}
} else if constexpr (Solver == ddc::SplineSolver::GINKGO) {
matrix = ddc::detail::SplinesLinearProblemMaker::make_new_sparse<ExecSpace>(
ddc::discrete_space<BSplines>().nbasis(),
cols_per_chunk,
preconditionner_max_block_size);
}

build_matrix_system();

Expand Down
24 changes: 22 additions & 2 deletions tests/splines/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,18 +101,38 @@ foreach(BC "BC_PERIODIC" "BC_GREVILLE")
endforeach()
endforeach()

# LAPACK
foreach(BC "BC_PERIODIC" "BC_GREVILLE" "BC_HERMITE")
foreach(DEGREE_X RANGE "${SPLINES_TEST_DEGREE_MIN}" "${SPLINES_TEST_DEGREE_MAX}")
foreach(BSPLINES_TYPE "BSPLINES_TYPE_UNIFORM" "BSPLINES_TYPE_NON_UNIFORM")
set(test_name "splines_tests_BATCHED_DEGREE_X_${DEGREE_X}_${BSPLINES_TYPE}_${BC}")
set(test_name "splines_tests_BATCHED_DEGREE_X_${DEGREE_X}_${BSPLINES_TYPE}_${BC}_LAPACK")
add_executable("${test_name}" ../main.cpp batched_spline_builder.cpp)
target_compile_features("${test_name}" PUBLIC cxx_std_17)
target_link_libraries("${test_name}"
PUBLIC
GTest::gtest
DDC::DDC
)
target_compile_definitions("${test_name}" PUBLIC -DDEGREE_X=${DEGREE_X} -D${BSPLINES_TYPE} -D${BC})
target_compile_definitions("${test_name}" PUBLIC -DDEGREE_X=${DEGREE_X} -D${BSPLINES_TYPE} -D${BC} -DSOLVER_LAPACK)
# add_test("${test_name}" "${test_name}")
gtest_discover_tests("${test_name}" DISCOVERY_MODE PRE_TEST)
endforeach()
endforeach()
endforeach()

# GINKGO
foreach(BC "BC_PERIODIC" "BC_GREVILLE" "BC_HERMITE")
foreach(DEGREE_X RANGE "${SPLINES_TEST_DEGREE_MIN}" "${SPLINES_TEST_DEGREE_MAX}")
foreach(BSPLINES_TYPE "BSPLINES_TYPE_UNIFORM" "BSPLINES_TYPE_NON_UNIFORM")
set(test_name "splines_tests_BATCHED_DEGREE_X_${DEGREE_X}_${BSPLINES_TYPE}_${BC}_GINKGO")
add_executable("${test_name}" ../main.cpp batched_spline_builder.cpp)
target_compile_features("${test_name}" PUBLIC cxx_std_17)
target_link_libraries("${test_name}"
PUBLIC
GTest::gtest
DDC::DDC
)
target_compile_definitions("${test_name}" PUBLIC -DDEGREE_X=${DEGREE_X} -D${BSPLINES_TYPE} -D${BC} -DSOLVER_GINKGO)
# add_test("${test_name}" "${test_name}")
gtest_discover_tests("${test_name}" DISCOVERY_MODE PRE_TEST)
endforeach()
Expand Down
40 changes: 28 additions & 12 deletions tests/splines/batched_spline_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,11 @@ static void BatchedSplineTest()
IDim<I, I>,
s_bcl,
s_bcr,
#if defined(SOLVER_LAPACK)
ddc::SplineSolver::LAPACK,
#elif defined(SOLVER_GINKGO)
ddc::SplineSolver::GINKGO,
#endif
IDim<X, I>...>
spline_builder(dom_vals);

Expand Down Expand Up @@ -416,18 +420,30 @@ static void BatchedSplineTest()
1.0e-14 * max_norm_int));
}

#if defined(BC_PERIODIC) && defined(BSPLINES_TYPE_UNIFORM)
#define SUFFIX(name) name##Periodic##Uniform
#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_NON_UNIFORM)
#define SUFFIX(name) name##Periodic##NonUniform
#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_UNIFORM)
#define SUFFIX(name) name##Greville##Uniform
#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_NON_UNIFORM)
#define SUFFIX(name) name##Greville##NonUniform
#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_UNIFORM)
#define SUFFIX(name) name##Hermite##Uniform
#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_NON_UNIFORM)
#define SUFFIX(name) name##Hermite##NonUniform
#if defined(BC_PERIODIC) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_LAPACK)
#define SUFFIX(name) name##Lapack##Periodic##Uniform
#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_LAPACK)
#define SUFFIX(name) name##Lapack##Periodic##NonUniform
#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_LAPACK)
#define SUFFIX(name) name##Lapack##Greville##Uniform
#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_LAPACK)
#define SUFFIX(name) name##Lapack##Greville##NonUniform
#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_LAPACK)
#define SUFFIX(name) name##Lapack##Hermite##Uniform
#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_LAPACK)
#define SUFFIX(name) name##Lapack##Hermite##NonUniform
#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_GINKGO)
#define SUFFIX(name) name##Ginkgo##Periodic##Uniform
#elif defined(BC_PERIODIC) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_GINKGO)
#define SUFFIX(name) name##Ginkgo##Periodic##NonUniform
#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_GINKGO)
#define SUFFIX(name) name##Ginkgo##Greville##Uniform
#elif defined(BC_GREVILLE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_GINKGO)
#define SUFFIX(name) name##Ginkgo##Greville##NonUniform
#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_UNIFORM) && defined(SOLVER_GINKGO)
#define SUFFIX(name) name##Ginkgo##Hermite##Uniform
#elif defined(BC_HERMITE) && defined(BSPLINES_TYPE_NON_UNIFORM) && defined(SOLVER_GINKGO)
#define SUFFIX(name) name##Ginkgo##Hermite##NonUniform
#endif

TEST(SUFFIX(BatchedSplineHost), 1DX)
Expand Down

0 comments on commit e45b4aa

Please sign in to comment.