diff --git a/src/apps-kokkos/NODAL_ACCUMULATION_3D-Kokkos.cpp b/src/apps-kokkos/NODAL_ACCUMULATION_3D-Kokkos.cpp index 632c38b77..62df6cb0f 100644 --- a/src/apps-kokkos/NODAL_ACCUMULATION_3D-Kokkos.cpp +++ b/src/apps-kokkos/NODAL_ACCUMULATION_3D-Kokkos.cpp @@ -22,7 +22,6 @@ namespace apps void NODAL_ACCUMULATION_3D::runKokkosVariant(VariantID vid) { const Index_type run_reps = getRunReps(); - const Index_type ibegin = 0; const Index_type iend = getActualProblemSize(); //m_domain->n_real_zones; NODAL_ACCUMULATION_3D_DATA_SETUP; diff --git a/src/lcals-kokkos/GEN_LIN_RECUR-Kokkos.cpp b/src/lcals-kokkos/GEN_LIN_RECUR-Kokkos.cpp index 80f9e2d01..e25af3a3a 100644 --- a/src/lcals-kokkos/GEN_LIN_RECUR-Kokkos.cpp +++ b/src/lcals-kokkos/GEN_LIN_RECUR-Kokkos.cpp @@ -17,7 +17,6 @@ namespace lcals { void GEN_LIN_RECUR::runKokkosVariant(VariantID vid) { const Index_type run_reps = getRunReps(); - const Index_type ibegin = 1; const Index_type iend = getActualProblemSize(); GEN_LIN_RECUR_DATA_SETUP; diff --git a/src/polybench-kokkos/CMakeLists.txt b/src/polybench-kokkos/CMakeLists.txt index ade65f5f4..fdae7dcb1 100644 --- a/src/polybench-kokkos/CMakeLists.txt +++ b/src/polybench-kokkos/CMakeLists.txt @@ -10,6 +10,7 @@ blt_add_library( NAME polybench-kokkos SOURCES + POLYBENCH_GEMM-Kokkos.cpp POLYBENCH_HEAT_3D-Kokkos.cpp POLYBENCH_JACOBI_1D-Kokkos.cpp POLYBENCH_JACOBI_2D-Kokkos.cpp diff --git a/src/polybench-kokkos/POLYBENCH_GEMM-Kokkos.cpp b/src/polybench-kokkos/POLYBENCH_GEMM-Kokkos.cpp new file mode 100644 index 000000000..144a5e80a --- /dev/null +++ b/src/polybench-kokkos/POLYBENCH_GEMM-Kokkos.cpp @@ -0,0 +1,75 @@ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Copyright (c) Lawrence Livermore National Security, LLC and other +// RAJA Project Developers. See top-level LICENSE and COPYRIGHT +// files for dates and other details. No copyright assignment is required +// to contribute to RAJA Performance Suite. +// +// SPDX-License-Identifier: (BSD-3-Clause) +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +#include "POLYBENCH_GEMM.hpp" + +#if defined(RUN_KOKKOS) + +#include "common/KokkosViewUtils.hpp" + +#include + +namespace rajaperf { +namespace polybench { + +void POLYBENCH_GEMM::runKokkosVariant(VariantID vid) { + const Index_type run_reps = getRunReps(); + + POLYBENCH_GEMM_DATA_SETUP; + + auto A_view = getViewFromPointer(A, ni, nk); + auto B_view = getViewFromPointer(B, nk, nj); + auto C_view = getViewFromPointer(C, ni, nj); + + switch (vid) { + case Kokkos_Lambda: { + + Kokkos::fence(); + startTimer(); + + // Loop counter increment uses macro to quiet C++20 compiler warning + for (RepIndex_type irep = 0; irep < run_reps; RP_REPCOUNTINC(irep)) { + + Kokkos::parallel_for( + "POLYBENCH_GEMM Kokkos_Lambda", + Kokkos::MDRangePolicy, + Kokkos::IndexType>({0, 0}, + {ni, nj}), + KOKKOS_LAMBDA(Index_type i, Index_type j) { + Real_type dot = 0.0; + C_view(i, j) *= beta; + for (Index_type k = 0; k < nk; ++k) { + dot += alpha * A_view(i, k) * B_view(k, j); + } + C_view(i, j) = dot; + }); + } + + Kokkos::fence(); + stopTimer(); + + break; + } + + default: { + std::cout << "\n POLYBENCH_GEMM : Unknown variant id = " << vid + << std::endl; + } + } + + moveDataToHostFromKokkosView(A, A_view, ni, nk); + moveDataToHostFromKokkosView(B, B_view, nk, nj); + moveDataToHostFromKokkosView(C, C_view, ni, nj); +} + +RAJAPERF_DEFAULT_TUNING_DEFINE_BOILERPLATE(POLYBENCH_GEMM, Kokkos, Kokkos_Lambda) + +} // end namespace polybench +} // end namespace rajaperf +#endif // RUN_KOKKOS diff --git a/src/polybench-kokkos/POLYBENCH_HEAT_3D-Kokkos.cpp b/src/polybench-kokkos/POLYBENCH_HEAT_3D-Kokkos.cpp index 89c4106ff..d49135877 100644 --- a/src/polybench-kokkos/POLYBENCH_HEAT_3D-Kokkos.cpp +++ b/src/polybench-kokkos/POLYBENCH_HEAT_3D-Kokkos.cpp @@ -72,9 +72,6 @@ void POLYBENCH_HEAT_3D::runKokkosVariant(VariantID vid) { Kokkos::fence(); stopTimer(); - moveDataToHostFromKokkosView(A, A_view, N, N, N); - moveDataToHostFromKokkosView(B, B_view, N, N, N); - break; } @@ -82,6 +79,9 @@ void POLYBENCH_HEAT_3D::runKokkosVariant(VariantID vid) { std::cout << "\n POLYBENCH_HEAT_3D : Unknown variant id = " << vid << std::endl; } + + moveDataToHostFromKokkosView(A, A_view, N, N, N); + moveDataToHostFromKokkosView(B, B_view, N, N, N); } } diff --git a/src/polybench-kokkos/POLYBENCH_JACOBI_1D-Kokkos.cpp b/src/polybench-kokkos/POLYBENCH_JACOBI_1D-Kokkos.cpp index 1719556bc..822d89a9c 100644 --- a/src/polybench-kokkos/POLYBENCH_JACOBI_1D-Kokkos.cpp +++ b/src/polybench-kokkos/POLYBENCH_JACOBI_1D-Kokkos.cpp @@ -56,9 +56,6 @@ void POLYBENCH_JACOBI_1D::runKokkosVariant(VariantID vid) { Kokkos::fence(); stopTimer(); - moveDataToHostFromKokkosView(A, A_view, N); - moveDataToHostFromKokkosView(B, B_view, N); - break; } @@ -67,6 +64,9 @@ void POLYBENCH_JACOBI_1D::runKokkosVariant(VariantID vid) { << std::endl; } } + + moveDataToHostFromKokkosView(A, A_view, N); + moveDataToHostFromKokkosView(B, B_view, N); } RAJAPERF_DEFAULT_TUNING_DEFINE_BOILERPLATE(POLYBENCH_JACOBI_1D, Kokkos, Kokkos_Lambda) diff --git a/src/polybench-kokkos/POLYBENCH_JACOBI_2D-Kokkos.cpp b/src/polybench-kokkos/POLYBENCH_JACOBI_2D-Kokkos.cpp index 817631107..472c20848 100644 --- a/src/polybench-kokkos/POLYBENCH_JACOBI_2D-Kokkos.cpp +++ b/src/polybench-kokkos/POLYBENCH_JACOBI_2D-Kokkos.cpp @@ -62,9 +62,6 @@ void POLYBENCH_JACOBI_2D::runKokkosVariant(VariantID vid) { Kokkos::fence(); stopTimer(); - moveDataToHostFromKokkosView(A, A_view, N, N); - moveDataToHostFromKokkosView(B, B_view, N, N); - break; } @@ -73,6 +70,9 @@ void POLYBENCH_JACOBI_2D::runKokkosVariant(VariantID vid) { << std::endl; } } + + moveDataToHostFromKokkosView(A, A_view, N, N); + moveDataToHostFromKokkosView(B, B_view, N, N); } RAJAPERF_DEFAULT_TUNING_DEFINE_BOILERPLATE(POLYBENCH_JACOBI_2D, Kokkos, Kokkos_Lambda) diff --git a/src/polybench/POLYBENCH_GEMM.hpp b/src/polybench/POLYBENCH_GEMM.hpp index 884316ec7..1bc61a598 100644 --- a/src/polybench/POLYBENCH_GEMM.hpp +++ b/src/polybench/POLYBENCH_GEMM.hpp @@ -104,6 +104,7 @@ class POLYBENCH_GEMM : public KernelBase void defineSeqVariantTunings(); void defineOpenMPVariantTunings(); void defineOpenMPTargetVariantTunings(); + void defineKokkosVariantTunings(); void defineCudaVariantTunings(); void defineHipVariantTunings(); void defineSyclVariantTunings(); @@ -111,6 +112,7 @@ class POLYBENCH_GEMM : public KernelBase void runSeqVariant(VariantID vid); void runOpenMPVariant(VariantID vid); void runOpenMPTargetVariant(VariantID vid); + void runKokkosVariant(VariantID vid); template < size_t block_size > void runCudaVariantImpl(VariantID vid);