Files
clang-p2996/libc/cmake/modules/prepare_libc_gpu_build.cmake
Joseph Huber ae20ff7526 [libc] Add check for locally installed GPUs
We need to know which, if any, GPUs the user has on their system if we
want to be able to test the `libc` source code for the GPU. This patch
adds a basic check using the `amdgpu-arch` utility which is provided by
`clang`.

Checking for NVIDIA GPUs will be done later as this is a little
problematic right now. CMake provides a method that we use for Clang but
it will soon be deprecated, the replacement requires a newer CMake
version that we will have in the LLVM 17 branch in the future. CUDA also
provides `__nvcc_device_query` but it's very new so I'm not sure if we
should rely on it. I may introduce a new tool to do it similar to
`amdgpu-arch`.

Reviewed By: sivachandra

Differential Revision: https://reviews.llvm.org/D140422
2022-12-20 13:37:11 -06:00

50 lines
2.2 KiB
CMake

if(NOT LIBC_TARGET_ARCHITECTURE_IS_GPU)
message(FATAL_ERROR
"libc build: Invalid attempt to set up GPU architectures.")
endif()
# Set up the target architectures to build the GPU libc for.
set(all_gpu_architectures "sm_35;sm_37;sm_50;sm_52;sm_53;sm_60;sm_61;sm_62;"
"sm_70;sm_72;sm_75;sm_80;sm_86;gfx700;gfx701;gfx801;"
"gfx803;gfx900;gfx902;gfx906;gfx908;gfx90a;gfx90c;"
"gfx940;gfx1010;gfx1030;gfx1031;gfx1032;gfx1033;"
"gfx1034;gfx1035;gfx1036;gfx1100;gfx1101;gfx1102;"
"gfx1103")
set(LIBC_GPU_ARCHITECTURES ${all_gpu_architectures} CACHE STRING
"List of GPU architectures to build the libc for.")
if(LIBC_GPU_ARCHITECTURES STREQUAL "all")
set(LIBC_GPU_ARCHITECTURES ${all_gpu_architectures} FORCE)
endif()
# Ensure the compiler is a valid clang when building the GPU target.
set(req_ver "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" AND
${CMAKE_CXX_COMPILER_VERSION} VERSION_EQUAL "${req_ver}"))
message(FATAL_ERROR "Cannot build libc for GPU. CMake compiler "
"'${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}' "
" is not `Clang ${req_ver}.")
endif()
if(NOT LLVM_LIBC_FULL_BUILD)
message(FATAL_ERROR "LLVM_LIBC_FULL_BUILD must be enabled to build libc for "
"GPU.")
endif()
# Identify any locally installed GPUs to use for testing.
find_program(LIBC_AMDGPU_ARCH
NAMES amdgpu-arch
PATHS ${LLVM_BINARY_DIR}/bin /opt/rocm/llvm/bin/)
if(LIBC_AMDGPU_ARCH)
execute_process(COMMAND ${LIBC_AMDGPU_ARCH}
OUTPUT_VARIABLE LIBC_AMDGPU_ARCH_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(FIND "${LIBC_AMDGPU_ARCH_OUTPUT}" "\n" first_arch_string)
string(SUBSTRING "${LIBC_AMDGPU_ARCH_OUTPUT}" 0 ${first_arch_string}
arch_string)
if(arch_string)
set(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU TRUE)
set(LIBC_GPU_TARGET_TRIPLE "amdgcn-amd-amdhsa")
set(LIBC_GPU_TARGET_ARCHITECTURE "${arch_string}")
endif()
endif()
# TODO: Check for Nvidia GPUs.