[libc-commits] [libc] c57a58c - [libc] Support setting 'native' GPU architecture for libc
Joseph Huber via libc-commits
libc-commits at lists.llvm.org
Tue Mar 28 11:50:48 PDT 2023
Author: Joseph Huber
Date: 2023-03-28T13:50:39-05:00
New Revision: c57a58cd0cfed0cb67e71c8ba30f53f397127a98
URL: https://github.com/llvm/llvm-project/commit/c57a58cd0cfed0cb67e71c8ba30f53f397127a98
DIFF: https://github.com/llvm/llvm-project/commit/c57a58cd0cfed0cb67e71c8ba30f53f397127a98.diff
LOG: [libc] Support setting 'native' GPU architecture for libc
We already use the `amdgpu-arch` and `nvptx-arch` tools to determine the
GPU architectures the user's system supports. We can provide
`LIBC_GPU_ARCHITECTURES=native` to allow users to easily build support
for only the one found on their system. This also cleans up the code
somewhat.
Reviewed By: tra
Differential Revision: https://reviews.llvm.org/D146994
Added:
Modified:
libc/cmake/modules/prepare_libc_gpu_build.cmake
Removed:
################################################################################
diff --git a/libc/cmake/modules/prepare_libc_gpu_build.cmake b/libc/cmake/modules/prepare_libc_gpu_build.cmake
index c6263aeb458b..e8cf94c0c898 100644
--- a/libc/cmake/modules/prepare_libc_gpu_build.cmake
+++ b/libc/cmake/modules/prepare_libc_gpu_build.cmake
@@ -12,13 +12,8 @@ set(all_nvptx_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")
set(all_gpu_architectures
"${all_amdgpu_architectures};${all_nvptx_architectures}")
-set(LIBC_GPU_ARCHITECTURES ${all_gpu_architectures} CACHE STRING
+set(LIBC_GPU_ARCHITECTURES "all" 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()
-message(STATUS "Building libc for the following GPU architectures: "
- "${LIBC_GPU_ARCHITECTURES}")
# Ensure the compiler is a valid clang when building the GPU target.
set(req_ver "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
@@ -29,10 +24,42 @@ if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" AND
" is not `Clang ${req_ver}.")
endif()
if(NOT LLVM_LIBC_FULL_BUILD)
- message(STATUS "LLVM_LIBC_FULL_BUILD must be enabled to build libc for GPU. "
- "Overriding LLVM_LIBC_FULL_BUILD to ON.")
- set(LLVM_LIBC_FULL_BUILD ON FORCE)
+ message(FATAL_ERROR "LLVM_LIBC_FULL_BUILD must be enabled to build libc for "
+ "GPU.")
+endif()
+
+# Identify any locally installed AMD GPUs on the system using 'amdgpu-arch'.
+find_program(LIBC_AMDGPU_ARCH
+ NAMES amdgpu-arch
+ PATHS ${LLVM_BINARY_DIR}/bin /opt/rocm/llvm/bin/)
+
+# Identify any locally installed NVIDIA GPUs on the system using 'nvptx-arch'.
+find_program(LIBC_NVPTX_ARCH
+ NAMES nvptx-arch
+ PATHS ${LLVM_BINARY_DIR}/bin)
+
+# Get the list of all natively supported GPU architectures.
+set(detected_gpu_architectures "")
+foreach(arch_tool ${LIBC_NVPTX_ARCH} ${LIBC_AMDGPU_ARCH})
+ if(arch_tool)
+ execute_process(COMMAND ${arch_tool}
+ OUTPUT_VARIABLE arch_tool_output
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ string(REPLACE "\n" ";" arch_list "${arch_tool_output}")
+ list(APPEND detected_gpu_architectures "${arch_list}")
+ endif()
+endforeach()
+
+if(LIBC_GPU_ARCHITECTURES STREQUAL "all")
+ set(LIBC_GPU_ARCHITECTURES ${all_gpu_architectures})
+elseif(LIBC_GPU_ARCHITECTURES STREQUAL "native")
+ if(NOT detected_gpu_architectures)
+ message(FATAL_ERROR "No GPUs found on the system when using 'native'")
+ endif()
+ set(LIBC_GPU_ARCHITECTURES ${detected_gpu_architectures})
endif()
+message(STATUS "Building libc for the following GPU architecture(s): "
+ "${LIBC_GPU_ARCHITECTURES}")
# Identify the program used to package multiple images into a single binary.
find_program(LIBC_CLANG_OFFLOAD_PACKAGER
@@ -44,68 +71,30 @@ if(NOT LIBC_CLANG_OFFLOAD_PACKAGER)
endif()
set(LIBC_GPU_TEST_ARCHITECTURE "" CACHE STRING "Architecture for the GPU tests")
-if(LIBC_GPU_TEST_ARCHITECTURE)
- message(STATUS "Using user-specified GPU architecture for testing "
- "'${LIBC_GPU_TEST_ARCHITECTURE}'")
- if("${LIBC_GPU_TEST_ARCHITECTURE}" IN_LIST all_amdgpu_architectures)
- set(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU TRUE)
- set(LIBC_GPU_TARGET_TRIPLE "amdgcn-amd-amdhsa")
- set(LIBC_GPU_TARGET_ARCHITECTURE "${LIBC_GPU_TEST_ARCHITECTURE}")
- elseif("${LIBC_GPU_TEST_ARCHITECTURE}" IN_LIST all_nvptx_architectures)
- set(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX TRUE)
- set(LIBC_GPU_TARGET_TRIPLE "nvptx64-nvidia-cuda")
- set(LIBC_GPU_TARGET_ARCHITECTURE "${LIBC_GPU_TEST_ARCHITECTURE}")
- else()
- message(FATAL_ERROR
- "Unknown GPU architecture '${LIBC_GPU_TARGET_ARCHITECTURE}'")
- endif()
- return()
-endif()
-
-# Identify any locally installed AMD GPUs on the system 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()
-if(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU)
- message(STATUS "Found an installed AMD GPU on the system with target "
- "architecture ${LIBC_GPU_TARGET_ARCHITECTURE} ")
+set(gpu_test_architecture "")
+if(LIBC_GPU_TEST_ARCHITECTURE)
+ set(gpu_test_architecture ${LIBC_GPU_TEST_ARCHITECTURE})
+ message(STATUS "Using user-specified GPU architecture for testing: "
+ "'${gpu_test_architecture}'")
+elseif(detected_gpu_architectures)
+ list(GET detected_gpu_architectures 0 gpu_test_architecture)
+ message(STATUS "Using GPU architecture detected on the system for testing: "
+ "'${gpu_test_architecture}'")
+else()
+ message(STATUS "No GPU architecture set for testing. GPU tests will not be "
+ "availibe. Set 'LIBC_GPU_TEST_ARCHITECTURE' to override.")
return()
endif()
-# Identify any locally installed NVIDIA GPUs on the system to use for testing.
-find_program(LIBC_NVPTX_ARCH
- NAMES nvptx-arch
- PATHS ${LLVM_BINARY_DIR}/bin)
-if(LIBC_NVPTX_ARCH)
- execute_process(COMMAND ${LIBC_NVPTX_ARCH}
- OUTPUT_VARIABLE LIBC_NVPTX_ARCH_OUTPUT
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- string(FIND "${LIBC_NVPTX_ARCH_OUTPUT}" "\n" first_arch_string)
- string(SUBSTRING "${LIBC_NVPTX_ARCH_OUTPUT}" 0 ${first_arch_string}
- arch_string)
- if(arch_string)
- set(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX TRUE)
- set(LIBC_GPU_TARGET_TRIPLE "nvptx64-nvidia-cuda")
- set(LIBC_GPU_TARGET_ARCHITECTURE "${arch_string}")
- endif()
-endif()
-
-if(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX)
- message(STATUS "Found an installed NVIDIA GPU on the system with target "
- "architecture ${LIBC_GPU_TARGET_ARCHITECTURE} ")
- return()
+if("${gpu_test_architecture}" IN_LIST all_amdgpu_architectures)
+ set(LIBC_GPU_TARGET_ARCHITECTURE_IS_AMDGPU TRUE)
+ set(LIBC_GPU_TARGET_TRIPLE "amdgcn-amd-amdhsa")
+ set(LIBC_GPU_TARGET_ARCHITECTURE "${gpu_test_architecture}")
+elseif("${gpu_test_architecture}" IN_LIST all_nvptx_architectures)
+ set(LIBC_GPU_TARGET_ARCHITECTURE_IS_NVPTX TRUE)
+ set(LIBC_GPU_TARGET_TRIPLE "nvptx64-nvidia-cuda")
+ set(LIBC_GPU_TARGET_ARCHITECTURE "${gpu_test_architecture}")
+else()
+ message(FATAL_ERROR "Unknown GPU architecture '${gpu_test_architecture}'")
endif()
More information about the libc-commits
mailing list