From 7c4389ee31ab164bbdecfd7dd7e7bd131cc55c79 Mon Sep 17 00:00:00 2001 From: Nilesh M Negi Date: Sun, 25 Aug 2024 13:44:22 -0400 Subject: [PATCH] [BUILD] Enable RCCL build with amdclang++ (#1128) Signed-off-by: nileshnegi [ROCm/rccl commit: 607e34dd99e6536f562463912a1228f2cf5065dc] --- projects/rccl/CMakeLists.txt | 76 ++++++++++++++++++++--------- projects/rccl/toolchain-linux.cmake | 9 ++-- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/projects/rccl/CMakeLists.txt b/projects/rccl/CMakeLists.txt index ccbbc15a1b..6c9a8a74bc 100644 --- a/projects/rccl/CMakeLists.txt +++ b/projects/rccl/CMakeLists.txt @@ -102,21 +102,27 @@ include(cmake/Dependencies.cmake) # Reloading to use desired GPU_TARGETS instead # Try to establish ROCM_PATH (for find_package) #================================================================================================== if(NOT DEFINED ROCM_PATH) - if("${CMAKE_CXX_COMPILER}" MATCHES ".*hipcc$") - # Guess based on provided compiler location - get_filename_component(_real_path ${CMAKE_CXX_COMPILER} REALPATH) - get_filename_component(_new_path "${_real_path}" DIRECTORY) - get_filename_component(ROCM_PATH "${_new_path}/.." REALPATH) - message(STATUS "Setting ROCM_PATH based on hipcc location to ${ROCM_PATH}") - else() - # Guess default location - set(ROCM_PATH "/opt/rocm") - message(WARNING "Unable to find ROCM_PATH: Falling back to ${ROCM_PATH}") - endif() + # Guess default location + set(ROCM_PATH "/opt/rocm") + message(WARNING "Unable to find ROCM_PATH: Falling back to ${ROCM_PATH}") else() message(STATUS "ROCM_PATH found: ${ROCM_PATH}") endif() +if("${CMAKE_CXX_COMPILER}" MATCHES ".*amdclang\\+\\+") + message(STATUS "Compiling with amdclang++") + set(COMPILER_EXE_NAME amdclang++) + set(COMPILER_GREP_STRING "AMD clang version") + set(COMPILER_AWK_CMD "awk -F\" \" '{ printf $4}'") +elseif("${CMAKE_CXX_COMPILER}" MATCHES ".*hipcc$") + message(STATUS "Compiling with hipcc") + set(COMPILER_EXE_NAME hipcc) + set(COMPILER_GREP_STRING "HIP version") + set(COMPILER_AWK_CMD "awk -F\" \" '{ printf $3}' | awk -F\"-\" '{ printf $1}'") +else() + message(FATAL_ERROR "RCCL can be built only with hipcc or amdclang++") +endif() + # Set CMAKE flags #================================================================================================== set(CMAKE_INSTALL_PREFIX "${ROCM_PATH}" CACHE PATH "") @@ -138,14 +144,24 @@ find_package(hip REQUIRED) message(STATUS "HIP compiler: ${HIP_COMPILER}") message(STATUS "HIP runtime: ${HIP_RUNTIME}") if(NOT "${HIP_COMPILER}" MATCHES "clang") - message(FATAL_ERROR "RCCL requires clang-based compiler (hipcc)") + message(FATAL_ERROR "RCCL requires clang-based compiler (amdclang++ or hipcc)") endif() -find_program(hipcc_executable hipcc) -message(STATUS "hipcc executable: ${hipcc_executable}") + +## Check for compiler version +find_program(compiler_executable ${COMPILER_EXE_NAME}) +message(STATUS "${COMPILER_EXE_NAME} executable: ${compiler_executable}") execute_process( - COMMAND bash "-c" "${hipcc_executable} --version | grep 'HIP version' | awk -F\" \" '{ printf $3}' | awk -F\"-\" '{ printf $1}'" - OUTPUT_VARIABLE hipcc_version_string) -message(STATUS "hipcc version: ${hipcc_version_string}") + COMMAND bash "-c" "${compiler_executable} --version | grep \"${COMPILER_GREP_STRING}\" | ${COMPILER_AWK_CMD}" + OUTPUT_VARIABLE compiler_version_string) +message(STATUS "${COMPILER_EXE_NAME} version: ${compiler_version_string}") + +## Check for HIP version +find_program(hipconfig_executable hipconfig) +message(STATUS "hipconfig executable: ${hipconfig_executable}") +execute_process( + COMMAND bash "-c" "${hipconfig_executable} -v | awk -F\"-\" '{ printf $1 }'" + OUTPUT_VARIABLE hip_version_string) +message(STATUS "${COMPILER_EXE_NAME} HIP version: ${hip_version_string}") ## Check for ROCm version execute_process( @@ -167,20 +183,25 @@ else() message(WARNING "Failed to extract ROCm version.") endif() +### Required for checking HIP device symbols when building with amdclang++ +set(CMAKE_REQUIRED_LIBRARIES hip::device) + ### Check for hipDeviceMallocUncached support check_symbol_exists("hipDeviceMallocUncached" "hip/hip_runtime_api.h" HIP_UNCACHED_MEMORY) ### Check for hipDeviceMallocContiguous support check_symbol_exists("hipDeviceMallocContiguous" "hip/hip_runtime_api.h" HIP_CONTIGUOUS_MEMORY) +unset(CMAKE_REQUIRED_LIBRARIES) + ### Check for indirect function call support if(ENABLE_IFC) - if(${hipcc_version_string} VERSION_GREATER_EQUAL "5.5.30201") + if(${hip_version_string} VERSION_GREATER_EQUAL "5.5.30201") set(IFC_ENABLED ON) message(STATUS "Indirect function call enabled") else() set(IFC_ENABLED OFF) - message(WARNING "Indirect function call disabled - requires hipcc version >= 5.5.30201") + message(WARNING "Indirect function call disabled - requires HIP version >= 5.5.30201") endif() endif() @@ -632,14 +653,21 @@ if(TRACE) endif() if(${HIP_CONTIGUOUS_MEMORY}) target_compile_definitions(rccl PRIVATE HIP_CONTIGUOUS_MEMORY) + message(STATUS "HIP_CONTIGUOUS_MEMORY enabled") +else() + message(STATUS "HIP_CONTIGUOUS_MEMORY disabled") endif() -if(${hipcc_version_string} VERSION_GREATER_EQUAL "5.7.31920") +if(${hip_version_string} VERSION_GREATER_EQUAL "5.7.31920") target_compile_definitions(rccl PRIVATE HIP_UNCACHED_MEMORY) message(STATUS "HIP_UNCACHED_MEMORY enabled") else() + message(STATUS "HIP_UNCACHED_MEMORY disabled - requires HIP version >= 5.7.31920") # keep --hipcc-func-supp on older HIP and compiler if(NOT IFC_ENABLED) target_compile_options(rccl PRIVATE --hipcc-func-supp) + message(STATUS "--hipcc-func-supp enabled") + else() + message(STATUS "--hipcc-func-supp disabled") endif() endif() if (BUILD_BFD) @@ -663,10 +691,12 @@ if(DEMANGLE_DIR) target_compile_definitions(rccl PRIVATE "HAVE_CPLUS_DEMANGLE=1") target_compile_definitions(rccl PRIVATE "HAVE_DECL_BASENAME=1") endif() -if(${hipcc_version_string} VERSION_GREATER_EQUAL "6.1.33591") +if(${hip_version_string} VERSION_GREATER_EQUAL "6.1.33591") set(LL128_ENABLED ON) - target_compile_definitions(rccl PRIVATE ENABLE_LL128) - message(STATUS "RCCL LL128 protocol enabled") + target_compile_definitions(rccl PRIVATE ENABLE_LL128) + message(STATUS "RCCL LL128 protocol enabled") +else() + message(STATUS "RCCL LL128 protocol disabled - requires HIP version >= 6.1.33591") endif() ## Set RCCL compile options diff --git a/projects/rccl/toolchain-linux.cmake b/projects/rccl/toolchain-linux.cmake index 5a5a8b0416..f0893afd60 100644 --- a/projects/rccl/toolchain-linux.cmake +++ b/projects/rccl/toolchain-linux.cmake @@ -7,13 +7,12 @@ else() endif() if (NOT DEFINED ENV{CXX}) - set(CMAKE_CXX_COMPILER "${rocm_bin}/hipcc" CACHE PATH "Path to the C++ compiler") + set(CMAKE_CXX_COMPILER "${rocm_bin}/amdclang++" CACHE PATH "Path to the C++ compiler") else() set(CMAKE_CXX_COMPILER "$ENV{CXX}" CACHE PATH "Path to the C++ compiler") endif() -if (NOT DEFINED ENV{CC}) - set(CMAKE_C_COMPILER "${rocm_bin}/hipcc" CACHE PATH "Path to the C compiler") -else() - set(CMAKE_C_COMPILER "$ENV{CC}" CACHE PATH "Path to the C compiler") +if (NOT DEFINED ENV{CXXFLAGS}) + set(CMAKE_CXX_FLAGS_DEBUG "-g -O1") + set(CMAKE_CXX_FLAGS_RELEASE "-O3") endif()