Skip to content

Commit

Permalink
Get Tpetra build working on HIP
Browse files Browse the repository at this point in the history
- Added explicit instantiation file for FixedHashTable
- Use HIP/HIPHostPinnedSpace as the KokkosHIPWrapperNode in Tpetra only
  (no kokkos changes)
- Fix device types in several places to work when the desired device
  memory space isn't the default of the execution space
- Disabled 3 tests that crash AMD GPUs
  • Loading branch information
brian-kelley committed Mar 30, 2021
1 parent 4580345 commit 21ce2cc
Show file tree
Hide file tree
Showing 9 changed files with 154 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace Kokkos {

#ifdef KOKKOS_ENABLE_HIP
template<>
std::string KokkosDeviceWrapperNode<Kokkos::Experimental::HIP>::name() {
std::string KokkosDeviceWrapperNode<Kokkos::Experimental::HIP, Kokkos::Experimental::HIPHostPinnedSpace>::name() {
return std::string("HIP/Wrapper");
}
#endif // KOKKOS_ENABLE_HIP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class KokkosDeviceWrapperNode {
};

#ifdef KOKKOS_ENABLE_HIP
typedef KokkosDeviceWrapperNode<Kokkos::Experimental::HIP> KokkosHIPWrapperNode;
typedef KokkosDeviceWrapperNode<Kokkos::Experimental::HIP, Kokkos::Experimental::HIPHostPinnedSpace> KokkosHIPWrapperNode;
#endif

#ifdef KOKKOS_ENABLE_CUDA
Expand Down
45 changes: 31 additions & 14 deletions packages/tpetra/core/src/Tpetra_Details_DefaultTypes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,37 +86,54 @@ namespace DefaultTypes {
#endif

/// \typedef execution_space
/// \brief Default Tpetra execution space.
/// \brief Default Tpetra execution space and Node type.
#if defined(HAVE_TPETRA_DEFAULTNODE_HIPWRAPPERNODE)
using execution_space = ::Kokkos::Experimental::HIP;
using node_type = ::Kokkos::Compat::KokkosHIPWrapperNode;
#elif defined(HAVE_TPETRA_DEFAULTNODE_CUDAWRAPPERNODE)
using execution_space = ::Kokkos::Cuda;
using node_type = ::Kokkos::Compat::KokkosCudaWrapperNode;
#elif defined(HAVE_TPETRA_DEFAULTNODE_OPENMPWRAPPERNODE)
using execution_space = ::Kokkos::OpenMP;
using node_type = ::Kokkos::Compat::KokkosOpenMPWrapperNode;
#elif defined(HAVE_TPETRA_DEFAULTNODE_THREADSWRAPPERNODE)
using execution_space = ::Kokkos::Threads;
using node_type = ::Kokkos::Compat::KokkosThreadsWrapperNode;
#elif defined(HAVE_TPETRA_DEFAULTNODE_SERIALWRAPPERNODE)
using execution_space = ::Kokkos::Serial;
using node_type = ::Kokkos::Compat::KokkosSerialWrapperNode;
#else
# error "No default Tpetra Node type specified. Please set the CMake option Tpetra_DefaultNode to a valid Node type."
#endif

//! Default value of Node template parameter.
using node_type = ::Kokkos::Compat::KokkosDeviceWrapperNode<execution_space>;

/// \brief Memory space used for MPI communication buffers.
///
/// See #1088 for why this is not just ExecutionSpace::memory_space.
template<class ExecutionSpace>
using comm_buffer_memory_space =
/// See #1088 for why this is not just ExecutionSpace::memory_space

template<typename ExecutionSpace>
struct CommBufferMemorySpace
{
using type = typename ExecutionSpace::memory_space;
};

#ifdef KOKKOS_ENABLE_CUDA
typename std::conditional<
std::is_same<typename ExecutionSpace::execution_space, Kokkos::Cuda>::value,
Kokkos::CudaSpace,
typename ExecutionSpace::memory_space>::type;
#else
typename ExecutionSpace::memory_space;
#endif // KOKKOS_ENABLE_CUDA
template<>
struct CommBufferMemorySpace<Kokkos::Cuda>
{
using type = Kokkos::CudaSpace;
};
#endif

#ifdef KOKKOS_ENABLE_HIP
template<>
struct CommBufferMemorySpace<Kokkos::Experimental::HIPHostPinnedSpace>
{
using type = Kokkos::Experimental::HIPHostPinnedSpace;
};
#endif

template<typename ExecutionSpace>
using comm_buffer_memory_space = typename CommBufferMemorySpace<ExecutionSpace>::type;

} // namespace DefaultTypes

Expand Down
86 changes: 86 additions & 0 deletions packages/tpetra/core/src/Tpetra_Details_FixedHashTable_HIP.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
// @HEADER
// ***********************************************************************
//
// Tpetra: Templated Linear Algebra Services Package
// Copyright (2008) Sandia Corporation
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the Corporation nor the names of the
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Questions? Contact Michael A. Heroux ([email protected])
//
// ************************************************************************
// @HEADER
*/

#include "Tpetra_Details_FixedHashTable_decl.hpp"

#if defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) && defined(KOKKOS_ENABLE_HIP)

#include "TpetraCore_ETIHelperMacros.h"
#include "Tpetra_Details_FixedHashTable_def.hpp"

namespace Tpetra {
namespace Details {

TPETRA_ETI_MANGLING_TYPEDEFS()

using hip_device_type = typename Kokkos::Compat::KokkosHIPWrapperNode::device_type;

#define TPETRA_DETAILS_FIXEDHASHTABLE_INSTANT_HIP( LO, GO ) \
TPETRA_DETAILS_FIXEDHASHTABLE_INSTANT( LO, GO, hip_device_type )

TPETRA_INSTANTIATE_LG( TPETRA_DETAILS_FIXEDHASHTABLE_INSTANT_HIP)

// mfh 26 Sep 2015: Make sure that the {KeyType = LO, ValueType =
// LO} and {KeyType = int, ValueType = LO} specializations get
// built, since Directory needs them.

// KeyType = int doesn't get built if GO = int is disabled.
#ifndef HAVE_TPETRA_INST_INT_INT
# define TPETRA_DETAILS_FIXEDHASHTABLE_INSTANT_HIP_INT( LO ) \
TPETRA_DETAILS_FIXEDHASHTABLE_INSTANT( LO, int, hip_device_type ) \

TPETRA_INSTANTIATE_L( TPETRA_DETAILS_FIXEDHASHTABLE_INSTANT_HIP_INT)

// FIXME (mfh 26 Sep 2015) Once it becomes possible to disable LO =
// int, add an instantiation here for {KeyType = LO, ValueType =
// LO}. However, this case has likely already been covered above,
// since disabling LO = int leaves LO = GO = long or long long as
// the most reasonable options. (It would be silly to use LO = long
// and GO = long long if sizeof(long) = sizeof(long long).)

#endif // HAVE_TPETRA_INST_INT_INT

} // namespace Details
} // namespace Tpetra

#endif // defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) && defined(KOKKOS_ENABLE_HIP)
3 changes: 2 additions & 1 deletion packages/tpetra/core/test/CrsMatrix/Bug8447.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CrsMatrix, Bug8447, SC, LO, GO, NT)
typedef Tpetra::CrsMatrix<SC,LO,GO,NT> CrsMatrixType;
typedef typename CrsMatrixType::impl_scalar_type implScalarType;
typedef typename CrsMatrixType::local_matrix_type lclMatrixType;
typedef typename lclMatrixType::size_type size_type;

RCP<const Comm<int> > comm = getDefaultComm();
TEUCHOS_TEST_FOR_EXCEPTION(
Expand All @@ -82,7 +83,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CrsMatrix, Bug8447, SC, LO, GO, NT)
const int myPID = comm->getRank();

std::vector<GO> globalIDs, globalIDs2;
std::vector<LO> rowptr;
std::vector<size_type> rowptr;
std::vector<LO> indices;
std::vector<implScalarType> values;
const SC ONE = Teuchos::ScalarTraits<implScalarType>::one ();
Expand Down
19 changes: 11 additions & 8 deletions packages/tpetra/core/test/CrsMatrix/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,17 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST(
STANDARD_PASS_OUTPUT
)

TRIBITS_ADD_EXECUTABLE_AND_TEST(
CrsMatrix_2DRandomDist
SOURCES
CrsMatrix_2DRandomDist.cpp
COMM serial mpi
PASS_REGULAR_EXPRESSION "PASS"
FAIL_REGULAR_EXPRESSION "FAIL"
)
IF(NOT Tpetra_INST_HIP)
# This test causes AMD MI25 to permanently crash (until reboot)
TRIBITS_ADD_EXECUTABLE_AND_TEST(
CrsMatrix_2DRandomDist
SOURCES
CrsMatrix_2DRandomDist.cpp
COMM serial mpi
PASS_REGULAR_EXPRESSION "PASS"
FAIL_REGULAR_EXPRESSION "FAIL"
)
ENDIF()

# We split the CrsMatrix_WithGraph test by execution space.
# This speeds up the build.
Expand Down
18 changes: 10 additions & 8 deletions packages/tpetra/core/test/ImportExport/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,16 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST(
STANDARD_PASS_OUTPUT
)

TRIBITS_ADD_EXECUTABLE_AND_TEST(
UnpackLongRows
SOURCES
UnpackLongRows.cpp
COMM mpi
NUM_MPI_PROCS 4
STANDARD_PASS_OUTPUT
)
IF(NOT Tpetra_INST_HIP)
TRIBITS_ADD_EXECUTABLE_AND_TEST(
UnpackLongRows
SOURCES
UnpackLongRows.cpp
COMM mpi
NUM_MPI_PROCS 4
STANDARD_PASS_OUTPUT
)
ENDIF()

IF (${PROJECT_NAME}_ENABLE_Epetra)
IF(NOT Trilinos_NO_32BIT_GLOBAL_INDICES AND Tpetra_INST_INT_INT)
Expand Down
20 changes: 11 additions & 9 deletions packages/tpetra/core/test/ImportExport2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
TRIBITS_ADD_EXECUTABLE_AND_TEST(
ImportExport2_UnitTests
SOURCES
ImportExport2_UnitTests.cpp
${TEUCHOS_STD_UNIT_TEST_MAIN}
COMM serial mpi
ARGS "--globally-reduce-test-result --output-show-proc-rank --output-to-root-rank-only=-1"
STANDARD_PASS_OUTPUT
)
IF(NOT Tpetra_INST_HIP)
TRIBITS_ADD_EXECUTABLE_AND_TEST(
ImportExport2_UnitTests
SOURCES
ImportExport2_UnitTests.cpp
${TEUCHOS_STD_UNIT_TEST_MAIN}
COMM serial mpi
ARGS "--globally-reduce-test-result --output-show-proc-rank --output-to-root-rank-only=-1"
STANDARD_PASS_OUTPUT
)
ENDIF()

TRIBITS_ADD_EXECUTABLE_AND_TEST(
ImportExport2_CrsSortingUtils
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1960,7 +1960,7 @@ RCP<Tpetra::CrsMatrix<SC, LO, GO, NT>> getUnsortedTestMatrix(
size_type numEntries = 0;
for(LO i = 0; i < numLocalRows; i++)
numEntries += entriesPerRow[i];
Array<lno_t> rowptrs(numLocalRows + 1);
Array<size_type> rowptrs(numLocalRows + 1);
Array<lno_t> colinds(numEntries);
Array<kk_scalar_t> values(numEntries);
size_type accum = 0;
Expand Down

0 comments on commit 21ce2cc

Please sign in to comment.