@@ -9,12 +9,24 @@ option( BUILD_UNITY "enables unity build for faster compile times" ON )
99option ( BUILD_CODE_COV "enables compiler option required for code coverage analysis" OFF )
1010option ( BUILD_ML "enables build with tensorflow backend access" OFF )
1111option ( BUILD_MPI "enables build with MPI access" OFF )
12+ option ( BUILD_CUDA_HPC "enables CUDA backend for SN HPC solver (single GPU)" OFF )
1213#################################################
1314
1415
1516### COMPILER ####################################
1617set ( CMAKE_CXX_STANDARD 17 )
1718set ( CMAKE_CXX_STANDARD_REQUIRED ON )
19+ if ( BUILD_CUDA_HPC )
20+ enable_language ( CUDA )
21+ if ( CMAKE_VERSION VERSION_LESS 3.18 )
22+ # CMake 3.16 does not ship CUDA17 mappings by default.
23+ set ( CMAKE_CUDA17_STANDARD_COMPILE_OPTION "--std=c++17" )
24+ set ( CMAKE_CUDA17_EXTENSION_COMPILE_OPTION "--std=c++17" )
25+ endif ()
26+ set ( CMAKE_CUDA_STANDARD 17 )
27+ set ( CMAKE_CUDA_STANDARD_REQUIRED ON )
28+ set ( CMAKE_CUDA_EXTENSIONS OFF )
29+ endif ()
1830set ( KITRT_RELEASE_OPTIONS -march=native -w )
1931set ( KITRT_RELWITHDEBINFO_OPTIONS -march=native -pg -no -pie )
2032set ( KITRT_DEBUG_OPTIONS -Wall -Wextra -Wpedantic )
@@ -30,6 +42,21 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
3042
3143find_package ( OpenMP REQUIRED )
3244
45+ if ( BUILD_CUDA_HPC )
46+ add_compile_definitions ( KITRT_ENABLE_CUDA_HPC )
47+ if ( CMAKE_VERSION VERSION_GREATER_EQUAL 3.17 )
48+ find_package ( CUDAToolkit QUIET )
49+ endif ()
50+ if ( DEFINED CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES )
51+ include_directories ( ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} )
52+ elseif ( EXISTS "/usr/local/cuda/include" )
53+ include_directories ( /usr/local/cuda/include )
54+ endif ()
55+ message ( STATUS "CUDA HPC solver: enabled" )
56+ else ()
57+ message ( STATUS "CUDA HPC solver: disabled" )
58+ endif ()
59+
3360message (STATUS "MPI build flag: ${BUILD_MPI} " )
3461if ( BUILD_MPI )
3562 add_definitions (-DIMPORT_MPI )
@@ -72,6 +99,20 @@ else()
7299 set ( CORE_LIBRARIES ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} ${VTK_LIBRARIES} OpenMP::OpenMP_CXX -lstdc++fs )
73100endif ()
74101
102+ if ( BUILD_CUDA_HPC )
103+ if ( TARGET CUDA::cudart )
104+ list ( APPEND CORE_LIBRARIES CUDA::cudart )
105+ else ()
106+ find_library ( CUDART_LIBRARY
107+ NAMES cudart
108+ HINTS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES} /usr/local/cuda/lib64 /usr/lib/x86_64-linux-gnu )
109+ if ( NOT CUDART_LIBRARY )
110+ message ( FATAL_ERROR "Could not find CUDA runtime library (cudart)." )
111+ endif ()
112+ list ( APPEND CORE_LIBRARIES ${CUDART_LIBRARY} )
113+ endif ()
114+ endif ()
115+
75116
76117#################################################
77118
@@ -89,6 +130,12 @@ add_compile_definitions( GIT_HASH="${GIT_HASH}" )
89130
90131### BUILD KIT-RT ################################
91132file ( GLOB_RECURSE SRCS RELATIVE ${CMAKE_SOURCE_DIR } "src/*.cpp" "include/*.h" )
133+ if ( BUILD_CUDA_HPC )
134+ list ( APPEND SRCS "src/solvers/snsolver_hpc.cu" "include/solvers/snsolver_hpc_cuda.hpp" )
135+ # Force nvcc to parse this translation unit as C++17 even if transitive
136+ # imported target features inject an older fallback standard.
137+ set_source_files_properties ( src/solvers/snsolver_hpc.cu PROPERTIES COMPILE_FLAGS "--std=c++17" )
138+ endif ()
92139set ( EXCLUDE_DIR "/gui/" )
93140foreach ( TMP_PATH ${SRCS} )
94141 string ( FIND ${TMP_PATH} ${EXCLUDE_DIR} EXCLUDE_DIR_FOUND )
@@ -110,9 +157,15 @@ if( BUILD_ML )
110157 target_link_libraries ( ${CMAKE_PROJECT_NAME } ${CORE_LIBRARIES} ${TENSORFLOW_LIB} )
111158endif ()
112159target_link_libraries ( ${CMAKE_PROJECT_NAME } ${CORE_LIBRARIES} )
113- target_compile_options ( ${CMAKE_PROJECT_NAME } PUBLIC "$<$<CONFIG :DEBUG >:${KITRT_DEBUG_OPTIONS} >" )
114- target_compile_options ( ${CMAKE_PROJECT_NAME } PUBLIC "$<$<CONFIG :RELWITHDEBINFO >:${KITRT_RELWITHDEBINFO_OPTIONS} >" )
115- target_compile_options ( ${CMAKE_PROJECT_NAME } PUBLIC "$<$<CONFIG :RELEASE >:${KITRT_RELEASE_OPTIONS} >" )
160+ if ( BUILD_CUDA_HPC )
161+ set_target_properties (
162+ ${CMAKE_PROJECT_NAME }
163+ PROPERTIES CUDA_STANDARD 17 CUDA_STANDARD_REQUIRED ON CUDA_EXTENSIONS OFF
164+ )
165+ endif ()
166+ target_compile_options ( ${CMAKE_PROJECT_NAME } PUBLIC "$<$<AND :$<COMPILE_LANGUAGE :CXX >,$<CONFIG :DEBUG >>:${KITRT_DEBUG_OPTIONS} >" )
167+ target_compile_options ( ${CMAKE_PROJECT_NAME } PUBLIC "$<$<AND :$<COMPILE_LANGUAGE :CXX >,$<CONFIG :RELWITHDEBINFO >>:${KITRT_RELWITHDEBINFO_OPTIONS} >" )
168+ target_compile_options ( ${CMAKE_PROJECT_NAME } PUBLIC "$<$<AND :$<COMPILE_LANGUAGE :CXX >,$<CONFIG :RELEASE >>:${KITRT_RELEASE_OPTIONS} >" )
116169#################################################
117170
118171### BUILD UNIT TESTS ############################
@@ -145,20 +198,26 @@ if( BUILD_TESTING )
145198 target_compile_definitions ( unit_tests PUBLIC BUILD_TESTING )
146199 target_compile_definitions ( unit_tests PUBLIC TESTS_PATH= "${CMAKE_SOURCE_DIR } /tests/" )
147200 target_link_libraries ( unit_tests Catch ${CORE_LIBRARIES} )
148- target_compile_options ( unit_tests PUBLIC "$<$<CONFIG :DEBUG >:${KITRT_DEBUG_OPTIONS} >" )
201+ if ( BUILD_CUDA_HPC )
202+ set_target_properties (
203+ unit_tests
204+ PROPERTIES CUDA_STANDARD 17 CUDA_STANDARD_REQUIRED ON CUDA_EXTENSIONS OFF
205+ )
206+ endif ()
207+ target_compile_options ( unit_tests PUBLIC "$<$<AND :$<COMPILE_LANGUAGE :CXX >,$<CONFIG :DEBUG >>:${KITRT_DEBUG_OPTIONS} >" )
149208 if ( BUILD_CODE_COV )
150209 if ( CMAKE_COMPILER_IS_GNUCXX )
151210 set ( CODE_COVERAGE_OPTIONS --coverage -g -O0 -w )
152- target_compile_options ( unit_tests PUBLIC "$<$<CONFIG :DEBUG >:${CODE_COVERAGE_OPTIONS} >" )
211+ target_compile_options ( unit_tests PUBLIC "$<$<AND :$< COMPILE_LANGUAGE : CXX >,$< CONFIG :DEBUG > >:${CODE_COVERAGE_OPTIONS} >" )
153212 target_link_libraries ( unit_tests Catch gcov )
154213 else ()
155214 message ( FATAL_ERROR "Code coverage is currently only supported for gcc!" )
156215 endif ()
157216 else ()
158217 target_link_libraries ( unit_tests Catch )
159218 endif ()
160- target_compile_options ( unit_tests PUBLIC "$<$<CONFIG :RELWITHDEBINFO >:${KITRT_RELWITHDEBINFO_OPTIONS} >" )
161- target_compile_options ( unit_tests PUBLIC "$<$<CONFIG :RELEASE >:${KITRT_RELEASE_OPTIONS} >" )
219+ target_compile_options ( unit_tests PUBLIC "$<$<AND :$< COMPILE_LANGUAGE : CXX >,$< CONFIG :RELWITHDEBINFO > >:${KITRT_RELWITHDEBINFO_OPTIONS} >" )
220+ target_compile_options ( unit_tests PUBLIC "$<$<AND :$< COMPILE_LANGUAGE : CXX >,$< CONFIG :RELEASE > >:${KITRT_RELEASE_OPTIONS} >" )
162221 catch_discover_tests ( unit_tests )
163222endif ()
164223#################################################
@@ -179,9 +238,9 @@ if( BUILD_GUI )
179238 set ( GUI_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Gui Qt5::OpenGL ${VTK_LIBRARIES} )
180239 target_link_libraries ( ${CMAKE_PROJECT_NAME } _gui ${CORE_LIBRARIES} ${GUI_LIBRARIES} )
181240 set_target_properties ( ${CMAKE_PROJECT_NAME } _gui PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR } /bin" )
182- target_compile_options ( ${CMAKE_PROJECT_NAME } _gui PUBLIC "$<$<CONFIG :DEBUG >:${KITRT_DEBUG_OPTIONS} >" )
183- target_compile_options ( ${CMAKE_PROJECT_NAME } _gui PUBLIC "$<$<CONFIG :RELWITHDEBINFO >:${KITRT_RELWITHDEBINFO_OPTIONS} >" )
184- target_compile_options ( ${CMAKE_PROJECT_NAME } _gui PUBLIC "$<$<CONFIG :RELEASE >:${KITRT_RELEASE_OPTIONS} >" )
241+ target_compile_options ( ${CMAKE_PROJECT_NAME } _gui PUBLIC "$<$<AND :$< COMPILE_LANGUAGE : CXX >,$< CONFIG :DEBUG > >:${KITRT_DEBUG_OPTIONS} >" )
242+ target_compile_options ( ${CMAKE_PROJECT_NAME } _gui PUBLIC "$<$<AND :$< COMPILE_LANGUAGE : CXX >,$< CONFIG :RELWITHDEBINFO > >:${KITRT_RELWITHDEBINFO_OPTIONS} >" )
243+ target_compile_options ( ${CMAKE_PROJECT_NAME } _gui PUBLIC "$<$<AND :$< COMPILE_LANGUAGE : CXX >,$< CONFIG :RELEASE > >:${KITRT_RELEASE_OPTIONS} >" )
185244endif ()
186245#################################################
187246
0 commit comments