Skip to content

Commit a3680d1

Browse files
authored
Merge pull request #489 from eagles-project/mjs/generalize_4_HIP
Modify CMake config to work with HIP
2 parents 02a4a4c + ab20ac4 commit a3680d1

File tree

5 files changed

+68
-33
lines changed

5 files changed

+68
-33
lines changed

CMakeLists.txt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,26 @@ if (NOT HAERO_ENABLE_GPU AND NOT APPLE)
170170
endif()
171171
endif()
172172

173+
set(HAERO_AMD_GPU FALSE)
174+
# NOTE: this is hacky, but done as a result of not knowing what the
175+
# Kokkos_ARCH_$DEVICE_ARCH variable will be named
176+
if ("${HAERO_DEVICE_ARCH}" MATCHES "AMD")
177+
set(HAERO_AMD_GPU 1)
178+
endif()
179+
173180
# Other third-party libraries.
174181
add_subdirectory(ext)
175182

176183
# If we're building on a GPU, set the C++ compiler appropriately.
177184
if (HAERO_ENABLE_GPU)
178-
set(CMAKE_CXX_COMPILER ${EKAT_NVCC_WRAPPER})
179-
# the esa_on_defaulted_function_ignored supresses a warning about KOKKOS markups of defaulted constructors/destructors
180-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --expt-extended-lambda --expt-relaxed-constexpr -Xcudafe --diag_suppress=esa_on_defaulted_function_ignored")
185+
if (HAERO_AMD_GPU)
186+
set(CMAKE_CXX_COMPILER "hipcc")
187+
set(CMAKE_CXX_FAGS "${CMAKE_CXX_FLAGS} --nocudalib --nocudainc")
188+
else()
189+
set(CMAKE_CXX_COMPILER ${EKAT_NVCC_WRAPPER})
190+
# the esa_on_defaulted_function_ignored supresses a warning about KOKKOS markups of defaulted constructors/destructors
191+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --expt-extended-lambda --expt-relaxed-constexpr -Xcudafe --diag_suppress=esa_on_defaulted_function_ignored")
192+
endif()
181193
# Avoid buggy experimental Kokkos CUDA stuff.
182194
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DKokkos_CXX_STANDARD=C++17")
183195
endif()

cmake/haero.cmake.in

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ set(HAERO_ENABLE_GPU @HAERO_ENABLE_GPU@)
1616

1717
# C++ compiler settings
1818
set(HAERO_CXX_STANDARD @CMAKE_CXX_STANDARD@)
19-
if (HAERO_ENABLE_GPU)
20-
set(HAERO_CXX_COMPILER @CMAKE_INSTALL_PREFIX@/bin/nvcc_wrapper)
21-
else()
22-
set(HAERO_CXX_COMPILER @CMAKE_CXX_COMPILER@)
23-
endif()
2419
set(HAERO_CXX_FLAGS "@CMAKE_CXX_FLAGS@ -DOMPI_SKIP_MPICXX -DMPICH_SKIP_MPICXX")
2520

2621
# C compiler settings
@@ -45,8 +40,12 @@ add_library(kokkos INTERFACE)
4540
target_link_libraries(kokkos INTERFACE kokkoscontainers kokkoscore)
4641

4742
if (HAERO_ENABLE_GPU)
48-
# FIXME: this assumes an NVIDIA GPU!
49-
set(HAERO_LIBRARIES @HAERO_LIBRARIES@;kokkos;cuda;m)
43+
if (HAERO_AMD_GPU)
44+
set(HAERO_LIBRARIES @HAERO_LIBRARIES@;kokkos;rocm;m)
45+
else()
46+
set(HAERO_LIBRARIES @HAERO_LIBRARIES@;kokkos;cuda;m)
47+
endif()
5048
else()
49+
set(HAERO_CXX_COMPILER @CMAKE_CXX_COMPILER@)
5150
set(HAERO_LIBRARIES @HAERO_LIBRARIES@;kokkos;m)
5251
endif()

ext/CMakeLists.txt

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ if (HAERO_BUILDS_EKAT)
2020
include(EkatBuildEkat)
2121
set(EKAT_ENABLE_MPI ${HAERO_ENABLE_MPI} CACHE BOOL "Enable MPI")
2222
set(EKAT_ENABLE_FORTRAN OFF CACHE BOOL "Enable EKAT Fortran support")
23-
set(EKAT_ENABLE_TESTS OFF CACHE BOOL "Disable EKAT tests")
24-
set(Kokkos_ENABLE_LIBDL OFF CACHE BOOL "Disable broken Kokkos libdl support")
25-
set(Kokkos_ENABLE_DEPRECATED_CODE_3 OFF CACHE BOOL "Disable deprecated code to avoid warnings of using deprecated functions.")
23+
set(EKAT_ENABLE_TESTS OFF CACHE BOOL "Enable EKAT tests")
24+
set(Kokkos_ENABLE_LIBDL OFF CACHE BOOL "Enable broken Kokkos libdl support")
25+
set(Kokkos_ENABLE_DEPRECATED_CODE_3 OFF CACHE BOOL "Enable deprecated code to avoid warnings of using deprecated functions.")
2626
if (HAERO_SKIP_FIND_YAML_CPP)
2727
set(EKAT_SKIP_FIND_YAML_CPP ON CACHE BOOL "EKAT will build yaml-cpp ")
2828
message(STATUS "SKIP FIND YAML CPP")
@@ -43,18 +43,27 @@ if (HAERO_BUILDS_EKAT)
4343
set(EKAT_ENABLE_FPE OFF CACHE BOOL "")
4444
endif()
4545
if (HAERO_ENABLE_GPU)
46+
if (HAERO_AMD_GPU)
47+
set(Kokkos_ENABLE_HIP ON CACHE BOOL "Enable HIP Kokkos backend")
48+
else()
49+
set(Kokkos_ENABLE_CUDA ON CACHE BOOL "Enable CUDA Kokkos backend")
50+
set(Kokkos_ENABLE_CUDA_LAMBDA ON CACHE BOOL "Enable CUDA lambdas")
51+
set(EKAT_NVCC_WRAPPER ${CMAKE_BINARY_DIR}/bin/nvcc_wrapper)
52+
set(EKAT_NVCC_WRAPPER ${EKAT_NVCC_WRAPPER} PARENT_SCOPE)
53+
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/ekat/extern/kokkos/bin/nvcc_wrapper
54+
DESTINATION ${CMAKE_BINARY_DIR}/bin)
55+
endif()
4656
set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "Enable serial Kokkos backend")
47-
set(Kokkos_ENABLE_CUDA ON CACHE BOOL "Enable CUDA Kokkos backend")
48-
set(Kokkos_ENABLE_CUDA_LAMBDA ON CACHE BOOL "Enable CUDA lambdas")
4957
else()
5058
set(Kokkos_ENABLE_SERIAL ON CACHE BOOL "Enable serial Kokkos backend")
51-
set(Kokkos_ENABLE_CUDA OFF CACHE BOOL "Disable CUDA Kokkos backend")
59+
set(Kokkos_ENABLE_CUDA OFF CACHE BOOL "Enable CUDA Kokkos backend")
60+
set(Kokkos_ENABLE_HIP OFF CACHE BOOL "Enable HIP Kokkos backend")
5261
if (OPENMP_FOUND)
5362
message(STATUS "OpenMP is enabled")
5463
set(Kokkos_ENABLE_OPENMP ON CACHE BOOL "Enable OpenMP Kokkos backend")
5564
else()
5665
message(STATUS "OpenMP is not supported. Using threads backend instead.")
57-
set(Kokkos_ENABLE_OPENMP OFF CACHE BOOL "Disable OpenMP Kokkos backend")
66+
set(Kokkos_ENABLE_OPENMP OFF CACHE BOOL "Enable OpenMP Kokkos backend")
5867
set(Kokkos_ENABLE_PTHREAD ON CACHE BOOL "Enable pthreads Kokkos backend")
5968
endif()
6069
endif()
@@ -68,8 +77,6 @@ if (HAERO_BUILDS_EKAT)
6877
${PROJECT_BINARY_DIR}/externals/kokkos
6978
${CMAKE_CURRENT_SOURCE_DIR}/ekat/extern/spdlog/include
7079
${CMAKE_CURRENT_SOURCE_DIR}/ekat/extern/yaml-cpp/include)
71-
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/ekat/extern/kokkos/bin/nvcc_wrapper
72-
DESTINATION ${CMAKE_BINARY_DIR}/bin)
7380
if (NOT TARGET yaml-cpp)
7481
add_library(yaml-cpp STATIC IMPORTED GLOBAL)
7582
if (CMAKE_BUILD_TYPE MATCHES "Debug")
@@ -91,8 +98,6 @@ if (HAERO_BUILDS_EKAT)
9198
endif()
9299
endif()
93100
endif()
94-
set(EKAT_NVCC_WRAPPER ${CMAKE_BINARY_DIR}/bin/nvcc_wrapper)
95-
set(EKAT_NVCC_WRAPPER ${EKAT_NVCC_WRAPPER} PARENT_SCOPE)
96101

97102
add_library(ext_libraries INTERFACE)
98103
target_link_libraries (ext_libraries INTERFACE ekat;${HAERO_EXT_LIBRARIES})
@@ -108,4 +113,3 @@ set(HAERO_EXT_INCLUDE_DIRS ${HAERO_EXT_INCLUDE_DIRS} PARENT_SCOPE)
108113

109114
install(DIRECTORY ${PROJECT_BINARY_DIR}/include/ DESTINATION include)
110115
install(DIRECTORY ${PROJECT_BINARY_DIR}/bin/ DESTINATION bin)
111-

haero/CMakeLists.txt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,16 @@ target_include_directories(haero PUBLIC
4444
$<INSTALL_INTERFACE:include>
4545
)
4646
target_link_libraries(haero PUBLIC ext_libraries)
47-
target_compile_options(haero PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${KOKKOS_CUDA_OPTIONS}>)
48-
if(CMAKE_COMPILER_IS_GNUCXX AND HAERO_STANDALONE)
49-
MESSAGE(STATUS "Using GNU compiler, turning on warnings are errors....")
50-
target_compile_options(haero PRIVATE -Werror)
47+
if (HAERO_ENABLE_GPU)
48+
if (HAERO_AMD_GPU)
49+
# Nothing... yet
50+
else()
51+
target_compile_options(haero PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${KOKKOS_CUDA_OPTIONS}>)
52+
endif()
53+
if(CMAKE_COMPILER_IS_GNUCXX AND HAERO_STANDALONE)
54+
MESSAGE(STATUS "Using GNU compiler, turning on warnings are errors....")
55+
target_compile_options(haero PRIVATE -Werror)
56+
endif()
5157
endif()
5258
set(HAERO_LIBRARIES haero;${HAERO_LIBRARIES})
5359
set(HAERO_LIBRARIES haero;${HAERO_LIBRARIES} PARENT_SCOPE)
@@ -73,4 +79,3 @@ install(FILES aero_process.hpp
7379
utils.hpp
7480
root_finders.hpp
7581
DESTINATION include/haero)
76-

setup

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ ENABLE_GPU=OFF
6969
7070
# OPTIONAL: Select one of the following device architectures based on the above.
7171
# (These options are taken from kokkos_arch.cmake)
72+
# Source in docs (incomplete list here):
73+
# https://kokkos.org/kokkos-core-wiki/get-started/configuration-guide.html
7274
#DEVICE_ARCH=AMDAVX # AMD CPU
7375
#DEVICE_ARCH=ARMV80 # ARMv8.0 Compatible CPU
7476
#DEVICE_ARCH=ARMV81 # ARMv8.1 Compatible CPU
@@ -106,10 +108,15 @@ ENABLE_GPU=OFF
106108
#DEVICE_ARCH=TURING75 # NVIDIA Turing generation CC 7.5 (CUDA)
107109
#DEVICE_ARCH=AMPERE80 # NVIDIA Ampere generation CC 8.0 (CUDA)
108110
#DEVICE_ARCH=AMPERE86 # NVIDIA Ampere generation CC 8.6 (CUDA)
109-
#DEVICE_ARCH=VEGA900 # AMD GPU MI25 GFX900 (HIP)
110-
#DEVICE_ARCH=VEGA906 # AMD GPU MI50/MI60 GFX906 (HIP)
111-
#DEVICE_ARCH=VEGA908 # AMD GPU (HIP)
112-
#DEVICE_ARCH=VEGA90A # AMD GPU MI200 GFX90A (HIP)
111+
#DEVICE_ARCH=AMD_GFX942_APU # MI300A
112+
#DEVICE_ARCH=AMD_GFX942 # MI300A, MI300X
113+
#DEVICE_ARCH=AMD_GFX940 # MI300A (pre-production--not sure on meaning)
114+
#DEVICE_ARCH=AMD_GFX90A # MI200 series
115+
#DEVICE_ARCH=AMD_GFX908 # MI100
116+
#DEVICE_ARCH=AMD_GFX906 # MI50, MI60
117+
#DEVICE_ARCH=AMD_GFX1103 # Ryzen 8000G Phoenix series APU
118+
#DEVICE_ARCH=AMD_GFX1100 # 7900xt
119+
#DEVICE_ARCH=AMD_GFX1030 # V620, W6800
113120
#DEVICE_ARCH=INTEL_GEN # Intel GPUs (SPIR64-based devices)
114121
#DEVICE_ARCH=INTEL_DG1 # Intel Iris XeMAX GPU
115122
#DEVICE_ARCH=INTEL_GEN9 # Intel GPU Gen9
@@ -142,6 +149,14 @@ PRECISION=double
142149
CXX=c++
143150
CC=cc
144151
152+
# NVIDIA GPU + gcc
153+
# CXX=[PATH]/nvcc_wrapper
154+
# CC=gcc
155+
156+
# AMD GPU
157+
# CXX=hipcc
158+
# CC=amdclang
159+
145160
# Override compilers here (ONLY if you know what you're doing!).
146161
147162
# C++ compiler.
@@ -159,7 +174,7 @@ pushd "\$SOURCE_DIR"/machines >& /dev/null
159174
for MACHINE_FILE in \$(ls)
160175
do
161176
MACHINE=\${MACHINE_FILE/\.sh/}
162-
echo \`hostname\` | grep -q "\$MACHINE"
177+
echo \`hostname\` | grep -q "\$MACHINE"
163178
host_match=\$?
164179
echo \$SYSTEM_NAME | grep -q "\$MACHINE"
165180
sys_match=\$?
@@ -193,6 +208,7 @@ fi
193208
# Set the device architecture if needed.
194209
if [ ! "\$DEVICE_ARCH" = "" ]; then
195210
OPTIONS="\$OPTIONS -DKokkos_ARCH_\$DEVICE_ARCH:BOOL=ON"
211+
OPTIONS="\$OPTIONS -DHAERO_DEVICE_ARCH=\$DEVICE_ARCH"
196212
fi
197213
198214
# Configure ekat if needed.
@@ -241,4 +257,3 @@ echo " 1. cd $1"
241257
echo " 2. Edit config.sh"
242258
echo " 3. source config.sh"
243259
echo " 4. Build using 'make -j'."
244-

0 commit comments

Comments
 (0)