diff --git a/CMakeLists.txt b/CMakeLists.txt index b050df24..dd9a3e28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,13 +29,26 @@ set(CMAKE_INSTALL_PREFIX "/opt/rocm" CACHE PATH "Install path prefix, prepended # hipCUB project project(hipcub LANGUAGES CXX) -# Set the ROCM install directory. -if(WIN32) - set(ROCM_ROOT "$ENV{HIP_PATH}" CACHE PATH "Root directory of the ROCm installation") -else() - set(ROCM_ROOT "/opt/rocm" CACHE PATH "Root directory of the ROCm installation") +# Set CXX flags +if (NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) +endif() +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +if (CMAKE_CXX_STANDARD EQUAL 14) + message(WARNING "C++14 will be deprecated in the next major release") +elseif(NOT CMAKE_CXX_STANDARD EQUAL 17) + message(FATAL_ERROR "Only C++14 and C++17 are supported") endif() +# Set HIP flags +set(CMAKE_HIP_STANDARD 14) +set(CMAKE_HIP_STANDARD_REQUIRED ON) +set(CMAKE_HIP_EXTENSIONS OFF) + +include(CheckLanguage) +include(CMakeDependentOption) # Build options option(BUILD_TEST "Build tests (requires googletest)" OFF) @@ -45,6 +58,17 @@ option(BUILD_BENCHMARK "Build benchmarks" OFF) option(BUILD_EXAMPLE "Build Examples" OFF) option(BUILD_ADDRESS_SANITIZER "Build with address sanitizer enabled" OFF) +check_language(HIP) +cmake_dependent_option(USE_HIPCXX "Use CMake HIP language support" OFF CMAKE_HIP_COMPILER OFF) + +# Set the ROCM install directory. +if(WIN32) + set(ROCM_ROOT "$ENV{HIP_PATH}" CACHE PATH "Root directory of the ROCm installation") +else() + set(ROCM_ROOT "/opt/rocm" CACHE PATH "Root directory of the ROCm installation") +endif() + + # Set the header wrapper ON by default. option(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY "Build with file/folder reorg with backward compatibility enabled" OFF) @@ -60,45 +84,36 @@ endif() set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOL "Add paths to linker search and installed rpath") -# Set CXX flags -if (NOT DEFINED CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - - -if (CMAKE_CXX_STANDARD EQUAL 14) - message(WARNING "C++14 will be deprecated in the next major release") -elseif(NOT CMAKE_CXX_STANDARD EQUAL 17) - message(FATAL_ERROR "Only C++14 and C++17 are supported") -endif() - # rocm-cmake has to be included early so that it's available to set GPU_TARGETS # If hip is included prior to setting that then it defaults to building only for the current architecture include(ROCmCMakeBuildToolsDependency) # Setup GPU targets for rocm platform -if(NOT (CMAKE_CXX_COMPILER MATCHES ".*nvcc$" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")) - if(NOT DEFINED AMDGPU_TARGETS) - set(GPU_TARGETS "all" CACHE STRING "GPU architectures to compile for") - else() - set(GPU_TARGETS "${AMDGPU_TARGETS}" CACHE STRING "GPU architectures to compile for") - endif() - set_property(CACHE GPU_TARGETS PROPERTY STRINGS "all") - - if(GPU_TARGETS STREQUAL "all") - if(BUILD_ADDRESS_SANITIZER) - # ASAN builds require xnack - rocm_check_target_ids(DEFAULT_AMDGPU_TARGETS - TARGETS "gfx908:xnack+;gfx90a:xnack+;gfx942:xnack+" - ) +if(USE_HIPCXX) + enable_language(HIP) +else() + # Setup GPU targets for rocm platform + if(NOT (CMAKE_CXX_COMPILER MATCHES ".*nvcc$" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")) + if(NOT DEFINED AMDGPU_TARGETS) + set(GPU_TARGETS "all" CACHE STRING "GPU architectures to compile for") else() - rocm_check_target_ids(DEFAULT_AMDGPU_TARGETS - TARGETS "gfx803;gfx900:xnack-;gfx906:xnack-;gfx908:xnack-;gfx90a:xnack-;gfx90a:xnack+;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1151;gfx1200;gfx1201" - ) + set(GPU_TARGETS "${AMDGPU_TARGETS}" CACHE STRING "GPU architectures to compile for") + endif() + set_property(CACHE GPU_TARGETS PROPERTY STRINGS "all") + + if(GPU_TARGETS STREQUAL "all") + if(BUILD_ADDRESS_SANITIZER) + # ASAN builds require xnack + rocm_check_target_ids(DEFAULT_AMDGPU_TARGETS + TARGETS "gfx908:xnack+;gfx90a:xnack+;gfx942:xnack+" + ) + else() + rocm_check_target_ids(DEFAULT_AMDGPU_TARGETS + TARGETS "gfx803;gfx900:xnack-;gfx906:xnack-;gfx908:xnack-;gfx90a:xnack-;gfx90a:xnack+;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1151;gfx1200;gfx1201" + ) + endif() + set(GPU_TARGETS "${DEFAULT_AMDGPU_TARGETS}" CACHE STRING "GPU architectures to compile for" FORCE) endif() - set(GPU_TARGETS "${DEFAULT_AMDGPU_TARGETS}" CACHE STRING "GPU architectures to compile for" FORCE) endif() endif() @@ -109,8 +124,7 @@ include(VerifyCompiler) include(Dependencies) if(BUILD_ADDRESS_SANITIZER) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -shared-libasan") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -shared-libasan") + add_compile_options(-fsanitize=address -shared-libasan) add_link_options(-fuse-ld=lld) endif() diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 579b8e11..4a38bac1 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -22,6 +22,9 @@ function(add_hipcub_benchmark BENCHMARK_SOURCE) get_filename_component(BENCHMARK_TARGET ${BENCHMARK_SOURCE} NAME_WE) + if(USE_HIPCXX) + set_source_files_properties(${BENCHMARK_SOURCE} PROPERTIES LANGUAGE HIP) + endif() add_executable(${BENCHMARK_TARGET} ${BENCHMARK_SOURCE}) target_include_directories(${BENCHMARK_TARGET} SYSTEM BEFORE PUBLIC diff --git a/cmake/Summary.cmake b/cmake/Summary.cmake index 29e182bd..7a9af985 100644 --- a/cmake/Summary.cmake +++ b/cmake/Summary.cmake @@ -26,10 +26,17 @@ function(print_configuration_summary) message(STATUS "General:") message(STATUS " System : ${CMAKE_SYSTEM_NAME}") message(STATUS " HIP ROOT : ${HIP_ROOT_DIR}") +if(USE_HIPCXX) + message(STATUS " HIP compiler : ${CMAKE_HIP_COMPILER}") + message(STATUS " HIP compiler version : ${CMAKE_HIP_COMPILER_VERSION}") + string(STRIP "${CMAKE_HIP_FLAGS}" CMAKE_HIP_FLAGS_STRIP) + message(STATUS " HIP flags : ${CMAKE_HIP_FLAGS_STRIP}") +else() message(STATUS " C++ compiler : ${CMAKE_CXX_COMPILER}") message(STATUS " C++ compiler version : ${CMAKE_CXX_COMPILER_VERSION}") string(STRIP "${CMAKE_CXX_FLAGS}" CMAKE_CXX_FLAGS_STRIP) message(STATUS " CXX flags : ${CMAKE_CXX_FLAGS_STRIP}") +endif() if(HIP_COMPILER STREQUAL "nvcc") string(REPLACE ";" " " HIP_NVCC_FLAGS_STRIP "${HIP_NVCC_FLAGS}") string(STRIP "${HIP_NVCC_FLAGS_STRIP}" HIP_NVCC_FLAGS_STRIP) @@ -40,8 +47,10 @@ if(HIP_COMPILER STREQUAL "nvcc") endif() message(STATUS " Build type : ${CMAKE_BUILD_TYPE}") message(STATUS " Install prefix : ${CMAKE_INSTALL_PREFIX}") -if(HIP_COMPILER STREQUAL "clang") - message(STATUS " Device targets : ${GPU_TARGETS}") +if(USE_HIPCXX) + message(STATUS " Device targets : ${CMAKE_HIP_ARCHITECTURES}") +elseif(HIP_COMPILER STREQUAL "clang") + message(STATUS " Device targets : ${AMDGPU_TARGETS}") else() message(STATUS " Device targets : ${NVGPU_TARGETS}") endif() diff --git a/cmake/VerifyCompiler.cmake b/cmake/VerifyCompiler.cmake index 88fbccc3..cefdc305 100644 --- a/cmake/VerifyCompiler.cmake +++ b/cmake/VerifyCompiler.cmake @@ -30,9 +30,15 @@ if(HIP_COMPILER STREQUAL "nvcc") message(WARNING "On CUDA platform 'g++' is recommended C++ compiler.") endif() elseif(HIP_COMPILER STREQUAL "clang") - if(NOT (HIP_CXX_COMPILER MATCHES ".*hipcc" OR HIP_CXX_COMPILER MATCHES ".*clang\\+\\+")) - message(FATAL_ERROR "On ROCm platform 'hipcc' or HIP-aware Clang must be used as C++ compiler.") + if(USE_HIPCXX) + if(NOT (CMAKE_HIP_COMPILER MATCHES ".*hipcc$" OR CMAKE_HIP_COMPILER MATCHES ".*clang\\+\\+")) + message(FATAL_ERROR "On ROCm platform 'hipcc' or HIP-aware Clang must be used as HIP compiler.") + endif() + else() + if(NOT (CMAKE_CXX_COMPILER MATCHES ".*hipcc$" OR CMAKE_CXX_COMPILER MATCHES ".*clang\\+\\+")) + message(FATAL_ERROR "On ROCm platform 'hipcc' or HIP-aware Clang must be used as C++ compiler.") + endif() endif() else() - message(FATAL_ERROR "HIP_COMPILER must be 'clang' (AMD ROCm platform) or `nvcc` (NVIDIA CUDA platform).") + message(FATAL_ERROR "HIP_COMPILER must be `clang` (AMD ROCm platform)") endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a5406de6..dbdf71aa 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -43,6 +43,10 @@ endforeach() function(add_hipcub_example EXAMPLE_NAME EXAMPLE_SOURCES) list(GET EXAMPLE_SOURCES 0 EXAMPLE_MAIN_SOURCE) get_filename_component(EXAMPLE_TARGET ${EXAMPLE_MAIN_SOURCE} NAME_WE) + if(USE_HIPCXX) + set_source_files_properties(${EXAMPLE_SOURCES} PROPERTIES LANGUAGE HIP) + endif() + add_executable(${EXAMPLE_TARGET} ${EXAMPLE_SOURCES}) target_include_directories(${EXAMPLE_TARGET} SYSTEM BEFORE PUBLIC diff --git a/test/hipcub/CMakeLists.txt b/test/hipcub/CMakeLists.txt index f3243ccd..2eb56a75 100644 --- a/test/hipcub/CMakeLists.txt +++ b/test/hipcub/CMakeLists.txt @@ -34,6 +34,10 @@ function(add_hipcub_test TEST_NAME TEST_SOURCES) endfunction() function(add_hipcub_test_internal TEST_NAME TEST_SOURCES TEST_TARGET) + if(USE_HIPCXX) + set_source_files_properties(${TEST_SOURCES} PROPERTIES LANGUAGE HIP) + endif() + add_executable(${TEST_TARGET} ${TEST_SOURCES}) target_link_libraries(${TEST_TARGET} PRIVATE