Files
rocm-systems/CMakeLists.txt
T

753 wiersze
28 KiB
CMake
Czysty Zwykły widok Historia

2023-05-25 16:08:54 -06:00
# Copyright (c) 2019-2023 Advanced Micro Devices, Inc. All rights reserved.
2022-12-13 07:51:04 +08:00
# Modifications Copyright (c) Microsoft Corporation. Licensed under the MIT License.
2019-07-05 15:43:00 -07:00
cmake_minimum_required(VERSION 3.5)
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
# RCCL project
#==================================================================================================
project(rccl CXX)
2021-04-14 08:29:00 -07:00
2023-05-25 16:08:54 -06:00
# Build options
#==================================================================================================
option(BUILD_ADDRESS_SANITIZER "Enable address sanitizer" OFF)
option(BUILD_ALLREDUCE_ONLY "AllReduce(sum,float) kernel only" OFF)
2023-09-22 13:05:11 +00:00
option(BUILD_BFD "Enable custom backtrace (if bfd.h exists)" OFF)
option(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY "File/folder reorg with backward compatibility" OFF)
2023-05-25 16:08:54 -06:00
option(BUILD_LOCAL_GPU_TARGET_ONLY "Build only for GPUs detected on this machine" OFF)
option(BUILD_SHARED_LIBS "Build as shared library" ON)
option(BUILD_TESTS "Build unit test programs" OFF)
option(COLLTRACE "Collective Trace Option" ON)
option(ENABLE_MSCCL_KERNEL "Enable MSCCL while compiling" ON)
2023-07-21 07:31:27 -07:00
option(ENABLE_IFC "Enable indirect function call" OFF)
2023-05-25 16:08:54 -06:00
option(INSTALL_DEPENDENCIES "Force install dependencies" OFF)
option(PROFILE "Enable profiling" OFF)
option(TIMETRACE "Enable time-trace during compilation" OFF)
option(TRACE "Enable additional tracing" OFF)
# Default GPU architectures to build
#==================================================================================================
set(DEFAULT_GPUS
gfx803
gfx900:xnack-
gfx906:xnack-
gfx908:xnack-
gfx90a:xnack-
gfx90a:xnack+
2023-07-21 07:31:27 -07:00
gfx940
gfx941
gfx942
2023-05-25 16:08:54 -06:00
gfx1030
gfx1100
gfx1101
gfx1102)
# Load CMake modules
#==================================================================================================
include(CheckIncludeFiles)
include(CheckSymbolExists)
include(cmake/Dependencies.cmake) # GTest, rocm-cmake, rocm_local_targets
# Determine which GPU architectures to build for
if (BUILD_LOCAL_GPU_TARGET_ONLY)
message(STATUS "Building only for local GPU target")
if (COMMAND rocm_local_targets)
rocm_local_targets(DEFAULT_GPUS)
else()
message(WARNING "Unable to determine local GPU targets. Falling back to default GPUs")
endif()
endif()
2023-05-25 16:08:54 -06:00
if(COMMAND rocm_check_target_ids)
message(STATUS "Checking for ROCm support for GPU targets:")
rocm_check_target_ids(SUPPORTED_GPUS TARGETS ${DEFAULT_GPUS})
else()
message(WARNING "Unable to check for supported GPU targets. Falling back to default GPUs")
set(SUPPORTED_GPUS ${DEFAULT_GPUS})
endif()
set(AMDGPU_TARGETS "${SUPPORTED_GPUS}" CACHE STRING "AMD GPU targets to compile for" FORCE)
set(GPU_TARGETS "${AMDGPU_TARGETS}" CACHE STRING "GPU targets to compile for" FORCE)
message(STATUS "Compiling for ${GPU_TARGETS}")
2023-05-25 16:08:54 -06:00
## NOTE: Reload rocm-cmake in order to update GPU_TARGETS
include(cmake/Dependencies.cmake) # Reloading to use desired GPU_TARGETS instead of defaults
# Try to establish ROCM_PATH (for find_package)
#==================================================================================================
if(NOT DEFINED ROCM_PATH)
2023-05-25 16:08:54 -06:00
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()
else()
message(STATUS "ROCM_PATH found: ${ROCM_PATH}")
endif()
2023-05-25 16:08:54 -06:00
# Set CMAKE flags
#==================================================================================================
set(CMAKE_INSTALL_PREFIX "${ROCM_PATH}" CACHE PATH "")
2023-05-25 16:08:54 -06:00
set(CMAKE_CXX_STANDARD 14) # We use C++14 features, this will add compile option: -std=c++14
set(CMAKE_CXX_EXTENSIONS OFF) # Without this line, it will add -std=gnu++14 instead, which has some issues.
list(APPEND CMAKE_PREFIX_PATH # Add ROCM_PATH to CMake search paths (for finding HIP / HSA
${ROCM_PATH}
${ROCM_PATH}/hip
${ROCM_PATH}/llvm
${ROCM_PATH}/hcc)
2023-05-25 16:08:54 -06:00
# Check for required dependencies
#==================================================================================================
## Check for Threads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
## Check for HIP
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)")
endif()
find_program(hipcc_executable hipcc)
message(STATUS "hipcc executable: ${hipcc_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}")
2023-11-15 12:36:31 -07:00
## Check for ROCm version
execute_process(
COMMAND bash "-c" "cat ${ROCM_PATH}/.info/version"
OUTPUT_VARIABLE rocm_version_string
)
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" rocm_version_matches ${rocm_version_string})
if (rocm_version_matches)
set(ROCM_MAJOR_VERSION ${CMAKE_MATCH_1})
set(ROCM_MINOR_VERSION ${CMAKE_MATCH_2})
set(ROCM_PATCH_VERSION ${CMAKE_MATCH_3})
message(STATUS "ROCm version: ${ROCM_MAJOR_VERSION}.${ROCM_MINOR_VERSION}.${ROCM_PATCH_VERSION}")
# Convert the version components to int for comparison
math(EXPR ROCM_VERSION "(10000 * ${ROCM_MAJOR_VERSION}) + (100 * ${ROCM_MINOR_VERSION}) + ${ROCM_PATCH_VERSION}")
add_definitions("-DROCM_VERSION=${ROCM_VERSION}")
else()
message(WARNING "Failed to extract ROCm version.")
endif()
2023-05-25 16:08:54 -06:00
### Check for hipEventDisableSystemFence support
check_symbol_exists("hipEventDisableSystemFence" "hip/hip_runtime_api.h" HIP_EVENT_DISABLE_FENCE)
2023-09-12 15:34:40 -04:00
### Check for hipDeviceMallocUncached support
check_symbol_exists("hipDeviceMallocUncached" "hip/hip_runtime_api.h" HIP_UNCACHED_MEMORY)
2023-05-25 16:08:54 -06:00
### Check for indirect function call support
if(ENABLE_IFC)
if(${hipcc_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")
endif()
endif()
## Check for hsa-runtime64
find_package(hsa-runtime64 REQUIRED)
get_target_property(HSA_INCLUDE_PATH hsa-runtime64::hsa-runtime64 INTERFACE_INCLUDE_DIRECTORIES)
message(STATUS "HSA runtime: ${HSA_INCLUDE_PATH}")
## Check for ROCM-smi
find_package(rocm_smi PATHS ${ROCM_PATH}/lib/cmake/rocm_smi)
if (rocm_smi_FOUND)
message(STATUS "Found rocm_smi at ${ROCM_SMI_INCLUDE_DIR}")
else()
2023-05-25 16:08:54 -06:00
message(STATUS "Checking old include directory structure for rocm_smi")
set(ROCM_SMI_INCLUDE_DIR "${ROCM_PATH}/rocm_smi/include")
set(ROCM_SMI_LIB_DIR "${ROCM_PATH}/rocm_smi/lib")
set(ROCM_SMI_LIBRARIES rocm_smi64)
endif()
check_include_file_cxx("${ROCM_SMI_INCLUDE_DIR}/rocm_smi/rocm_smi64Config.h" HAVE_ROCM_SMI64CONFIG)
## Check for BFD library if custom backtrace is requested
if(BUILD_BFD)
enable_language(C)
check_include_files(bfd.h HAVE_BFD)
if (HAVE_BFD)
message(STATUS "-- Found BFD support")
# Check for specific BFD feature support
CHECK_SYMBOL_EXISTS(bfd_get_section_flags "bfd.h" HAVE_DECL_BFD_GET_SECTION_FLAGS)
CHECK_SYMBOL_EXISTS(bfd_get_section_vma "bfd.h" HAVE_DECL_BFD_GET_SECTION_VMA)
CHECK_CXX_SOURCE_COMPILES(
"#include <bfd.h>
int main (int argc, char **argv){
bfd_size_type size;
bfd abfd;
asection sec;
size = bfd_section_size(&abfd, &sec);
return (int)(size);
}"
HAVE_TWO_ARG_BFD_SECTION_SIZE)
# Check for iberty support
find_library(HAVE_IBERTY iberty PATHS /usr/lib64 /usr/lib/ PATH_SUFFIXES x86_64-linux-gnu)
if(HAVE_IBERTY)
message(STATUS "iberty found @ ${HAVE_IBERTY}")
endif()
# Check for demangle support
find_path(DEMANGLE_DIR demangle.h PATHS /usr/include PATH_SUFFIXES libiberty)
if(NOT DEMANGLE_DIR)
message(WARNING "Could not find demangle.h ${DEMANGLE_DIR}")
2021-04-14 08:29:00 -07:00
else()
2023-05-25 16:08:54 -06:00
message(STATUS "Found demangle.h in ${DEMANGLE_DIR}")
2021-04-14 08:29:00 -07:00
endif()
2023-05-25 16:08:54 -06:00
else()
message(WARNING "bfd.h header not found - Disabling custom backtrace")
endif()
endif()
# Check for --amdgpu-kernarg-preload-count
check_cxx_compiler_flag("-mllvm --amdgpu-kernarg-preload-count=16" HAVE_KERNARG_PRELOAD)
if (HAVE_KERNARG_PRELOAD)
message(STATUS "Kernarg preloading to SGPR enabled")
endif()
2023-05-25 16:08:54 -06:00
# Determine version from makefiles/version.mk and fill in templates
#==================================================================================================
## parse version from Makefile NCCL_MAJOR, NCCL_MINOR, NCCL_PATCH must exist
## NCCL_SUFFIX is optional
## NCCL_VERSION formatting is ((X) * 1000 + (Y) * 100 + (Z)) so we must first detect one or two digits first
2019-07-05 15:43:00 -07:00
file(READ makefiles/version.mk version_mk_text)
if("${version_mk_text}" MATCHES "NCCL_MAJOR *:= *([0-9]*)")
set(NCCL_MAJOR ${CMAKE_MATCH_1})
else()
message(FATAL_ERROR "Failed to parse NCCL_MAJOR")
endif()
if("${version_mk_text}" MATCHES "NCCL_MINOR *:= *([0-9]*)")
set(NCCL_MINOR ${CMAKE_MATCH_1})
else()
message(FATAL_ERROR "Failed to parse NCCL_MINOR")
endif()
if("${version_mk_text}" MATCHES "NCCL_PATCH *:= *([0-9]*)")
set(NCCL_PATCH ${CMAKE_MATCH_1})
else()
message(FATAL_ERROR "Failed to parse NCCL_PATCH")
endif()
if("${version_mk_text}" MATCHES "NCCL_SUFFIX *:= *([0-9]*)")
set(NCCL_SUFFIX ${CMAKE_MATCH_1})
else()
set(NCCL_SUFFIX)
endif()
if("${version_mk_text}" MATCHES "PKG_REVISION *:= *([0-9]*)")
set(PKG_REVISION ${CMAKE_MATCH_1})
else()
message(FATAL_ERROR "Failed to parse PKG_REVISION")
endif()
if("${NCCL_PATCH}" MATCHES "[0-9][0-9]")
set(NCCL_VERSION "${NCCL_MAJOR}${NCCL_MINOR}${NCCL_PATCH}")
else()
set(NCCL_VERSION "${NCCL_MAJOR}${NCCL_MINOR}0${NCCL_PATCH}")
endif()
2023-05-25 16:08:54 -06:00
## Setup VERSION
2020-07-20 14:43:00 -07:00
set(VERSION_STRING "${NCCL_MAJOR}.${NCCL_MINOR}.${NCCL_PATCH}")
rocm_setup_version(VERSION ${VERSION_STRING})
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
## Fill in version information for main header file
configure_file(src/nccl.h.in ${PROJECT_BINARY_DIR}/include/rccl/rccl.h) # For external linking
configure_file(src/nccl.h.in ${PROJECT_BINARY_DIR}/include/nccl.h) # Used by some internal files
# Collect list of all source files
#==================================================================================================
# E.g: find src -type f \( -name "*.cc" -o -name "*.h" -o -name "*.hpp" \) | sort
set(SRC_FILES
src/bootstrap.cc
src/channel.cc
# src/clique/AllReduceCliqueKernel.h
# src/clique/CliqueCommon.h
# src/clique/CliqueManager.cc
# src/clique/CliqueManager.h
# src/clique/CliqueShmNames.h
# src/clique/HandleCache.cc
# src/clique/HandleCache.h
# src/clique/HandleShm.cc
# src/clique/HandleShm.h
# src/clique/Hash.cc
# src/clique/Hash.h
# src/clique/MsgQueue.cc
# src/clique/MsgQueue.h
# src/clique/SharedMemHelper.h
# src/clique/ShmObject.cc
# src/clique/ShmObject.h
src/collectives/all_gather.cc
src/collectives/all_reduce.cc
src/collectives/all_to_all.cc
src/collectives/all_to_allv.cc
src/collectives/broadcast.cc
2023-08-09 11:39:21 -06:00
src/collectives/msccl.cc
2023-05-25 16:08:54 -06:00
src/collectives/device/all_gather.h
src/collectives/device/all_reduce.h
src/collectives/device/alltoall_pivot.h
src/collectives/device/broadcast.h
src/collectives/device/common.h
src/collectives/device/common_kernel.h
src/collectives/device/op128.h
src/collectives/device/primitives.h
src/collectives/device/prims_ll128.h
src/collectives/device/prims_ll.h
src/collectives/device/prims_simple.h
src/collectives/device/reduce.h
src/collectives/device/reduce_kernel.h
src/collectives/device/reduce_scatter.h
src/collectives/device/sendrecv.h
src/collectives/gather.cc
src/collectives/reduce.cc
src/collectives/reduce_scatter.cc
src/collectives/scatter.cc
src/collectives/sendrecv.cc
src/debug.cc
src/enhcompat.cc
src/enqueue.cc
src/graph/connect.cc
src/graph/paths.cc
src/graph/rings.cc
src/graph/rings.h
src/graph/rome_models.cc
src/graph/rome_models.h
src/graph/search.cc
src/graph/topo.cc
src/graph/topo.h
src/graph/trees.cc
src/graph/tuning.cc
src/graph/xml.cc
src/graph/xml.h
src/group.cc
2023-09-12 15:34:40 -04:00
src/include/archinfo.h
2022-11-07 14:09:26 -08:00
src/include/align.h
src/include/alloc.h
2023-05-25 16:08:54 -06:00
src/include/argcheck.h
src/include/BfdBacktrace.hpp
src/include/bootstrap.h
src/include/channel.h
2022-11-07 14:09:26 -08:00
src/include/checks.h
2023-05-25 16:08:54 -06:00
src/include/collectives.h
2022-11-07 14:09:26 -08:00
src/include/coll_net.h
2023-05-25 16:08:54 -06:00
src/include/comm.h
src/include/core.h
src/include/cpuset.h
# src/include/cudawrap.h
src/include/debug.h
2022-11-07 14:09:26 -08:00
src/include/devcomm.h
src/include/enqueue.h
2023-05-25 16:08:54 -06:00
src/include/gdrwrap.h
src/include/git_version.h
2022-11-07 14:09:26 -08:00
src/include/graph.h
2023-05-25 16:08:54 -06:00
src/include/group.h
src/include/ibvcore.h
src/include/ibvsymbols.h
2023-05-25 16:08:54 -06:00
src/include/ibvwrap.h
2022-11-07 14:09:26 -08:00
src/include/info.h
src/include/ipcsocket.h
2023-05-25 16:08:54 -06:00
src/include/msccl/msccl_lifecycle.h
src/include/msccl/msccl_parser.h
src/include/msccl/msccl_scheduler.h
src/include/msccl/msccl_setup.h
src/include/msccl/msccl_status.h
src/include/msccl/msccl_struct.h
src/include/nccl_net.h
src/include/net.h
2022-11-07 14:09:26 -08:00
src/include/npkit/npkit_event.h
src/include/npkit/npkit.h
src/include/npkit/npkit_struct.h
2023-05-25 16:08:54 -06:00
src/include/nvmlwrap.h
src/include/nvtx3/nvToolsExtCuda.h
src/include/nvtx3/nvToolsExtCudaRt.h
src/include/nvtx3/nvToolsExt.h
2023-05-25 16:08:54 -06:00
src/include/nvtx3/nvToolsExtOpenCL.h
src/include/nvtx3/nvToolsExtPayload.h
src/include/nvtx3/nvToolsExtSync.h
src/include/nvtx3/nvtx3.hpp
src/include/nvtx3/nvtxDetail/nvtxImplCore.h
2022-11-07 14:09:26 -08:00
src/include/nvtx3/nvtxDetail/nvtxImplCudaRt_v3.h
2023-05-25 16:08:54 -06:00
src/include/nvtx3/nvtxDetail/nvtxImplCuda_v3.h
2022-11-07 14:09:26 -08:00
src/include/nvtx3/nvtxDetail/nvtxImpl.h
2023-05-25 16:08:54 -06:00
src/include/nvtx3/nvtxDetail/nvtxImplOpenCL_v3.h
2022-11-07 14:09:26 -08:00
src/include/nvtx3/nvtxDetail/nvtxImplSync_v3.h
src/include/nvtx3/nvtxDetail/nvtxInitDecls.h
src/include/nvtx3/nvtxDetail/nvtxInitDefs.h
src/include/nvtx3/nvtxDetail/nvtxInit.h
2023-05-25 16:08:54 -06:00
src/include/nvtx3/nvtxDetail/nvtxLinkOnce.h
src/include/nvtx3/nvtxDetail/nvtxTypes.h
src/include/nvtx3/nvtxExtDetail/nvtxExtImpl.h
src/include/nvtx3/nvtxExtDetail/nvtxExtImplPayload_v1.h
src/include/nvtx3/nvtxExtDetail/nvtxExtInit.h
2023-05-25 16:08:54 -06:00
src/include/nvtx3/nvtxExtDetail/nvtxExtPayloadTypeInfo.h
src/include/nvtx3/nvtxExtDetail/nvtxExtTypes.h
src/include/nvtx.h
src/include/nvtx_stub.h
src/include/p2p.h
src/include/param.h
src/include/profiler.h
src/include/proxy.h
src/include/rccl_bfloat16.h
src/include/rccl_vars.h
src/include/rocm_smi_wrap.h
src/include/rocmwrap.h
src/include/shm.h
src/include/signals.h
src/include/socket.h
src/include/strongstream.h
src/include/timer.h
src/include/transport.h
src/include/trees.h
src/include/utils.h
src/init.cc
# src/init_nvtx.cc
2023-09-12 15:34:40 -04:00
src/misc/archinfo.cc
2023-05-25 16:08:54 -06:00
src/misc/argcheck.cc
# src/misc/cudawrap.cc
# src/misc/gdrwrap.cc
src/misc/ibvsymbols.cc
2023-05-25 16:08:54 -06:00
src/misc/ibvwrap.cc
src/misc/ipcsocket.cc
src/misc/msccl/msccl_lifecycle.cc
src/misc/msccl/msccl_parser.cc
src/misc/msccl/msccl_setup.cc
src/misc/msccl/msccl_status.cc
src/misc/npkit.cc
# src/misc/nvmlwrap.cc
src/misc/nvmlwrap_stub.cc
src/misc/param.cc
src/misc/profiler.cc
src/misc/rocm_smi_wrap.cc
src/misc/rocmwrap.cc
src/misc/shmutils.cc
src/misc/signals.cc
src/misc/socket.cc
src/misc/strongstream.cc
src/misc/utils.cc
src/net.cc
src/proxy.cc
src/transport.cc
src/transport/coll_net.cc
src/transport/net.cc
src/transport/net_ib.cc
src/transport/net_socket.cc
src/transport/nvls.cc
src/transport/p2p.cc
src/transport/shm.cc
)
## Add kernel files
## E.g: find src -type f \( -name "*.u" \) | sort
if (BUILD_ALLREDUCE_ONLY)
add_definitions(-DBUILD_ALLREDUCE_ONLY)
set(CU_SOURCES
# src/collectives/device/all_reduce.cu
2023-05-25 16:08:54 -06:00
src/collectives/device/sendrecv.cu
src/collectives/device/functions.cu
# src/collectives/device/msccl_kernel.cu
)
2023-05-25 16:08:54 -06:00
else()
set(CU_SOURCES
src/collectives/device/all_gather.cu
# src/collectives/device/all_reduce.cu
2023-05-25 16:08:54 -06:00
src/collectives/device/alltoall_pivot.cu
src/collectives/device/broadcast.cu
src/collectives/device/functions.cu
# src/collectives/device/msccl_kernel.cu
2023-05-25 16:08:54 -06:00
src/collectives/device/onerank_reduce.cu
# src/collectives/device/reduce.cu
# src/collectives/device/reduce_scatter.cu
2023-05-25 16:08:54 -06:00
src/collectives/device/sendrecv.cu)
endif()
list(APPEND SRC_FILES ${CU_SOURCES})
if (ENABLE_MSCCL_KERNEL)
set(MSCCL_KERNEL_SOURCES
src/collectives/device/msccl_kernel_impl.h
src/include/msccl/msccl_kernel.h
)
list(APPEND SRC_FILES ${MSCCL_KERNEL_SOURCES})
endif()
2023-05-25 16:08:54 -06:00
# Hipify source files (copy of source generated into hipify directory)
#==================================================================================================
find_program(hipify-perl_executable hipify-perl)
set(HIPIFY_DIR "${CMAKE_CURRENT_BINARY_DIR}/hipify")
## Loop over each source file to hipify
foreach(SRC_FILE ${SRC_FILES})
# Check that file exists
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/${SRC_FILE})
message(FATAL_ERROR "Unable to find file listed in CMakeLists.txt: ${CMAKE_SOURCE_DIR}/${SRC_FILE}")
endif()
# Establish hipified copy of the source file
set(HIP_FILE "${HIPIFY_DIR}/${SRC_FILE}")
get_filename_component(HIP_FILE_DIR ${HIP_FILE} DIRECTORY)
# Convert .cu files to .cpp so that they get processed properly
string(REPLACE "\.cu" "\.cu.cpp" HIP_FILE ${HIP_FILE})
list(APPEND HIP_SOURCES ${HIP_FILE})
# Create a custom command to create hipified source code
add_custom_command(
OUTPUT ${HIP_FILE}
COMMAND mkdir -p ${HIP_FILE_DIR} && $ ${hipify-perl_executable} -quiet-warnings ${CMAKE_SOURCE_DIR}/${SRC_FILE} -o ${HIP_FILE}
MAIN_DEPENDENCY ${SRC_FILE}
COMMENT "Hipifying ${SRC_FILE} -> ${HIP_FILE}"
)
endforeach()
expand_collectives("all_reduce" "AllReduce")
expand_collectives("reduce" "Reduce")
expand_collectives("reduce_scatter" "ReduceScatter")
if(ENABLE_MSCCL_KERNEL)
expand_collectives("msccl_kernel" "MscclKernel")
endif()
2023-05-25 16:08:54 -06:00
# Create an initial git_version.cpp file (that will be updated with latest git version)
#==================================================================================================
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/git_version.cpp "")
list(APPEND HIP_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/git_version.cpp)
# Create a custom target that updates git_version.cpp and executes whenever rccl is built
add_custom_target(git_version_check
COMMENT "Updating git_version.cpp if necessary"
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/git_version.cmake
VERBATIM
)
2023-05-25 16:08:54 -06:00
# Set up RCCL library
#==================================================================================================
## Set RCCL source files
add_library(rccl ${HIP_SOURCES})
## Set RCCL dependencies
add_dependencies(rccl git_version_check) # Execute git_version_check during build
## Set RCCL include directories
target_include_directories(rccl PRIVATE ${PROJECT_BINARY_DIR}/include) # for generated rccl.h header
target_include_directories(rccl PRIVATE ${HIPIFY_DIR}/src) # for hipfied headers
target_include_directories(rccl PRIVATE ${HIPIFY_DIR}/src/include)
target_include_directories(rccl PRIVATE ${HIPIFY_DIR}/src/collectives)
target_include_directories(rccl PRIVATE ${HIPIFY_DIR}/src/collectives/device)
target_include_directories(rccl PRIVATE ${HSA_INCLUDE_PATH})
target_include_directories(rccl PRIVATE ${ROCM_SMI_INCLUDE_DIR})
if(DEMANGLE_DIR)
target_include_directories(rccl PRIVATE ${DEMANGLE_DIR})
2019-07-05 15:43:00 -07:00
endif()
2023-05-25 16:08:54 -06:00
## Set RCCL compile definitions
target_compile_definitions(rccl PRIVATE NVTX_NO_IMPL) # NVTX is not supported
if(COLLTRACE)
target_compile_definitions(rccl PRIVATE ENABLE_COLLTRACE)
endif()
if(ENABLE_MSCCL_KERNEL)
target_compile_definitions(rccl PRIVATE COMPILE_MSCCL_KERNEL)
endif()
2023-05-25 16:08:54 -06:00
if(HAVE_ROCM_SMI64CONFIG)
target_compile_definitions(rccl PRIVATE USE_ROCM_SMI64CONFIG)
2019-07-05 15:43:00 -07:00
endif()
if(NPKIT_FLAGS)
2023-05-25 16:08:54 -06:00
target_compile_definitions(rccl PRIVATE ${NPKIT_FLAGS})
endif()
2023-05-25 16:08:54 -06:00
if(PROFILE)
target_compile_definitions(rccl PRIVATE ENABLE_PROFILING)
2019-11-26 16:33:13 -08:00
endif()
2023-05-25 16:08:54 -06:00
if(TRACE)
target_compile_definitions(rccl PRIVATE ENABLE_TRACE)
endif()
if(${HIP_EVENT_DISABLE_FENCE})
target_compile_definitions(rccl PRIVATE HIP_EVENT_DISABLE_FENCE)
endif()
if(${hipcc_version_string} VERSION_GREATER_EQUAL "5.7.31920")
target_compile_definitions(rccl PRIVATE HIP_UNCACHED_MEMORY)
message(STATUS "HIP_UNCACHED_MEMORY enabled")
else()
# keep --hipcc-func-supp on older HIP and compiler
if(NOT IFC_ENABLED)
target_compile_options(rccl PRIVATE --hipcc-func-supp)
endif()
2023-07-21 07:31:27 -07:00
endif()
2023-05-25 16:08:54 -06:00
if (BUILD_BFD)
if (HAVE_BFD)
target_compile_definitions(rccl PRIVATE HAVE_BFD)
endif()
if (HAVE_DECL_BFD_GET_SECTION_FLAGS)
2023-05-25 16:08:54 -06:00
target_compile_definitions(rccl PRIVATE HAVE_DECL_BFD_GET_SECTION_FLAGS)
endif()
if (HAVE_DECL_BFD_GET_SECTION_VMA)
2023-05-25 16:08:54 -06:00
target_compile_definitions(rccl PRIVATE HAVE_DECL_BFD_GET_SECTION_VMA)
endif()
if (HAVE_TWO_ARG_BFD_SECTION_SIZE)
2023-05-25 16:08:54 -06:00
target_compile_definitions(rccl PRIVATE HAVE_TWO_ARG_BFD_SECTION_SIZE)
endif()
endif()
2023-05-25 16:08:54 -06:00
if (IFC_ENABLED)
target_compile_definitions(rccl PRIVATE USE_INDIRECT_FUNCTION_CALL)
endif()
if(DEMANGLE_DIR)
target_compile_definitions(rccl PRIVATE "HAVE_CPLUS_DEMANGLE=1")
target_compile_definitions(rccl PRIVATE "HAVE_DECL_BASENAME=1")
endif()
2023-05-25 16:08:54 -06:00
## Set RCCL compile options
target_compile_options(rccl PRIVATE -parallel-jobs=12)
target_compile_options(rccl PRIVATE -Wno-format-nonliteral)
target_compile_options(rccl PRIVATE -fgpu-rdc) # Generate relocatable device code (required for extern __shared__)
target_compile_options(rccl PRIVATE -fvisibility=hidden) # Set symbol visibility to hidden by default
if (HAVE_KERNARG_PRELOAD)
target_compile_options(rccl PRIVATE -mllvm --amdgpu-kernarg-preload-count=16)
endif()
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
## NOTE: This is currently being handled by rocm-cmake, however may need to be re-enabled in the future
#foreach(target ${GPU_TARGETS})
# target_compile_options(rccl PRIVATE --offload-arch=${target})
#endforeach()
2020-08-31 16:10:09 +00:00
2023-05-25 16:08:54 -06:00
if(BUILD_ADDRESS_SANITIZER)
2023-10-19 16:13:39 -07:00
target_compile_options(rccl PRIVATE -fsanitize=address -shared-libasan)
2019-07-05 15:43:00 -07:00
endif()
2023-05-25 16:08:54 -06:00
if(TIMETRACE)
target_compile_options(rccl PRIVATE -ftime-trace)
endif()
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
## Set RCCL linked library directories
target_link_directories(rccl PRIVATE ${ROCM_SMI_LIB_DIR})
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
## Set RCCL linked libraries
if (HAS_BFD)
target_link_libraries(rccl PRIVATE bfd)
if(HAVE_IBERTY)
2023-05-25 16:08:54 -06:00
target_link_libraries(rccl PRIVATE iberty z)
endif()
endif()
target_link_libraries(rccl PRIVATE -fgpu-rdc) # Required when linking relocatable device code
2023-05-25 16:08:54 -06:00
## Set RCCL link options
target_link_options(rccl PRIVATE -parallel-jobs=16) # Use multiple threads to link
2023-05-25 16:08:54 -06:00
if(BUILD_ADDRESS_SANITIZER)
target_link_options(rccl PRIVATE -fuse-ld=lld)
endif()
if(TIMETRACE)
target_link_options(rccl PRIVATE -ftime-trace)
endif()
2023-05-25 16:08:54 -06:00
if(NOT BUILD_SHARED_LIBS)
message(STATUS "Building static RCCL library")
target_link_libraries(rccl PRIVATE --emit-static-lib)
2023-05-25 16:08:54 -06:00
set(CMAKE_AR "${hipcc_executable}")
get_property(link_libraries TARGET rccl PROPERTY LINK_LIBRARIES)
string (REPLACE ";" " " LINK_PROPS "${link_libraries}")
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -o <TARGET> ${LINK_PROPS} <LINK_FLAGS> <OBJECTS>")
else()
message(STATUS "Building shared RCCL library")
endif()
if (HAVE_KERNARG_PRELOAD)
target_link_options(rccl PRIVATE -mllvm --amdgpu-kernarg-preload-count=16)
endif()
2023-05-25 16:08:54 -06:00
target_link_libraries(rccl PRIVATE Threads::Threads)
target_link_libraries(rccl INTERFACE hip::host)
2023-11-07 13:40:41 -07:00
target_link_libraries(rccl PRIVATE hip::device)
target_link_libraries(rccl PRIVATE dl)
target_link_libraries(rccl PRIVATE ${ROCM_SMI_LIBRARIES})
2023-05-25 16:08:54 -06:00
## Track linking time
set_property(TARGET rccl PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time")
## Setup librccl.so version
rocm_set_soversion(rccl "1.0")
2023-05-25 16:08:54 -06:00
# Install settings
#==================================================================================================
## Specify install targets
rocm_install_targets(TARGETS rccl)
rocm_install(FILES ${PROJECT_BINARY_DIR}/include/rccl/rccl.h src/include/nccl_net.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/rccl)
file(COPY tools/msccl-algorithms DESTINATION ${PROJECT_BINARY_DIR})
file(COPY tools/msccl-unit-test-algorithms DESTINATION ${PROJECT_BINARY_DIR})
## Install Algorithm files under share folder
install(DIRECTORY ${PROJECT_BINARY_DIR}/msccl-algorithms DESTINATION ${CMAKE_INSTALL_DATADIR}/rccl)
install(DIRECTORY ${PROJECT_BINARY_DIR}/msccl-unit-test-algorithms DESTINATION ${CMAKE_INSTALL_DATADIR}/rccl)
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
rocm_export_targets(
NAMESPACE roc::
TARGETS rccl
DEPENDS hip)
## Build with backwards compatibility if requested
if(BUILD_FILE_REORG_BACKWARD_COMPATIBILITY)
2023-05-25 16:08:54 -06:00
### Create wrapper files
rocm_wrap_header_dir(
"${PROJECT_BINARY_DIR}/include/rccl"
PATTERNS "rccl.h"
GUARDS SYMLINK WRAPPER
WRAPPER_LOCATIONS ${CMAKE_INSTALL_INCLUDEDIR} rccl/${CMAKE_INSTALL_INCLUDEDIR})
### install the wrapper header file to package
rocm_install(
FILES ${PROJECT_BINARY_DIR}/rccl/include/rccl.h src/include/nccl_net.h
DESTINATION "./rccl/${CMAKE_INSTALL_INCLUDEDIR}/" )
rocm_install(
FILES ${PROJECT_BINARY_DIR}/include/rccl.h src/include/nccl_net.h
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/" )
endif()
2019-07-05 15:43:00 -07:00
2023-05-25 16:08:54 -06:00
## Set package dependencies
rocm_package_add_dependencies(DEPENDS "hip-rocclr >= 3.5.0" "rocm-smi-lib >= 4.0.0")
2020-10-21 16:20:53 -07:00
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/opt" "${ROCM_PATH}")
2019-07-05 15:43:00 -07:00
2020-10-21 16:20:53 -07:00
find_file (DEBIAN debian_version debconf.conf PATHS /etc)
if(DEBIAN)
# Write copyright file
file(WRITE "${CMAKE_BINARY_DIR}/copyright"
"Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: rccl
Source: https://github.com/ROCmSoftwarePlatform/rccl
Files: *
Copyright: (c) 2016-2020, NVIDIA CORPORATION. All rights reserved.
Modifications Copyright (c) 2020-2023 Advanced Micro Devices, Inc. All rights reserved.
Modifications Copyright (c) Microsoft Corporation. Licensed under the MIT License.
2020-10-21 16:20:53 -07:00
License: See LICENSE.txt for license information\n")
install(FILES "${CMAKE_BINARY_DIR}/copyright" DESTINATION ${CMAKE_INSTALL_DATADIR}/rccl)
2020-10-21 16:20:53 -07:00
# Write changelog file
find_program( date_executable date )
execute_process(COMMAND ${date_executable} -R OUTPUT_VARIABLE TIMESTAMP)
file(WRITE "${CMAKE_BINARY_DIR}/changelog"
"rccl (${VERSION_STRING}-1) unstable; urgency=medium
* Initial release.
-- RCCL Maintainer <rccl-maintainer@amd.com> ${TIMESTAMP}\n")
find_program( gzip_executable gzip )
execute_process(COMMAND bash "-c" "${gzip_executable} -9 -c ${CMAKE_BINARY_DIR}/changelog"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE "${CMAKE_BINARY_DIR}/changelog.Debian.gz")
install(FILES "${CMAKE_BINARY_DIR}/changelog.Debian.gz" DESTINATION ${CMAKE_INSTALL_DATADIR}/rccl)
2020-10-21 16:20:53 -07:00
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "ROCm Communication Collectives Library
Optimized primitives for collective multi-GPU communication")
endif()
if(BUILD_TESTS)
rocm_package_setup_component(clients)
2023-11-29 15:05:32 -07:00
rocm_package_setup_client_component(tests PACKAGE_NAME rccl-unitTests)
add_subdirectory(test)
endif()
2019-07-05 15:43:00 -07:00
rocm_create_package(
2023-05-25 16:08:54 -06:00
NAME rccl
DESCRIPTION "ROCm Communication Collectives Library"
MAINTAINER "RCCL Maintainer <rccl-maintainer@amd.com>"
2019-07-05 15:43:00 -07:00
LDCONFIG)