Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework CMake files and set alpaka tag to 1.2.0 #93

Merged
merged 4 commits into from
Feb 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
320 changes: 148 additions & 172 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
cmake_minimum_required(VERSION 3.16.0)
project(CLUEstering LANGUAGES CXX)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
Expand All @@ -9,12 +11,12 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
add_compile_definitions(DEBUG)
set(CMAKE_CXX_FLAGS "-Wall -Wextra -g -O0")
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Release")
set(CMAKE_CXX_FLAGS "-O2")
endif()
string(
APPEND
CMAKE_CXX_FLAGS_DEBUG
"-DCLUE_DEBUG -D_GLIBCXX_ASSERTIONS -Wall -Wextra -Wpedantic -Wpedantic -Werror"
)
string(APPEND CMAKE_CXX_FLAGS "-O2")

# include pybind11 extern subfolder
set(PYBIND11_FINDPYTHON ON)
Expand All @@ -24,183 +26,157 @@ add_subdirectory(extern/pybind11)
find_package(Boost 1.75.0 REQUIRED)

include(FetchContent)

FetchContent_Declare(
alpaka
GIT_REPOSITORY https://github.com/alpaka-group/alpaka.git
GIT_TAG develop
GIT_SHALLOW TRUE
FIND_PACKAGE_ARGS)
URL https://github.com/alpaka-group/alpaka/archive/refs/tags/1.2.0.tar.gz)
FetchContent_MakeAvailable(alpaka)

if(NOT DEFINED CPU_ONLY)
set(CPU_ONLY OFF)
endif()
if(NOT DEFINED SERIAL_ONLY)
set(SERIAL_ONLY OFF)
endif()

include_directories(include)

# create lib directory in CLUEstering folder
execute_process(COMMAND mkdir -p ./CLUEstering/lib)
file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/CLUEstering/lib)

# Convolutional Kernels compile convolutional kernel module
pybind11_add_module(CLUE_Convolutional_Kernels SHARED
CLUEstering/BindingModules/binding_kernels.cpp)
# Convolutional Kernels
pybind11_add_module(
CLUE_Convolutional_Kernels SHARED
${CMAKE_SOURCE_DIR}/CLUEstering/BindingModules/binding_kernels.cpp)
target_include_directories(
CLUE_Convolutional_Kernels PRIVATE ${alpaka_SOURCE_DIR}/include
${Boost_INCLUDE_DIR})
# alpaka build flags
target_compile_options(
CLUE_Convolutional_Kernels
PRIVATE -DALPAKA_HOST_ONLY -DALPAKA_ACC_CPU_B_SEQ_T_SEQ_PRESENT
-DALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
-DALPAKA_ACC_CPU_B_SEQ_T_SEQ_SYNC_BACKEND)
# set output directory
PRIVATE ${CMAKE_SOURCE_DIR}/include ${alpaka_SOURCE_DIR}/include
${Boost_INCLUDE_DIR})
target_compile_definitions(
CLUE_Convolutional_Kernels PRIVATE ALPAKA_HOST_ONLY
ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED)
set_target_properties(
CLUE_Convolutional_Kernels PROPERTIES LIBRARY_OUTPUT_DIRECTORY
./lib/CLUEstering/lib/)
# create link of shared object to lib folder inside CLUEstering directory
file(GLOB CONV_MODULE
./build/lib/CLUEstering/lib/CLUE_Convolutional_Kernels*.so)
foreach(CONV_MODULE ${CONV_MODULE})
execute_process(COMMAND ln -sf ${CONV_MODULE}
./CLUEstering/lib/CLUE_Convolutional_Kernels.so)
endforeach()

# CPU Serial compile cpu serial module
pybind11_add_module(CLUE_CPU_Serial SHARED
CLUEstering/BindingModules/binding_cpu.cpp)
target_include_directories(CLUE_CPU_Serial PRIVATE ${alpaka_SOURCE_DIR}/include
${Boost_INCLUDE_DIR})
# alpaka build flags
target_compile_options(
CLUE_CPU_Serial
PRIVATE -DALPAKA_HOST_ONLY -DALPAKA_ACC_CPU_B_SEQ_T_SEQ_PRESENT
-DALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
-DALPAKA_ACC_CPU_B_SEQ_T_SEQ_SYNC_BACKEND)
# set output directory
set_target_properties(CLUE_CPU_Serial PROPERTIES LIBRARY_OUTPUT_DIRECTORY
./lib/CLUEstering/lib/)
# create link of shared object to lib folder inside CLUEstering directory
file(GLOB CONV_MODULE ./build/lib/CLUEstering/lib/CLUE_CPU_Serial*.so)
foreach(CONV_MODULE ${CONV_MODULE})
execute_process(COMMAND ln -sf ${CONV_MODULE}
./CLUEstering/lib/CLUE_CPU_Serial.so)
endforeach()

if(NOT ${SERIAL_ONLY})
find_package(TBB)

# CPU TBB
if(TBB_FOUND)
# compile cpu tbb module
pybind11_add_module(CLUE_CPU_TBB SHARED
CLUEstering/BindingModules/binding_cpu_tbb.cpp)
target_include_directories(CLUE_CPU_TBB PRIVATE ${alpaka_SOURCE_DIR}/include
${Boost_SOURCE_DIR})
target_compile_options(
CLUE_CPU_TBB
PRIVATE -ltbb -DALPAKA_ACC_CPU_B_TBB_T_SEQ_PRESENT
-DALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLED
-DALPAKA_ACC_CPU_B_TBB_T_SEQ_ASYNC_BACKEND)
target_link_libraries(CLUE_CPU_TBB PRIVATE TBB::tbb)
set_target_properties(CLUE_CPU_TBB PROPERTIES LIBRARY_OUTPUT_DIRECTORY
./lib/CLUEstering/lib/)
# create link of shared object to lib folder inside CLUEstering directory
file(GLOB CONV_MODULE ./build/lib/CLUEstering/lib/CLUE_CPU_TBB*.so)
foreach(CONV_MODULE ${CONV_MODULE})
execute_process(COMMAND ln -sf ${CONV_MODULE}
./CLUEstering/lib/CLUE_CPU_TBB.so)
endforeach()
endif()
CLUE_Convolutional_Kernels
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/)
# copy shared library for local testing
add_custom_command(
TARGET CLUE_Convolutional_Kernels
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/CLUE_Convolutional_Kernels.*
${CMAKE_SOURCE_DIR}/CLUEstering/lib/
COMMENT "Copying module to ${CMAKE_SOURCE_DIR}/CLUEstering/lib")

# CPU Serial
pybind11_add_module(
CLUE_CPU_Serial SHARED
${CMAKE_SOURCE_DIR}/CLUEstering/BindingModules/binding_cpu.cpp)
target_include_directories(
CLUE_CPU_Serial PRIVATE ${CMAKE_SOURCE_DIR}/include
${alpaka_SOURCE_DIR}/include ${Boost_INCLUDE_DIR})
target_compile_definitions(
CLUE_CPU_Serial PRIVATE ALPAKA_HOST_ONLY ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED)
set_target_properties(
CLUE_CPU_Serial PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/)
# copy shared library for local testing
add_custom_command(
TARGET CLUE_CPU_Serial
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/CLUE_CPU_Serial.*
${CMAKE_SOURCE_DIR}/CLUEstering/lib/
COMMENT "Copying module to ${CMAKE_SOURCE_DIR}/CLUEstering/lib")

find_package(TBB)
# CPU TBB
if(TBB_FOUND)
pybind11_add_module(
CLUE_CPU_TBB SHARED
${CMAKE_SOURCE_DIR}/CLUEstering/BindingModules/binding_cpu_tbb.cpp)
target_include_directories(
CLUE_CPU_TBB PRIVATE ${CMAKE_SOURCE_DIR}/include
${alpaka_SOURCE_DIR}/include ${Boost_SOURCE_DIR})
target_compile_definitions(
CLUE_CPU_TBB PRIVATE ALPAKA_HOST_ONLY ALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLED)
target_link_libraries(CLUE_CPU_TBB PRIVATE TBB::tbb)
set_target_properties(
CLUE_CPU_TBB PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/)
# copy shared library for local testing
add_custom_command(
TARGET CLUE_CPU_TBB
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/CLUE_CPU_TBB.*
${CMAKE_SOURCE_DIR}/CLUEstering/lib/
COMMENT "Copying module to ${CMAKE_SOURCE_DIR}/CLUEstering/lib")
endif()

if((NOT ${CPU_ONLY}) AND (NOT ${SERIAL_ONLY}))
# check if CUDA is available
include(CheckLanguage)
check_language(CUDA)

# GPU CUDA
if(CMAKE_CUDA_COMPILER)
# enable CUDA
enable_language(CUDA)
set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CUDA_COMPILER})

# set the CUDA standard
if(NOT DEFINED CMAKE_CUDA_STANDARD)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()

# compile the file with .cc extension using nvcc
set_source_files_properties(
./CLUEstering/alpaka/BindingModules/binding_gpu_cuda.cc
PROPERTIES LANGUAGE CUDA)
# compile gpu cuda module
pybind11_add_module(CLUE_GPU_CUDA SHARED
CLUEstering/BindingModules/binding_gpu_cuda.cpp)
target_include_directories(
CLUE_GPU_CUDA PRIVATE ${alpaka_SOURCE_DIR}/include ${Boost_INCLUDE_DIR})
# set the cuda architectures
set_target_properties(CLUE_GPU_CUDA PROPERTIES CUDA_ARCHITECTURES
"50;60;61;62;70")
# alpaka build flags
target_compile_options(
CLUE_GPU_CUDA
PRIVATE -DALPAKA_ACC_GPU_CUDA_PRESENT -DALPAKA_ACC_GPU_CUDA_ENABLED
-DALPAKA_ACC_GPU_CUDA_ASYNC_BACKEND)
# nvcc compilation flags
target_compile_options(
CLUE_GPU_CUDA PRIVATE --expt-relaxed-constexpr -gencode
arch=compute_61,code=[sm_61,compute_61])
# set output directory
set_target_properties(CLUE_GPU_CUDA PROPERTIES LIBRARY_OUTPUT_DIRECTORY
./lib/CLUEstering/lib/)
# create link of shared object to lib folder inside CLUEstering directory
file(GLOB CONV_MODULE ./build/lib/CLUEstering/lib/CLUE_GPU_CUDA*.so)
foreach(CONV_MODULE ${CONV_MODULE})
execute_process(COMMAND ln -sf ${CONV_MODULE}
./CLUEstering/lib/CLUE_GPU_CUDA.so)
endforeach()
endif()
# check if CUDA is available
include(CheckLanguage)
check_language(CUDA)

# GPU HIP check if HIP is available
check_language(HIP)
if(CMAKE_HIP_COMPILER)
# enable HIP
enable_language(HIP)
set(CMAKE_HIP_HOST_COMPILER ${CMAKE_HIP_COMPILER})

# look for the hip package folder
find_package(hip)

set(hip_BASE "${hip_INCLUDE_DIRS}/..")
# set the hipcc compiler
set(CMAKE_CXX_COMPILER "${hip_BASE}/bin/hipcc")
# compile gpu hip module
pybind11_add_module(CLUE_GPU_HIP SHARED
CLUEstering/BindingModules/binding_gpu_hip.cpp)
target_include_directories(CLUE_GPU_HIP PRIVATE ${alpaka_SOURCE_DIR}/include
${Boost_INCLUDE_DIR})
# alpaka build flags
target_compile_options(
CLUE_GPU_HIP
PRIVATE -DALPAKA_ACC_GPU_HIP_PRESENT -DALPAKA_ACC_GPU_HIP_ENABLED
-DALPAKA_ACC_GPU_HIP_ASYNC_BACKEND)
# link hip-rand libraries
target_include_directories(CLUE_GPU_HIP PRIVATE ${hip_INCLUDE_DIRS})
target_include_directories(CLUE_GPU_HIP PRIVATE ${hip_BASE}/hiprand/include)
target_include_directories(CLUE_GPU_HIP PRIVATE ${hip_BASE}/rocrand/include)
# set output directory
set_target_properties(CLUE_GPU_HIP PROPERTIES LIBRARY_OUTPUT_DIRECTORY
./lib/CLUEstering/lib/)
# create link of shared object to lib folder inside CLUEstering directory
file(GLOB CONV_MODULE ./build/lib/CLUEstering/lib/CLUE_GPU_HIP*.so)
foreach(CONV_MODULE ${CONV_MODULE})
execute_process(COMMAND ln -sf ${CONV_MODULE}
./CLUEstering/lib/CLUE_GPU_HIP.so)
endforeach()
# GPU CUDA
if(CMAKE_CUDA_COMPILER)
enable_language(CUDA)
set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CUDA_COMPILER})

# set the CUDA standard
if(NOT DEFINED CMAKE_CUDA_STANDARD)
set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()

set_source_files_properties(
${CMAKE_SOURCE_DIR}/CLUEstering/BindingModules/binding_gpu_cuda.cc
PROPERTIES LANGUAGE CUDA)
pybind11_add_module(
CLUE_GPU_CUDA SHARED
${CMAKE_SOURCE_DIR}/CLUEstering/BindingModules/binding_gpu_cuda.cpp)
target_include_directories(
CLUE_GPU_CUDA PRIVATE ${CMAKE_SOURCE_DIR}/include
${alpaka_SOURCE_DIR}/include ${Boost_INCLUDE_DIR})
target_compile_definitions(CLUE_GPU_CUDA PRIVATE ALPAKA_ACC_GPU_CUDA_ENABLED)
target_compile_options(CLUE_GPU_CUDA PRIVATE --expt-relaxed-constexpr)
set_target_properties(
CLUE_GPU_CUDA
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/
CUDA_ARCHITECTURES "50;60;61;62;70")
# copy shared library for local testing
add_custom_command(
TARGET CLUE_GPU_CUDA
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/CLUE_GPU_CUDA.*
${CMAKE_SOURCE_DIR}/CLUEstering/lib/
COMMENT "Copying module to ${CMAKE_SOURCE_DIR}/CLUEstering/lib")
endif()

# GPU HIP
check_language(HIP)
if(CMAKE_HIP_COMPILER)
enable_language(HIP)
set(CMAKE_HIP_HOST_COMPILER ${CMAKE_HIP_COMPILER})

find_package(hip)

set(hip_BASE "${hip_INCLUDE_DIRS}/..")
set(CMAKE_CXX_COMPILER "${hip_BASE}/bin/hipcc")
pybind11_add_module(
CLUE_GPU_HIP SHARED
${CMAKE_SOURCE_DIR}/CLUEstering/BindingModules/binding_gpu_hip.cpp)
target_include_directories(
CLUE_GPU_HIP PRIVATE ${CMAKE_SOURCE_DIR}/include
${alpaka_SOURCE_DIR}/include ${Boost_INCLUDE_DIR})
target_compile_options(CLUE_GPU_HIP PRIVATE -DALPAKA_ACC_GPU_HIP_ENABLED)
target_include_directories(CLUE_GPU_HIP PRIVATE ${hip_INCLUDE_DIRS})
target_include_directories(CLUE_GPU_HIP PRIVATE ${hip_BASE}/hiprand/include)
target_include_directories(CLUE_GPU_HIP PRIVATE ${hip_BASE}/rocrand/include)
set_target_properties(
CLUE_GPU_HIP PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/)
# create link of shared object to lib folder inside CLUEstering directory
add_custom_command(
TARGET CLUE_GPU_HIP
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy
${CMAKE_BINARY_DIR}/lib/CLUEstering/lib/CLUE_GPU_HIP.*
${CMAKE_SOURCE_DIR}/CLUEstering/lib/
COMMENT "Copying module to ${CMAKE_SOURCE_DIR}/CLUEstering/lib")
endif()
Loading
Loading