Skip to content

Commit b46fbb3

Browse files
committed
cmake: add cuda support
1 parent 0e3e60b commit b46fbb3

File tree

4 files changed

+121
-10
lines changed

4 files changed

+121
-10
lines changed

CMakeLists.txt

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,118 @@ endif()
99

1010
set(CMAKE_CXX_STANDARD 17)
1111

12-
add_library(amrexpr)
12+
if (NOT CMAKE_BUILD_TYPE)
13+
set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
14+
set(CMAKE_BUILD_TYPE Release
15+
CACHE STRING
16+
"Choose the build type, e.g. Release, Debug, or RelWithDebInfo." FORCE)
17+
endif()
18+
19+
option(ENABLE_CUDA "Enable CUDA support" OFF)
20+
if (ENABLE_CUDA)
21+
set(AMREXPR_USE_GPU 1)
22+
set(AMREXPR_USE_CUDA 1)
23+
find_package(CUDAToolkit REQUIRED)
24+
enable_language(CUDA)
25+
set(CMAKE_CUDA_STANDARD 17)
26+
endif()
27+
28+
option(ENABLE_HIP "Enable HIP support" OFF)
29+
if (ENABLE_HIP)
30+
set(AMREXPR_USE_GPU 1)
31+
set(AMREXPR_USE_HIP 1)
32+
find_package(hip REQUIRED)
33+
enable_language(HIP)
34+
set(CMAKE_HIP_STANDARD 17)
35+
endif()
36+
37+
option(ENABLE_SYCL "Enable SYCL support" OFF)
38+
if (ENABLE_SYCL)
39+
set(AMREXPR_USE_GPU 1)
40+
set(AMREXPR_USE_SYCL 1)
41+
set(CMAKE_CXX_COMPILER icpx)
42+
endif()
1343

44+
add_library(amrexpr)
1445
add_subdirectory(Src)
1546

1647
configure_file(${PROJECT_SOURCE_DIR}/Tools/CMake/amrexpr_Config.H.in
1748
${CMAKE_BINARY_DIR}/amrexpr_Config.H)
1849

19-
include_directories(${PROJECT_SOURCE_DIR}/Src ${CMAKE_BINARY_DIR})
50+
target_include_directories(amrexpr PUBLIC
51+
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/Src>
52+
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
53+
$<INSTALL_INTERFACE:include>)
2054

21-
install(TARGETS amrexpr)
55+
if (ENABLE_CUDA)
56+
get_target_property(_sources amrexpr SOURCES)
57+
list(FILTER _sources INCLUDE REGEX "\\.cpp$")
58+
set_source_files_properties(${_sources} PROPERTIES LANGUAGE CUDA)
59+
if (NOT DEFINED CUDA_ARCHITECTURES)
60+
message(STATUS "No CUDA architectures specified. Native will be used.")
61+
set_target_properties(amrexpr PROPERTIES CUDA_ARCHITECTURES native)
62+
endif()
63+
set_target_properties(amrexpr PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
64+
target_compile_options(amrexpr PRIVATE
65+
$<$<COMPILE_LANGUAGE:CUDA>:-m64>
66+
$<$<COMPILE_LANGUAGE:CUDA>:--expt-relaxed-constexpr>
67+
$<$<COMPILE_LANGUAGE:CUDA>:--expt-extended-lambda>
68+
$<$<COMPILE_LANGUAGE:CUDA>:--use_fast_math>)
69+
target_link_libraries(amrexpr PRIVATE CUDA::cudart)
70+
endif()
71+
72+
if (ENABLE_SYCL)
73+
target_compile_options(amrexpr PRIVATE -fsycl)
74+
endif()
75+
76+
install(TARGETS amrexpr EXPORT amrexprTargets)
2277

2378
install(DIRECTORY ${PROJECT_SOURCE_DIR}/Src/ DESTINATION include
24-
FILES_MATCHING PATTERN "*.hpp" PATTERN "*.H"
25-
)
79+
FILES_MATCHING PATTERN "*.hpp" PATTERN "*.H")
2680

2781
install(FILES ${CMAKE_BINARY_DIR}/amrexpr_Config.H DESTINATION include)
2882

83+
set(PACKAGE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
84+
set(PACKAGE_INCLUDE_INSTALL_DIR "include")
85+
86+
set(amrexpr_FIND_DEPENDENCIES "")
87+
if (ENABLE_CUDA)
88+
set(amrexpr_FIND_DEPENDENCIES "${amrexpr_FIND_DEPENDENCIES}\nfind_dependency(CUDAToolkit REQUIRED)")
89+
endif()
90+
if (ENABLE_HIP)
91+
set(amrexpr_FIND_DEPENDENCIES "${amrexpr_FIND_DEPENDENCIES}\nfind_dependency(hip REQUIRED)")
92+
endif()
93+
if (ENABLE_SYCL)
94+
# Adjust SYCL dependency find commands if necessary
95+
endif()
96+
97+
include(CMakePackageConfigHelpers)
98+
99+
write_basic_package_version_file(
100+
"${CMAKE_CURRENT_BINARY_DIR}/amrexprConfigVersion.cmake"
101+
VERSION ${PROJECT_VERSION}
102+
COMPATIBILITY AnyNewerVersion
103+
)
104+
105+
configure_package_config_file(
106+
"${CMAKE_CURRENT_SOURCE_DIR}/Tools/CMake/amrexprConfig.cmake.in"
107+
"${CMAKE_CURRENT_BINARY_DIR}/amrexprConfig.cmake"
108+
INSTALL_DESTINATION lib/cmake/amrexpr
109+
PATH_VARS PACKAGE_INCLUDE_INSTALL_DIR PACKAGE_INSTALL_PREFIX
110+
)
111+
112+
install(FILES
113+
"${CMAKE_CURRENT_BINARY_DIR}/amrexprConfig.cmake"
114+
"${CMAKE_CURRENT_BINARY_DIR}/amrexprConfigVersion.cmake"
115+
DESTINATION lib/cmake/amrexpr
116+
)
117+
118+
install(EXPORT amrexprTargets
119+
FILE amrexprTargets.cmake
120+
NAMESPACE amrexpr::
121+
DESTINATION lib/cmake/amrexpr
122+
)
123+
29124
# tests
30125
# enable_testing
31126
# add_subdirectory(Tests)

Tools/CMake/amrexprConfig.cmake.in

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
@PACKAGE_INIT@
2+
3+
include(CMakeFindDependencyMacro)
4+
5+
# Find dependencies if any
6+
@amrexpr_FIND_DEPENDENCIES@
7+
8+
include("@PACKAGE_INSTALL_PREFIX@/lib/cmake/amrexpr/amrexprTargets.cmake")
9+
10+
# Set the include directories
11+
set(amrexpr_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@")
12+
13+
# Provide the include directories to consumers
14+
set_target_properties(amrexpr::amrexpr PROPERTIES
15+
INTERFACE_INCLUDE_DIRECTORIES "${amrexpr_INCLUDE_DIRS}"
16+
)

Tools/CMake/amrexpr_Config.H.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#ifndef AMREXPR_CONFIG_H_
22
#define AMREXPR_CONFIG_H_
33

4-
#cmakedefine AMREX_USE_GPU
5-
#cmakedefine AMREX_USE_CUDA
6-
#cmakedefine AMREX_USE_HIP
7-
#cmakedefine AMREX_USE_SYCL
4+
#cmakedefine AMREXPR_USE_GPU
5+
#cmakedefine AMREXPR_USE_CUDA
6+
#cmakedefine AMREXPR_USE_HIP
7+
#cmakedefine AMREXPR_USE_SYCL
88

99
#endif /* AMREXPR_CONFIG_H_ */

Tools/GNUMake/comps/nvcc.mak

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ else
9797
NVCC_ARCH_LINK_FLAGS = $(NVCC_ARCH_FLAGS)
9898
endif
9999

100-
NVCC_FLAGS = -Wno-deprecated-gpu-targets -m64 -maxrregcount=$(CUDA_MAXREGCOUNT) --expt-relaxed-constexpr --expt-extended-lambda --forward-unknown-to-host-compiler
100+
NVCC_FLAGS = -Wno-deprecated-gpu-targets -m64 --expt-relaxed-constexpr --expt-extended-lambda --forward-unknown-to-host-compiler
101101
# This is to work around a bug with nvcc, see: https://github.com/kokkos/kokkos/issues/1473
102102
NVCC_FLAGS += -Xcudafe --diag_suppress=esa_on_defaulted_function_ignored
103103
# and another bug related to implicit returns with if constexpr, see: https://stackoverflow.com/questions/64523302/cuda-missing-return-statement-at-end-of-non-void-function-in-constexpr-if-fun

0 commit comments

Comments
 (0)