Skip to content

Commit

Permalink
Improve to print details of tpls in CMake (#126)
Browse files Browse the repository at this point in the history
* Improve to print details of tpls in CMake

* fix find logic in CMake

* fix: serial should not be enabled if KokkosFFT_ENABLE_HOST_AND_DEVICE is OFF

* fix: serial should be included for two host exec spaces case

* fix: behaviour of -DKokkosFFT_ENABLE_HOST_AND_DEVICE with host exec space only

* cleanup CMake based on reviews
  • Loading branch information
yasahi-hpc authored Aug 23, 2024
1 parent e3454ae commit 9d6808e
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 47 deletions.
9 changes: 6 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ endif ()

# Set tpls
set(KOKKOSFFT_TPL_LIST)
set(KOKKOSFFT_BACKEND_LIST)
include(KokkosFFT_tpls)
get_tpls_list(KOKKOSFFT_TPL_LIST)
get_tpls_list(KOKKOSFFT_TPL_LIST KOKKOSFFT_BACKEND_LIST)

# ==================================================================
# CMake Summary
Expand All @@ -56,9 +57,11 @@ message("")
message(STATUS "KokkosFFT version: ${KOKKOSFFT_VERSION_MAJOR}.${KOKKOSFFT_VERSION_MINOR}.${KOKKOSFFT_VERSION_PATCH}")
message(STATUS "KokkosFFT TPLs:")
if(KOKKOSFFT_TPL_LIST)
foreach(TPL ${KOKKOSFFT_TPL_LIST})
include(KokkosFFT_utils)
foreach(BACKEND TPL IN ZIP_LISTS KOKKOSFFT_BACKEND_LIST KOKKOSFFT_TPL_LIST)
# [TO DO] show more information about the library (like location)
message(STATUS " ${TPL}")
pad_string(BACKEND_PADDED "${BACKEND}" 13)
message(STATUS " ${BACKEND_PADDED}: ${TPL}")
endforeach()
else()
message(STATUS " (None)")
Expand Down
3 changes: 3 additions & 0 deletions cmake/KokkosFFT_config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
/* CUFFT */
#cmakedefine KOKKOSFFT_ENABLE_TPL_CUFFT

/* ROCFFT */
#cmakedefine KOKKOSFFT_ENABLE_TPL_ROCFFT

/* HIPFFT */
#cmakedefine KOKKOSFFT_ENABLE_TPL_HIPFFT

Expand Down
55 changes: 48 additions & 7 deletions cmake/KokkosFFT_tpls.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,75 @@
#
# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception

function(get_tpls_list tpls_list)
# \brief Get the list of required FFT tpls based on the
# CMake configuration
# Display Tpls in the Kokkos order
# Device Parallel:
# Host Parallel:
# Host Serial:
# \param tpls_list[inout] A list of tpls that are needed
# \param backend_list[inout] A list of backends corresponding to tpls
# backend_list is used to display
function(get_tpls_list tpls_list backend_list)
set(KOKKOSFFT_HAS_DEVICE FALSE)
if(Kokkos_ENABLE_CUDA)
set(KOKKOSFFT_HAS_DEVICE TRUE)
list(APPEND tpls_list CUFFT)
list(APPEND backend_list "Device Parallel")
elseif(Kokkos_ENABLE_HIP)
set(KOKKOSFFT_HAS_DEVICE TRUE)
if(KokkosFFT_ENABLE_ROCFFT)
list(APPEND tpls_list ROCFFT)
else()
list(APPEND tpls_list HIPFFT)
endif()
list(APPEND backend_list "Device Parallel")
elseif(Kokkos_ENABLE_SYCL)
set(KOKKOSFFT_HAS_DEVICE TRUE)
list(APPEND tpls_list ONEMKL)
list(APPEND backend_list "Device Parallel")
elseif(Kokkos_ENABLE_OPENMP)
list(APPEND tpls_list FFTW_OPENMP)
list(APPEND backend_list "Host Parallel")
elseif(Kokkos_ENABLE_THREADS)
list(APPEND tpls_list FFTW_THREADS)
list(APPEND backend_list "Host Parallel")
elseif(Kokkos_ENABLE_SERIAL)
list(APPEND tpls_list FFTW)
list(APPEND tpls_list FFTW_SERIAL)
list(APPEND backend_list "Host Serial")
endif()

if(KokkosFFT_ENABLE_HOST_AND_DEVICE)
if(Kokkos_ENABLE_OPENMP)
# Check if TPL is already included
if(Kokkos_ENABLE_OPENMP AND NOT ("FFTW_OPENMP" IN_LIST tpls_list))
list(APPEND tpls_list FFTW_OPENMP)
elseif(Kokkos_ENABLE_THREADS)
list(APPEND backend_list "Host Parallel")
elseif(Kokkos_ENABLE_THREADS AND NOT ("FFTW_THREADS" IN_LIST tpls_list))
list(APPEND tpls_list FFTW_THREADS)
else()
list(APPEND tpls_list FFTW)
list(APPEND backend_list "Host Parallel")
endif()

if(Kokkos_ENABLE_SERIAL AND NOT ("FFTW_SERIAL" IN_LIST tpls_list))
list(APPEND tpls_list FFTW_SERIAL)
list(APPEND backend_list "Host Serial")
endif()
endif()

# Enable Serial if Device is not used
if(NOT ${KOKKOSFFT_HAS_DEVICE} AND (Kokkos_ENABLE_SERIAL AND NOT ("FFTW_SERIAL" IN_LIST tpls_list)))
list(APPEND tpls_list FFTW_SERIAL)
list(APPEND backend_list "Host Serial")
endif()

# Get the size of the lists
list(LENGTH tpls_list tpls_list_len)
list(LENGTH backend_list backend_list_len)

if(NOT tpls_list_len EQUAL backend_list_len)
message(FATAL_ERROR "Lists have different lengths, cannot zip")
endif()

set(${tpls_list} ${${tpls_list}} PARENT_SCOPE)
endfunction()
set(${backend_list} ${${backend_list}} PARENT_SCOPE)
endfunction()

31 changes: 31 additions & 0 deletions cmake/KokkosFFT_utils.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# SPDX-FileCopyrightText: (C) The Kokkos-FFT development team, see COPYRIGHT.md file
#
# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception

# \brief Left padding function for better alignment of a string
# https://gist.github.com/jtanx/96ded5e050d5ee5b19804195ee5cf5f9
# \param output[out] Output string that may be paded
# \param str[in] Input string
# \param length[in] The length of an output string
function(pad_string output_string input_string length)
# Get the length of the input string
string(LENGTH "${input_string}" input_length)

# Check if padding is necessary
if(${input_length} LESS ${length})
# Calculate the number of spaces needed for padding
math(EXPR padding_length "${length} - ${input_length}")

# Create a string of spaces for padding
string(REPEAT " " ${padding_length} padding)

# Append the padding to the input string
set(padded_string "${padding}${input_string}")
else()
set(padded_string "${input_string}")
endif()

# Set the output variable
set(${output_string} "${padded_string}" PARENT_SCOPE)
endfunction()

71 changes: 34 additions & 37 deletions common/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,55 +9,52 @@ target_link_libraries(common
Kokkos::kokkos
)

if(Kokkos_ENABLE_CUDA)
find_package(CUDAToolkit REQUIRED COMPONENTS cufft)
target_link_libraries(common INTERFACE CUDA::cufft)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_CUFFT)
if(KokkosFFT_ENABLE_HOST_AND_DEVICE)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double FFTW::FloatOpenMP FFTW::DoubleOpenMP)
target_compile_definitions(common INTERFACE ENABLE_HOST_AND_DEVICE KOKKOSFFT_ENABLE_TPL_FFTW)
endif()
elseif(Kokkos_ENABLE_HIP)
if(KokkosFFT_ENABLE_ROCFFT)
# find and link libraries based on KOKKOSFFT_TPL_LIST
if("CUFFT" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(CUDAToolkit REQUIRED COMPONENTS cufft)
target_link_libraries(common INTERFACE CUDA::cufft)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_CUFFT)
endif()

if("ROCFFT" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(rocfft REQUIRED)
target_link_libraries(common INTERFACE roc::rocfft)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_ROCFFT)
else()
endif()

if("HIPFFT" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(hipfft REQUIRED)
target_link_libraries(common INTERFACE hip::hipfft)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_HIPFFT)
endif()
if(KokkosFFT_ENABLE_HOST_AND_DEVICE)
endif()

if("ONEMKL" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(MKL REQUIRED COMPONENTS SYCL)
target_link_libraries(common INTERFACE MKL::MKL_SYCL)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_ONEMKL)
endif()

if("FFTW_OPENMP" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double FFTW::FloatOpenMP FFTW::DoubleOpenMP)
target_compile_definitions(common INTERFACE ENABLE_HOST_AND_DEVICE KOKKOSFFT_ENABLE_TPL_FFTW)
endif()
elseif(Kokkos_ENABLE_SYCL)
find_package(MKL REQUIRED COMPONENTS SYCL)
target_link_libraries(common INTERFACE MKL::MKL_SYCL)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_ONEMKL)
if(KokkosFFT_ENABLE_HOST_AND_DEVICE)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_FFTW)
elseif("FFTW_THREADS" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double FFTW::FloatOpenMP FFTW::DoubleOpenMP)
target_compile_definitions(common INTERFACE ENABLE_HOST_AND_DEVICE KOKKOSFFT_ENABLE_TPL_FFTW)
endif()
elseif(Kokkos_ENABLE_OPENMP)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double FFTW::FloatOpenMP FFTW::DoubleOpenMP)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_FFTW)
elseif(Kokkos_ENABLE_THREADS)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double FFTW::FloatThreads FFTW::DoubleThreads)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_FFTW)
elseif(Kokkos_ENABLE_SERIAL)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_FFTW)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double FFTW::FloatThreads FFTW::DoubleThreads)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_FFTW)
elseif("FFTW_SERIAL" IN_LIST KOKKOSFFT_TPL_LIST)
find_package(FFTW MODULE REQUIRED)
target_link_libraries(common INTERFACE FFTW::Float FFTW::Double)
target_compile_definitions(common INTERFACE KOKKOSFFT_ENABLE_TPL_FFTW)
endif()

if(KokkosFFT_ENABLE_HOST_AND_DEVICE)
target_compile_definitions(common INTERFACE ENABLE_HOST_AND_DEVICE)
endif()

target_compile_features(common INTERFACE cxx_std_17)
target_include_directories(common INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}>
)
)

0 comments on commit 9d6808e

Please sign in to comment.