b0b615091e
`pthread.h` is included in `src/common.h` but lib is not properly
linked, resulting in the build failing with unresolved symbols when
trying to link.
[ROCm/rccl-tests commit: 5b27b961b2]
211 righe
8.1 KiB
CMake
211 righe
8.1 KiB
CMake
# Copyright (c) 2019-2025 Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
# CMake version minimum requirements
|
|
#==================================================================================================
|
|
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
|
|
|
|
# CMake Toolchain file to define compilers and path to ROCm
|
|
#==================================================================================================
|
|
if (NOT CMAKE_TOOLCHAIN_FILE)
|
|
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/toolchain-linux.cmake")
|
|
message(STATUS "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
|
|
endif()
|
|
|
|
# RCCL Tests project
|
|
#==================================================================================================
|
|
project(rccl-tests LANGUAGES CXX)
|
|
|
|
# Build options
|
|
#==================================================================================================
|
|
option(USE_MPI "Build RCCL-tests with MPI support." OFF)
|
|
option(BUILD_LOCAL_GPU_TARGET_ONLY "Build only for GPUs detected on this machine" OFF)
|
|
|
|
if (NOT CMAKE_BUILD_TYPE)
|
|
message(WARNING "CMAKE_BUILD_TYPE is not defined. Setting to Release")
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Default build type")
|
|
endif()
|
|
|
|
# Default GPU architectures to build
|
|
#==================================================================================================
|
|
set(DEFAULT_GPUS
|
|
gfx906
|
|
gfx908
|
|
gfx90a
|
|
gfx942
|
|
gfx950
|
|
gfx1030
|
|
gfx1100
|
|
gfx1101
|
|
gfx1102
|
|
gfx1200
|
|
gfx1201)
|
|
|
|
# Get additional packages required
|
|
include(CheckIncludeFiles)
|
|
include(CheckSymbolExists)
|
|
include(cmake/Dependencies.cmake) # rocm-cmake, rocm_local_targets
|
|
include(cmake/CheckSymbolExistsNoWarn.cmake)
|
|
|
|
# Build only for local GPU architecture
|
|
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()
|
|
|
|
# Determine which GPU architectures to build for
|
|
set(GPU_TARGETS "${DEFAULT_GPUS}" CACHE STRING "Target default GPUs if GPU_TARGETS is not defined.")
|
|
|
|
# Check if clang compiler can offload to GPU_TARGETS
|
|
if (COMMAND rocm_check_target_ids)
|
|
message(STATUS "Checking for ROCm support for GPU targets: " "${GPU_TARGETS}")
|
|
rocm_check_target_ids(SUPPORTED_GPUS TARGETS ${GPU_TARGETS})
|
|
else()
|
|
message(WARNING "Unable to check for supported GPU targets. Falling back to default GPUs.")
|
|
set(SUPPORTED_GPUS ${DEFAULT_GPUS})
|
|
endif()
|
|
|
|
set(GPU_TARGETS "${SUPPORTED_GPUS}")
|
|
message(STATUS "Compiling for ${GPU_TARGETS}")
|
|
|
|
## 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)
|
|
# 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()
|
|
set(ENV{ROCM_PATH} ${ROCM_PATH})
|
|
|
|
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 ".*clang\\+\\+")
|
|
message(STATUS "Compiling with clang++")
|
|
set(COMPILER_EXE_NAME clang++)
|
|
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-Tests can be built only with hipcc or amdclang++")
|
|
endif()
|
|
|
|
# Set CMAKE flags
|
|
#==================================================================================================
|
|
set(CMAKE_INSTALL_PREFIX "${ROCM_PATH}" CACHE PATH "")
|
|
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.
|
|
set(CPACK_PACKAGING_INSTALL_PREFIX "${ROCM_PATH}" CACHE PATH "Path to install to when packaged.")
|
|
if(ROCM_PATH)
|
|
#list(APPEND CMAKE_PREFIX_PATH # Temporary workaround
|
|
list(PREPEND CMAKE_PREFIX_PATH # Add ROCM_PATH to CMake search paths (for finding HIP / HSA
|
|
${ROCM_PATH}
|
|
${ROCM_PATH}/hip
|
|
${ROCM_PATH}/llvm)
|
|
endif()
|
|
|
|
# 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 (amdclang++ or hipcc)")
|
|
endif()
|
|
|
|
## Check for compiler version
|
|
find_program(compiler_executable ${COMPILER_EXE_NAME})
|
|
message(STATUS "${COMPILER_EXE_NAME} executable: ${compiler_executable}")
|
|
execute_process(
|
|
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
|
|
set(EXPLICIT_ROCM_VERSION "" CACHE STRING "Explicit ROCM version to compile to (auto detect if empty)")
|
|
if(EXPLICIT_ROCM_VERSION)
|
|
set(rocm_version_string "${EXPLICIT_ROCM_VERSION}")
|
|
elseif(ROCM_PATH)
|
|
message(STATUS "Reading ROCM version from ${ROCM_PATH}/.info/version")
|
|
file(READ "${ROCM_PATH}/.info/version" rocm_version_string)
|
|
else()
|
|
message(FATAL_ERROR "Could not determine ROCM version (set EXPLICIT_ROCM_VERSION or set ROCM_PATH to a valid installation)")
|
|
endif()
|
|
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()
|
|
|
|
## Check for RCCL
|
|
find_package(RCCL CONFIG REQUIRED HINTS "${CMAKE_PREFIX_PATH}" PATHS "${ROCM_PATH}")
|
|
if (RCCL_FOUND)
|
|
message(STATUS "RCCL version : ${RCCL_VERSION}")
|
|
message(STATUS "RCCL include path : ${RCCL_INCLUDE_DIRS}")
|
|
message(STATUS "RCCL libraries : ${RCCL_LIBRARIES}")
|
|
endif()
|
|
|
|
## Check for MPI (if enabled)
|
|
if (USE_MPI)
|
|
find_package(MPI REQUIRED)
|
|
if (MPI_FOUND)
|
|
message(STATUS "MPI include path : ${MPI_CXX_INCLUDE_PATH}")
|
|
message(STATUS "MPI libraries : ${MPI_CXX_LIBRARIES}")
|
|
add_definitions(-DMPI_SUPPORT)
|
|
else()
|
|
message ("-- no MPI library found")
|
|
endif()
|
|
else()
|
|
message ("-- MPI support disabled")
|
|
endif()
|
|
|
|
set(ROCM_USE_DEV_COMPONENT OFF) # This repo doesn't have a dev component
|
|
|
|
# Add all of the tests
|
|
add_subdirectory(src)
|
|
|
|
rocm_setup_version(VERSION "2.14.1")
|
|
|
|
# Create ROCm standard packages
|
|
rocm_create_package(
|
|
NAME rccl-tests
|
|
DESCRIPTION "Tests for the ROCm Communication Collectives Library"
|
|
MAINTAINER "RCCL Maintainer <rccl-maintainer@amd.com>"
|
|
)
|