@@ -47,10 +47,12 @@ option( BUILD_SHARED_LIBS "" OFF )
4747
4848option ( ENABLE_CALIPER "" ON )
4949option ( ENABLE_HYPRE "" ON )
50- option ( ENABLE_TRILINOS "" ON )
50+ option ( ENABLE_TRILINOS "" OFF )
5151option ( ENABLE_PETSC "" OFF )
5252option ( ENABLE_SCOTCH "" ON )
5353option ( ENABLE_SUITESPARSE "" ON )
54+ option ( ENABLE_SUPERLU_DIST "" ON )
55+ option ( ENABLE_HYPRE_GPU_PROFILING "" OFF )
5456option ( ENABLE_VTK "" ON )
5557option ( ENABLE_VTK_WRAP_PYTHON "" OFF )
5658
@@ -125,6 +127,50 @@ else( TRUE )
125127endif ()
126128
127129
130+ ################################
131+ # HIP / ROCm
132+ ################################
133+ if ( ENABLE_HIP )
134+ if ( NOT DEFINED ROCM_PATH )
135+ if ( DEFINED HIP_ROOT )
136+ set ( ROCM_PATH ${HIP_ROOT} )
137+ elseif ( DEFINED ENV{ROCM_PATH} )
138+ set ( ROCM_PATH $ENV{ROCM_PATH} )
139+ else ()
140+ message ( FATAL_ERROR "ENABLE_HIP is ON but neither ROCM_PATH nor HIP_ROOT is defined." )
141+ endif ()
142+ endif ()
143+
144+ if ( NOT DEFINED HIP_ROOT )
145+ set ( HIP_ROOT ${ROCM_PATH} )
146+ endif ()
147+
148+ if ( NOT DEFINED CMAKE_HIP_ARCHITECTURES )
149+ message ( FATAL_ERROR "ENABLE_HIP is ON but CMAKE_HIP_ARCHITECTURES is not defined (e.g. gfx90a, gfx942, gfx1100)." )
150+ endif ()
151+
152+ # hypre is configured outside of cmake, so it needs the MPI include directory explicitly
153+ # when its sources are compiled for the device.
154+ if ( ENABLE_MPI AND NOT DEFINED MPI_INCLUDE_DIR )
155+ if ( DEFINED ENV{MPICH_DIR} ) # set by the cray-mpich module on LC
156+ set ( MPI_INCLUDE_DIR "$ENV{MPICH_DIR} /include" )
157+ elseif ( DEFINED ENV{MPI_ROOT} )
158+ set ( MPI_INCLUDE_DIR "$ENV{MPI_ROOT} /include" )
159+ elseif ( MPI_C_INCLUDE_DIRS ) # set by find_package( MPI ) through BLT
160+ list ( GET MPI_C_INCLUDE_DIRS 0 MPI_INCLUDE_DIR )
161+ elseif ( MPI_C_COMPILER ) # <prefix>/bin/mpicc -> <prefix>/include
162+ get_filename_component ( MPI_BIN_DIR ${MPI_C_COMPILER} DIRECTORY )
163+ get_filename_component ( MPI_PREFIX_DIR ${MPI_BIN_DIR} DIRECTORY )
164+ set ( MPI_INCLUDE_DIR "${MPI_PREFIX_DIR} /include" )
165+ else ()
166+ message ( FATAL_ERROR "ENABLE_HIP is ON but MPI_INCLUDE_DIR is not defined and cannot be deduced." )
167+ endif ()
168+ message ( STATUS "MPI_INCLUDE_DIR = ${MPI_INCLUDE_DIR} " )
169+ endif ()
170+
171+ message ( STATUS "ROCM_PATH = ${ROCM_PATH} " )
172+ message ( STATUS "CMAKE_HIP_ARCHITECTURES = ${CMAKE_HIP_ARCHITECTURES} " )
173+ endif ()
128174
129175
130176################################
@@ -340,6 +386,13 @@ set(RAJA_URL "${TPL_MIRROR_DIR}/RAJA-v2025.12.0.tar.gz")
340386
341387message (STATUS "Building RAJA found at ${RAJA_URL} " )
342388
389+ # RAJA's vectorization layer does not compile with the ROCm toolchain.
390+ if ( ENABLE_HIP )
391+ set ( RAJA_ENABLE_VECTORIZATION OFF )
392+ else ()
393+ set ( RAJA_ENABLE_VECTORIZATION ON )
394+ endif ()
395+
343396ExternalProject_Add ( raja
344397 URL ${RAJA_URL}
345398 PREFIX ${PROJECT_BINARY_DIR } /raja
@@ -360,10 +413,18 @@ ExternalProject_Add( raja
360413 -D CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}
361414 -D CMAKE_CUDA_ARCHITECTURES:STRING=${CMAKE_CUDA_ARCHITECTURES}
362415 -D CMAKE_CUDA_FLAGS:STRING=${RAJA_CUDA_FLAGS}
416+ -D ENABLE_HIP:BOOL=${ENABLE_HIP}
417+ -D RAJA_ENABLE_HIP:BOOL=${ENABLE_HIP}
418+ -D CMAKE_HIP_COMPILER=${CMAKE_HIP_COMPILER}
419+ -D RAJA_ENABLE_VECTORIZATION:BOOL=${RAJA_ENABLE_VECTORIZATION}
420+ -D hip_DIR=${HIP_ROOT} /lib/cmake/hip
421+ -D ROCPRIM_DIR=${HIP_ROOT}
422+ -D CMAKE_HIP_ARCHITECTURES:STRING=${CMAKE_HIP_ARCHITECTURES}
363423 -D ENABLE_TESTS:BOOL=OFF
364424 -D ENABLE_EXAMPLES:BOOL=OFF
365425 -D ENABLE_OPENMP:BOOL=${ENABLE_OPENMP}
366426 -D CMAKE_INSTALL_PREFIX :PATH=<INSTALL_DIR >
427+ -D CMAKE_INSTALL_LIBDIR:PATH=lib
367428 -D BUILD_SHARED_LIBS =${BUILD_SHARED_LIBS }
368429 -D CMAKE_POSITION_INDEPENDENT_CODE =${CMAKE_POSITION_INDEPENDENT_CODE }
369430 )
@@ -398,8 +459,14 @@ ExternalProject_Add( chai
398459 -D CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}
399460 -D CMAKE_CUDA_ARCHITECTURES:STRING=${CMAKE_CUDA_ARCHITECTURES}
400461 -D CMAKE_CUDA_FLAGS:STRING=${CHAI_CUDA_FLAGS}
462+ -D ENABLE_HIP:BOOL=${ENABLE_HIP}
463+ -D CHAI_ENABLE_HIP:BOOL=${ENABLE_HIP}
464+ -D CMAKE_HIP_COMPILER=${CMAKE_HIP_COMPILER}
465+ -D hip_DIR=${HIP_ROOT} /lib/cmake/hip
466+ -D CMAKE_HIP_ARCHITECTURES:STRING=${CMAKE_HIP_ARCHITECTURES}
401467 -D ENABLE_OPENMP=${ENABLE_OPENMP}
402468 -D CMAKE_INSTALL_PREFIX :PATH=<INSTALL_DIR >
469+ -D CMAKE_INSTALL_LIBDIR:PATH=lib
403470 -D BUILD_SHARED_LIBS =${BUILD_SHARED_LIBS }
404471 -D ENABLE_TESTS=OFF
405472 -D ENABLE_BENCHMARKS=OFF
@@ -444,6 +511,7 @@ if (ENABLE_CALIPER)
444511 -D MPI_CXX_COMPILER:STRING=${MPI_CXX_COMPILER}
445512 -D CMAKE_POSITION_INDEPENDENT_CODE =${CMAKE_POSITION_INDEPENDENT_CODE }
446513 -D CMAKE_INSTALL_PREFIX :PATH=<INSTALL_DIR >
514+ -D CMAKE_INSTALL_LIBDIR:PATH=lib
447515 -D BLT_SOURCE_DIR =${BLT_SOURCE_DIR }
448516 )
449517
@@ -480,14 +548,23 @@ if (ENABLE_CALIPER)
480548 -D CUDA_TOOLKIT_ROOT_DIR:PATH=${CUDA_TOOLKIT_ROOT_DIR}
481549 -D CMAKE_POSITION_INDEPENDENT_CODE =${CMAKE_POSITION_INDEPENDENT_CODE }
482550 -D CMAKE_INSTALL_PREFIX :PATH=<INSTALL_DIR >
551+ -D CMAKE_INSTALL_LIBDIR:PATH=lib
483552 -D WITH_PAPI:BOOL=${ENABLE_PAPI}
484553 -D PAPI_PREFIX:STRING=${PAPI_PREFIX}
485554 -D WITH_ADIAK:BOOL=ON
486555 -D adiak_DIR:STRING=${ADIAK_DIR} /lib/cmake/adiak/
487556 -D WITH_CUPTI=${CALIPER_WITH_CUPTI}
488557 -D WITH_NVPROF=${ENABLE_CUDA}
558+ -D WITH_ROCM=${ENABLE_ROCTX}
559+ -D ROCM_PREFIX:PATH=${ROCM_PATH}
489560 )
490561
562+ if ( BUILD_SHARED_LIBS )
563+ set ( CALIPER_LIB "libcaliper.so" )
564+ else ()
565+ set ( CALIPER_LIB "libcaliper.a" )
566+ endif ()
567+
491568 list (APPEND build_list caliper adiak)
492569else ()
493570 set ( ENABLE_CALIPER_HYPRE OFF CACHE BOOL "" FORCE )
@@ -589,11 +666,6 @@ if (ENABLE_TRILINOS)
589666 -D TPL_MKL_LIBRARIES:STRING =${MKL_LIBRARIES} )
590667 endif ()
591668
592- if ( ENABLE_ESSL )
593- set ( TRILINOS_EXTRA_ARGS ${TRILINOS_EXTRA_ARGS}
594- -D HAVE_dggsvd3:BOOL =ON )
595- endif ()
596-
597669 if ( DEFINED OpenMP_Fortran_FLAGS )
598670 set ( TRILINOS_EXTRA_ARGS ${TRILINOS_EXTRA_ARGS}
599671 -D OpenMP_Fortran_FLAGS:STRING =${OpenMP_Fortran_FLAGS} )
@@ -737,7 +809,7 @@ list(APPEND build_list metis )
737809################################
738810# SUPERLU --
739811################################
740- if ( ENABLE_MPI )
812+ if ( ENABLE_MPI AND ENABLE_SUPERLU_DIST )
741813 set (SUPERLU_DIR "${CMAKE_INSTALL_PREFIX } /superlu_dist" )
742814 set (SUPERLU_URL "${TPL_MIRROR_DIR} /superlu_dist-0f6efc3.tar.gz" )
743815
@@ -784,6 +856,7 @@ if( ENABLE_MPI )
784856 -D CMAKE_Fortran_FLAGS_RELEASE=${CMAKE_Fortran_FLAGS_RELEASE}
785857 -D CMAKE_POSITION_INDEPENDENT_CODE =${CMAKE_POSITION_INDEPENDENT_CODE }
786858 -D CMAKE_INSTALL_PREFIX :PATH=<INSTALL_DIR >
859+ -D CMAKE_INSTALL_LIBDIR:PATH=lib
787860 -D enable_openmp=${ENABLE_OPENMP}
788861 )
789862
@@ -814,6 +887,9 @@ if( ENABLE_HYPRE )
814887 set ( HYPRE_C_COMPILER ${MPI_C_COMPILER} )
815888 set ( HYPRE_CXX_COMPILER ${MPI_CXX_COMPILER} )
816889 set ( HYPRE_Fortran_COMPILER ${MPI_Fortran_COMPILER} )
890+ endif ()
891+
892+ if ( ENABLE_MPI AND ENABLE_SUPERLU_DIST )
817893 set ( HYPRE_SUPERLU_LIBS "${SUPERLU_DIR} /lib/libsuperlu_dist.a ${PARMETIS_DIR} /lib/libparmetis.a ${METIS_DIR} /lib/libmetis.a -lstdc++" )
818894 if ( ENABLE_OPENMP )
819895 set ( HYPRE_SUPERLU_LIBS "${HYPRE_SUPERLU_LIBS} ${OpenMP_C_FLAGS} " ) # Sergey: why is this needed?
@@ -844,9 +920,41 @@ if( ENABLE_HYPRE )
844920--with-umpire-include=${CHAI_DIR} /include \
845921--with-umpire-lib-dirs=${CHAI_DIR} /lib \
846922--with-umpire-libs=umpire " )
923+
924+ if ( ENABLE_HYPRE_GPU_AWARE_MPI )
925+ set ( HYPRE_CUDA_FLAGS "${HYPRE_CUDA_FLAGS} --enable-gpu-aware-mpi" )
926+ endif ()
927+
928+ if ( ENABLE_HYPRE_GPU_PROFILING )
929+ set ( HYPRE_CUDA_FLAGS "${HYPRE_CUDA_FLAGS} --enable-gpu-profiling" )
930+ endif ()
847931 endif ()
848932 elseif ( ENABLE_HYPRE_DEVICE STREQUAL "HIP" )
849- message ( FATAL_ERROR "hip tpls build only supported through spack" )
933+ if ( NOT ENABLE_HIP )
934+ message ( FATAL_ERROR "Non-compatible options: HYPRE device cannot be set to HIP when ENABLE_HIP is OFF" )
935+ else ()
936+ list ( APPEND HYPRE_DEPENDS chai )
937+ set ( HYPRE_HIP_FLAGS "\
938+ ROCM_PATH=${ROCM_PATH} \
939+ --with-hip \
940+ --enable-rocblas \
941+ --enable-rocsparse \
942+ --enable-rocsolver \
943+ --with-gpu-arch=${CMAKE_HIP_ARCHITECTURES} \
944+ --with-umpire-device \
945+ --with-umpire-include=${CHAI_DIR} /include \
946+ --with-umpire-lib-dirs=${CHAI_DIR} /lib \
947+ --with-umpire-libs=\" umpire camp\" \
948+ --with-MPI-include=${MPI_INCLUDE_DIR} " )
949+
950+ if ( ENABLE_HYPRE_GPU_AWARE_MPI )
951+ set ( HYPRE_HIP_FLAGS "${HYPRE_HIP_FLAGS} --enable-gpu-aware-mpi" )
952+ endif ()
953+
954+ if ( ENABLE_HYPRE_GPU_PROFILING )
955+ set ( HYPRE_HIP_FLAGS "${HYPRE_HIP_FLAGS} --enable-gpu-profiling" )
956+ endif ()
957+ endif ()
850958 endif ()
851959
852960 if ( CMAKE_HOST_APPLE )
@@ -856,7 +964,7 @@ if( ENABLE_HYPRE )
856964 endif ()
857965
858966 if ( ENABLE_CALIPER_HYPRE )
859- set ( HYPRE_CALIPER_FLAGS "--with-caliper --with-caliper-include=\" ${CALIPER_DIR} /include\" --with-caliper-lib=\" ${CALIPER_DIR} /libs/caliper.a \" " )
967+ set ( HYPRE_CALIPER_FLAGS "--with-caliper --with-caliper-include=\" ${CALIPER_DIR} /include\" --with-caliper-lib=\" ${CALIPER_DIR} /lib/ ${CALIPER_LIB} \" " )
860968 list ( APPEND HYPRE_DEPENDS caliper )
861969 endif ()
862970
@@ -881,6 +989,7 @@ if( ENABLE_HYPRE )
881989 ${HYPRE_SUPERLU_FLAGS} \
882990 ${HYPRE_OPENMP_FLAG} \
883991 ${HYPRE_CUDA_FLAGS} \
992+ ${HYPRE_HIP_FLAGS} \
884993 ${HYPRE_CALIPER_FLAGS} \n " )
885994
886995 ExternalProject_Add ( hypre
0 commit comments