Skip to content

Commit

Permalink
Sparse - spgemm: moving symbolic and numeric phases out of the experi…
Browse files Browse the repository at this point in the history
…mental namespace (kokkos#2493)

* Sparse - spgemm: moving symbolic and numeric phases out of the
experimental namespace

Signed-off-by: Luc Berger-Vergiat <lberge@sandia.gov>

* Applying clang-format

Signed-off-by: Luc Berger-Vergiat <lberge@sandia.gov>

---------

Signed-off-by: Luc Berger-Vergiat <lberge@sandia.gov>
  • Loading branch information
lucbv committed Mar 7, 2025
1 parent 26375c0 commit 5e87778
Show file tree
Hide file tree
Showing 12 changed files with 98 additions and 82 deletions.
44 changes: 20 additions & 24 deletions graph/src/KokkosGraph_CoarsenConstruct.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,60 +250,56 @@ class coarse_builder {
if (handle.b == Spgemm_transpose_first) {
kh.create_spgemm_handle();
edge_view_t row_map_p1("rows_partial", nc + 1);
KokkosSparse::Experimental::spgemm_symbolic(&kh, nc, n, n, interp_transpose.graph.row_map,
interp_transpose.graph.entries, false, g.graph.row_map,
g.graph.entries, false, row_map_p1);
KokkosSparse::spgemm_symbolic(&kh, nc, n, n, interp_transpose.graph.row_map, interp_transpose.graph.entries,
false, g.graph.row_map, g.graph.entries, false, row_map_p1);

// partial-result matrix
vtx_view_t entries_p1("adjacencies_partial", kh.get_spgemm_handle()->get_c_nnz());
wgt_view_t values_p1("weights_partial", kh.get_spgemm_handle()->get_c_nnz());

KokkosSparse::Experimental::spgemm_numeric(
&kh, nc, n, n, interp_transpose.graph.row_map, interp_transpose.graph.entries, interp_transpose.values, false,
g.graph.row_map, g.graph.entries, g.values, false, row_map_p1, entries_p1, values_p1);
KokkosSparse::spgemm_numeric(&kh, nc, n, n, interp_transpose.graph.row_map, interp_transpose.graph.entries,
interp_transpose.values, false, g.graph.row_map, g.graph.entries, g.values, false,
row_map_p1, entries_p1, values_p1);
kh.destroy_spgemm_handle();

row_map_coarse = edge_view_t("rows_coarse", nc + 1);
kh.create_spgemm_handle();
KokkosSparse::Experimental::spgemm_symbolic(&kh, nc, n, nc, row_map_p1, entries_p1, false,
interp_mtx.graph.row_map, interp_mtx.graph.entries, false,
row_map_coarse);
KokkosSparse::spgemm_symbolic(&kh, nc, n, nc, row_map_p1, entries_p1, false, interp_mtx.graph.row_map,
interp_mtx.graph.entries, false, row_map_coarse);
// coarse-graph adjacency matrix
adj_coarse = vtx_view_t("adjacencies_coarse", kh.get_spgemm_handle()->get_c_nnz());
wgt_coarse = wgt_view_t("weights_coarse", kh.get_spgemm_handle()->get_c_nnz());

KokkosSparse::Experimental::spgemm_numeric(&kh, nc, n, nc, row_map_p1, entries_p1, values_p1, false,
interp_mtx.graph.row_map, interp_mtx.graph.entries, interp_mtx.values,
false, row_map_coarse, adj_coarse, wgt_coarse);
KokkosSparse::spgemm_numeric(&kh, nc, n, nc, row_map_p1, entries_p1, values_p1, false, interp_mtx.graph.row_map,
interp_mtx.graph.entries, interp_mtx.values, false, row_map_coarse, adj_coarse,
wgt_coarse);
kh.destroy_spgemm_handle();
} else {
edge_view_t row_map_p1("rows_partial", n + 1);
kh.create_spgemm_handle();
KokkosSparse::Experimental::spgemm_symbolic(&kh, n, n, nc, g.graph.row_map, g.graph.entries, false,
interp_mtx.graph.row_map, interp_mtx.graph.entries, false,
row_map_p1);
KokkosSparse::spgemm_symbolic(&kh, n, n, nc, g.graph.row_map, g.graph.entries, false, interp_mtx.graph.row_map,
interp_mtx.graph.entries, false, row_map_p1);

// partial-result matrix
vtx_view_t entries_p1("adjacencies_partial", kh.get_spgemm_handle()->get_c_nnz());
wgt_view_t values_p1("weights_partial", kh.get_spgemm_handle()->get_c_nnz());

KokkosSparse::Experimental::spgemm_numeric(&kh, n, n, nc, g.graph.row_map, g.graph.entries, g.values, false,
interp_mtx.graph.row_map, interp_mtx.graph.entries, interp_mtx.values,
false, row_map_p1, entries_p1, values_p1);
KokkosSparse::spgemm_numeric(&kh, n, n, nc, g.graph.row_map, g.graph.entries, g.values, false,
interp_mtx.graph.row_map, interp_mtx.graph.entries, interp_mtx.values, false,
row_map_p1, entries_p1, values_p1);
kh.destroy_spgemm_handle();

row_map_coarse = edge_view_t("rows_coarse", nc + 1);
kh.create_spgemm_handle();
KokkosSparse::Experimental::spgemm_symbolic(&kh, nc, n, nc, interp_transpose.graph.row_map,
interp_transpose.graph.entries, false, row_map_p1, entries_p1, false,
row_map_coarse);
KokkosSparse::spgemm_symbolic(&kh, nc, n, nc, interp_transpose.graph.row_map, interp_transpose.graph.entries,
false, row_map_p1, entries_p1, false, row_map_coarse);
// coarse-graph adjacency matrix
adj_coarse = vtx_view_t("adjacencies_coarse", kh.get_spgemm_handle()->get_c_nnz());
wgt_coarse = wgt_view_t("weights_coarse", kh.get_spgemm_handle()->get_c_nnz());

KokkosSparse::Experimental::spgemm_numeric(
&kh, nc, n, nc, interp_transpose.graph.row_map, interp_transpose.graph.entries, interp_transpose.values,
false, row_map_p1, entries_p1, values_p1, false, row_map_coarse, adj_coarse, wgt_coarse);
KokkosSparse::spgemm_numeric(&kh, nc, n, nc, interp_transpose.graph.row_map, interp_transpose.graph.entries,
interp_transpose.values, false, row_map_p1, entries_p1, values_p1, false,
row_map_coarse, adj_coarse, wgt_coarse);
kh.destroy_spgemm_handle();
}

Expand Down
8 changes: 4 additions & 4 deletions perf_test/sparse/KokkosSparse_run_spgemm_jacobi.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,8 @@ crsMat_t3 run_experiment(crsMat_t crsMat, crsMat_t2 crsMat2, Parameters params)
sequential_kh.set_dynamic_scheduling(true);
}

spgemm_symbolic(&sequential_kh, m, n, k, crsMat.graph.row_map, crsMat.graph.entries, TRANSPOSEFIRST,
crsMat2.graph.row_map, crsMat2.graph.entries, TRANSPOSESECOND, row_mapC_ref);
KokkosSparse::spgemm_symbolic(&sequential_kh, m, n, k, crsMat.graph.row_map, crsMat.graph.entries, TRANSPOSEFIRST,
crsMat2.graph.row_map, crsMat2.graph.entries, TRANSPOSESECOND, row_mapC_ref);

ExecSpace().fence();

Expand Down Expand Up @@ -217,8 +217,8 @@ crsMat_t3 run_experiment(crsMat_t crsMat, crsMat_t2 crsMat2, Parameters params)
valuesC = scalar_view_t("valuesC (empty)", 0);

Kokkos::Timer timer1;
spgemm_symbolic(&kh, m, n, k, crsMat.graph.row_map, crsMat.graph.entries, TRANSPOSEFIRST, crsMat2.graph.row_map,
crsMat2.graph.entries, TRANSPOSESECOND, row_mapC);
KokkosSparse::spgemm_symbolic(&kh, m, n, k, crsMat.graph.row_map, crsMat.graph.entries, TRANSPOSEFIRST,
crsMat2.graph.row_map, crsMat2.graph.entries, TRANSPOSESECOND, row_mapC);

ExecSpace().fence();
double symbolic_time = timer1.seconds();
Expand Down
19 changes: 10 additions & 9 deletions perf_test/sparse/KokkosSparse_spgemm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -351,19 +351,19 @@ void run_spgemm(int argc, char** argv, perf_test::CommonInputParams) {
sequential_kh.set_dynamic_scheduling(true);
}

spgemm_symbolic(&sequential_kh, m, n, k, A.graph.row_map, A.graph.entries, TRANSPOSEFIRST, B.graph.row_map,
B.graph.entries, TRANSPOSESECOND, row_mapC_ref);
KokkosSparse::spgemm_symbolic(&sequential_kh, m, n, k, A.graph.row_map, A.graph.entries, TRANSPOSEFIRST,
B.graph.row_map, B.graph.entries, TRANSPOSESECOND, row_mapC_ref);

ExecSpace().fence();

size_type c_nnz_size = sequential_kh.get_spgemm_handle()->get_c_nnz();
entriesC_ref = lno_nnz_view_t(Kokkos::view_alloc(Kokkos::WithoutInitializing, "entriesC"), c_nnz_size);
valuesC_ref = scalar_view_t(Kokkos::view_alloc(Kokkos::WithoutInitializing, "valuesC"), c_nnz_size);

spgemm_numeric(&sequential_kh, m, n, k, A.graph.row_map, A.graph.entries, A.values, TRANSPOSEFIRST,
KokkosSparse::spgemm_numeric(&sequential_kh, m, n, k, A.graph.row_map, A.graph.entries, A.values, TRANSPOSEFIRST,

B.graph.row_map, B.graph.entries, B.values, TRANSPOSESECOND, row_mapC_ref, entriesC_ref,
valuesC_ref);
B.graph.row_map, B.graph.entries, B.values, TRANSPOSESECOND, row_mapC_ref,
entriesC_ref, valuesC_ref);
ExecSpace().fence();

C_ref = crsMat_t("CorrectC", m, k, valuesC_ref.extent(0), valuesC_ref, row_mapC_ref, entriesC_ref);
Expand Down Expand Up @@ -398,8 +398,8 @@ void run_spgemm(int argc, char** argv, perf_test::CommonInputParams) {
valuesC = scalar_view_t("valuesC (empty)", 0);

Kokkos::Timer timer1;
spgemm_symbolic(&kh, m, n, k, A.graph.row_map, A.graph.entries, TRANSPOSEFIRST, B.graph.row_map, B.graph.entries,
TRANSPOSESECOND, row_mapC);
KokkosSparse::spgemm_symbolic(&kh, m, n, k, A.graph.row_map, A.graph.entries, TRANSPOSEFIRST, B.graph.row_map,
B.graph.entries, TRANSPOSESECOND, row_mapC);

ExecSpace().fence();
double symbolic_time = timer1.seconds();
Expand All @@ -411,8 +411,9 @@ void run_spgemm(int argc, char** argv, perf_test::CommonInputParams) {
entriesC = lno_nnz_view_t(Kokkos::view_alloc(Kokkos::WithoutInitializing, "entriesC"), c_nnz_size);
valuesC = scalar_view_t(Kokkos::view_alloc(Kokkos::WithoutInitializing, "valuesC"), c_nnz_size);
}
spgemm_numeric(&kh, m, n, k, A.graph.row_map, A.graph.entries, A.values, TRANSPOSEFIRST, B.graph.row_map,
B.graph.entries, B.values, TRANSPOSESECOND, row_mapC, entriesC, valuesC);
KokkosSparse::spgemm_numeric(&kh, m, n, k, A.graph.row_map, A.graph.entries, A.values, TRANSPOSEFIRST,
B.graph.row_map, B.graph.entries, B.values, TRANSPOSESECOND, row_mapC, entriesC,
valuesC);

ExecSpace().fence();
double numeric_time = timer3.seconds();
Expand Down
4 changes: 2 additions & 2 deletions sparse/impl/KokkosSparse_bspgemm_numeric_spec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ struct BSPGEMM_NUMERIC<KernelHandle, a_size_view_t_, a_lno_view_t, a_scalar_view
using c_size_view_t_nc = typename c_size_view_t_::non_const_type;
using c_size_type = typename c_size_view_t_::non_const_value_type;
c_size_view_t_nc row_mapC_nc(const_cast<c_size_type *>(row_mapC.data()), row_mapC.extent(0));
KokkosSparse::Experimental::spgemm_symbolic(handle, m, n, k, row_mapA, entriesA, transposeA, row_mapB, entriesB,
transposeB, row_mapC_nc, true);
KokkosSparse::spgemm_symbolic(handle, m, n, k, row_mapA, entriesA, transposeA, row_mapB, entriesB, transposeB,
row_mapC_nc, true);
}
if (!sh->are_rowflops_computed()) {
KokkosSPGEMM<KernelHandle, a_size_view_t_, a_lno_view_t, a_scalar_view_t, b_size_view_t_, b_lno_view_t,
Expand Down
9 changes: 4 additions & 5 deletions sparse/impl/KokkosSparse_par_ilut_numeric_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,15 @@ struct IlutWrap {

const size_type nrows = ih.get_nrows();

KokkosSparse::Experimental::spgemm_symbolic(&kh, nrows, nrows, nrows, L_row_map, L_entries, false, U_row_map,
U_entries, false, LU_row_map);
KokkosSparse::spgemm_symbolic(&kh, nrows, nrows, nrows, L_row_map, L_entries, false, U_row_map, U_entries, false,
LU_row_map);

const size_type lu_nnz_size = kh.get_spgemm_handle()->get_c_nnz();
Kokkos::resize(LU_entries, lu_nnz_size);
Kokkos::resize(LU_values, lu_nnz_size);

KokkosSparse::Experimental::spgemm_numeric(&kh, nrows, nrows, nrows, L_row_map, L_entries, L_values, false,
U_row_map, U_entries, U_values, false, LU_row_map, LU_entries,
LU_values);
KokkosSparse::spgemm_numeric(&kh, nrows, nrows, nrows, L_row_map, L_entries, L_values, false, U_row_map, U_entries,
U_values, false, LU_row_map, LU_entries, LU_values);

// Need to sort LU CRS if on CUDA!
sort_crs_matrix<execution_space>(LU_row_map, LU_entries, LU_values);
Expand Down
4 changes: 2 additions & 2 deletions sparse/impl/KokkosSparse_spgemm_jacobi_spec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ struct SPGEMM_JACOBI<KernelHandle, a_size_view_t_, a_lno_view_t, a_scalar_view_t
using c_size_view_t_nc = typename c_size_view_t_::non_const_type;
using c_size_type = typename c_size_view_t_::non_const_value_type;
c_size_view_t_nc row_mapC_nc(const_cast<c_size_type *>(row_mapC.data()), row_mapC.extent(0));
KokkosSparse::Experimental::spgemm_symbolic(handle, m, n, k, row_mapA, entriesA, transposeA, row_mapB, entriesB,
transposeB, row_mapC_nc, true);
KokkosSparse::spgemm_symbolic(handle, m, n, k, row_mapA, entriesA, transposeA, row_mapB, entriesB, transposeB,
row_mapC_nc, true);
}
if (!sh->are_rowflops_computed()) {
KokkosSPGEMM<KernelHandle, a_size_view_t_, a_lno_view_t, a_scalar_view_t, b_size_view_t_, b_lno_view_t,
Expand Down
9 changes: 4 additions & 5 deletions sparse/impl/KokkosSparse_spgemm_noreuse_spec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,13 @@ struct SPGEMM_NOREUSE<CMatrix, AMatrix, BMatrix, false, KOKKOSKERNELS_IMPL_COMPI
ordinal_t n = B.numRows();
ordinal_t k = B.numCols();
c_rowmap_t row_mapC(Kokkos::view_alloc(Kokkos::WithoutInitializing, "C rowmap"), m + 1);
KokkosSparse::Experimental::spgemm_symbolic(&kh, m, n, k, A.graph.row_map, A.graph.entries, transA, B.graph.row_map,
B.graph.entries, transB, row_mapC);
KokkosSparse::spgemm_symbolic(&kh, m, n, k, A.graph.row_map, A.graph.entries, transA, B.graph.row_map,
B.graph.entries, transB, row_mapC);
size_type c_nnz = kh.get_spgemm_handle()->get_c_nnz();
c_entries_t entriesC(Kokkos::view_alloc(Kokkos::WithoutInitializing, "C entries"), c_nnz);
c_values_t valuesC(Kokkos::view_alloc(Kokkos::WithoutInitializing, "C values"), c_nnz);
KokkosSparse::Experimental::spgemm_numeric(&kh, m, n, k, A.graph.row_map, A.graph.entries, A.values, transA,
B.graph.row_map, B.graph.entries, B.values, transB, row_mapC, entriesC,
valuesC);
KokkosSparse::spgemm_numeric(&kh, m, n, k, A.graph.row_map, A.graph.entries, A.values, transA, B.graph.row_map,
B.graph.entries, B.values, transB, row_mapC, entriesC, valuesC);
kh.destroy_spgemm_handle();
return CMatrix("C", m, k, c_nnz, valuesC, row_mapC, entriesC);
}
Expand Down
22 changes: 10 additions & 12 deletions sparse/src/KokkosSparse_spgemm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@ void spgemm_symbolic(KernelHandle& kh, const AMatrix& A, const bool Amode, const
entries_type entriesC;
values_type valuesC;

KokkosSparse::Experimental::spgemm_symbolic(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map,
A.graph.entries, Amode, B.graph.row_map, B.graph.entries, Bmode,
row_mapC);
KokkosSparse::spgemm_symbolic(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map, A.graph.entries, Amode,
B.graph.row_map, B.graph.entries, Bmode, row_mapC);

const size_t c_nnz_size = kh.get_spgemm_handle()->get_c_nnz();
if (c_nnz_size) {
Expand Down Expand Up @@ -89,9 +88,8 @@ void block_spgemm_symbolic(KernelHandle& kh, const AMatrixType& A, const bool tr

row_map_type row_mapC(Kokkos::view_alloc(Kokkos::WithoutInitializing, "non_const_lnow_row"), A.numRows() + 1);

KokkosSparse::Experimental::spgemm_symbolic(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map,
A.graph.entries, transposeA, B.graph.row_map, B.graph.entries, transposeB,
row_mapC);
KokkosSparse::spgemm_symbolic(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map, A.graph.entries,
transposeA, B.graph.row_map, B.graph.entries, transposeB, row_mapC);

entries_type entriesC;
values_type valuesC;
Expand Down Expand Up @@ -125,9 +123,9 @@ void spgemm_numeric(KernelHandle& kh, const AMatrix& A, const bool Amode, const
// using entries_type = typename CMatrix::row_map_type::non_const_type;
// using values_type = typename CMatrix::values_type::non_const_type;

KokkosSparse::Experimental::spgemm_numeric(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map,
A.graph.entries, A.values, Amode, B.graph.row_map, B.graph.entries,
B.values, Bmode, C.graph.row_map, C.graph.entries, C.values);
KokkosSparse::spgemm_numeric(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map, A.graph.entries, A.values,
Amode, B.graph.row_map, B.graph.entries, B.values, Bmode, C.graph.row_map,
C.graph.entries, C.values);
}

///
Expand All @@ -152,9 +150,9 @@ void block_spgemm_numeric(KernelHandle& kh, const AMatrix& A, const bool Amode,
throw std::invalid_argument("Block SpGEMM must be called for matrices with the same block size");
}

KokkosSparse::Experimental::spgemm_numeric(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map,
A.graph.entries, A.values, Amode, B.graph.row_map, B.graph.entries,
B.values, Bmode, C.graph.row_map, C.graph.entries, C.values, blockDim);
KokkosSparse::spgemm_numeric(&kh, A.numRows(), B.numRows(), B.numCols(), A.graph.row_map, A.graph.entries, A.values,
Amode, B.graph.row_map, B.graph.entries, B.values, Bmode, C.graph.row_map,
C.graph.entries, C.values, blockDim);
}

///
Expand Down
16 changes: 14 additions & 2 deletions sparse/src/KokkosSparse_spgemm_numeric.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@

namespace KokkosSparse {

namespace Experimental {

//
// NOTE: block_dim = 1 for CRS-formated views
// block_dim >= 1 for BSR-formatted views (bs=1 BSR is CRS)
Expand Down Expand Up @@ -243,6 +241,20 @@ void spgemm_numeric(KernelHandle *handle, typename KernelHandle::const_nnz_lno_t
}
}

namespace Experimental {

template <typename KernelHandle, typename alno_row_view_t_, typename alno_nnz_view_t_, typename ascalar_nnz_view_t_,
typename blno_row_view_t_, typename blno_nnz_view_t_, typename bscalar_nnz_view_t_, typename clno_row_view_t_,
typename clno_nnz_view_t_, typename cscalar_nnz_view_t_>
[[deprecated("spgemm_numeric was promoted out of Experimental, please use KokkosSparse::spgemm_numeric instead.")]] void
spgemm_numeric(KernelHandle *handle, typename KernelHandle::const_nnz_lno_t m, typename KernelHandle::const_nnz_lno_t n,
typename KernelHandle::const_nnz_lno_t k, alno_row_view_t_ row_mapA, alno_nnz_view_t_ entriesA,
ascalar_nnz_view_t_ valuesA, bool transposeA, blno_row_view_t_ row_mapB, blno_nnz_view_t_ entriesB,
bscalar_nnz_view_t_ valuesB, bool transposeB, clno_row_view_t_ row_mapC, clno_nnz_view_t_ &entriesC,
cscalar_nnz_view_t_ &valuesC, typename KernelHandle::const_nnz_lno_t block_dim = 1) {
KokkosSparse::spgemm_numeric(handle, m, n, k, row_mapA, entriesA, valuesA, transposeA, row_mapB, entriesB, valuesB,
transposeB, row_mapC, entriesC, valuesC, block_dim);
}
} // namespace Experimental
} // namespace KokkosSparse

Expand Down
Loading

0 comments on commit 5e87778

Please sign in to comment.