mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-08 07:10:12 -05:00
CUDA: Defer architecture testing to the compiler testing step
Verifying the architectures during compiler identification is redundant, and requires a lot more up-front information than we should need. It also causes unsupported architectures to break the compiler id and version detection, so the resulting output from CMake does not report the compiler version, which is useful information to know why the specified architectures are not supported. The "detecting compiler ABI info" and "check for working compiler" steps already pass `CMAKE_CUDA_ARCHITECTURES` into their test projects. Therefore we can just drop the earlier architecture testing. Bad architectures will be reported as a not-working compiler, and the output will include the compiler's error message. This reverts the approach from: * commit19cc5bc296(CUDA: Throw error if user-specified architectures don't work, 2020-05-26, v3.18.0-rc1~79^2) * commit650c1029a0(CUDA: Detect non-working user-specified architectures on NVCC, 2020-05-28, v3.18.0-rc1~51^2) * commit01428c5560(CUDA: Fail fast if CMAKE_CUDA_ARCHITECTURES doesn't work during detection, 2020-08-29, v3.19.0-rc1~241^2). Their goal was in part to avoid waiting until the test for working compiler to detect unsupported architectures. However, experience has shown that failing earlier is more trouble than it's worth. Fixes: #23161 Issue: #20756
This commit is contained in:
@@ -44,63 +44,3 @@ if(CMAKE_CUDA_COMPILER_TOOLKIT_VERSION VERSION_GREATER_EQUAL 11.4
|
||||
AND (NOT CMAKE_CUDA_COMPILER_ID STREQUAL "Clang"))
|
||||
list(APPEND CMAKE_CUDA_ARCHITECTURES_ALL 87)
|
||||
endif()
|
||||
|
||||
# FIXME(#23161): Detect architectures early since we test them during
|
||||
# compiler detection. We already have code to detect them later during
|
||||
# compiler testing, so we should not need to do this here.
|
||||
if(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
set(_CUDA_ARCHS_EXE "${CMAKE_PLATFORM_INFO_DIR}/CMakeDetermineCUDACompilerArchs.bin")
|
||||
execute_process(
|
||||
COMMAND "${_CUDA_NVCC_EXECUTABLE}" -o "${_CUDA_ARCHS_EXE}" --cudart=static "${CMAKE_ROOT}/Modules/CMakeCUDACompilerABI.cu"
|
||||
RESULT_VARIABLE _CUDA_ARCHS_RESULT
|
||||
OUTPUT_VARIABLE _CUDA_ARCHS_OUTPUT
|
||||
ERROR_VARIABLE _CUDA_ARCHS_OUTPUT
|
||||
)
|
||||
if(_CUDA_ARCHS_RESULT EQUAL 0)
|
||||
execute_process(
|
||||
COMMAND "${_CUDA_ARCHS_EXE}"
|
||||
RESULT_VARIABLE _CUDA_ARCHS_RESULT
|
||||
OUTPUT_VARIABLE _CUDA_ARCHS_OUTPUT
|
||||
ERROR_VARIABLE _CUDA_ARCHS_OUTPUT
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
endif()
|
||||
if(_CUDA_ARCHS_RESULT EQUAL 0)
|
||||
if("$ENV{CMAKE_CUDA_ARCHITECTURES_NATIVE_CLAMP}")
|
||||
# Undocumented hook used by CMake's CI.
|
||||
# Clamp native architecture to version range supported by this CUDA.
|
||||
list(GET CMAKE_CUDA_ARCHITECTURES_ALL 0 _CUDA_ARCH_MIN)
|
||||
list(GET CMAKE_CUDA_ARCHITECTURES_ALL -1 _CUDA_ARCH_MAX)
|
||||
set(_CUDA_ARCHITECTURES_NATIVE "")
|
||||
foreach(_CUDA_ARCH IN LISTS _CUDA_ARCHS_OUTPUT)
|
||||
if(_CUDA_ARCH LESS _CUDA_ARCH_MIN)
|
||||
set(_CUDA_ARCH "${_CUDA_ARCH_MIN}")
|
||||
endif()
|
||||
if(_CUDA_ARCH GREATER _CUDA_ARCH_MAX)
|
||||
set(_CUDA_ARCH "${_CUDA_ARCH_MAX}")
|
||||
endif()
|
||||
list(APPEND _CUDA_ARCHITECTURES_NATIVE ${_CUDA_ARCH})
|
||||
endforeach()
|
||||
unset(_CUDA_ARCH)
|
||||
unset(_CUDA_ARCH_MIN)
|
||||
unset(_CUDA_ARCH_MAX)
|
||||
else()
|
||||
set(_CUDA_ARCHITECTURES_NATIVE "${_CUDA_ARCHS_OUTPUT}")
|
||||
endif()
|
||||
list(REMOVE_DUPLICATES _CUDA_ARCHITECTURES_NATIVE)
|
||||
else()
|
||||
if (NOT _CUDA_ARCHS_RESULT MATCHES "[0-9]+")
|
||||
set(_CUDA_ARCHS_STATUS " (${_CUDA_ARCHS_RESULT})")
|
||||
else()
|
||||
set(_CUDA_ARCHS_STATUS "")
|
||||
endif()
|
||||
string(REPLACE "\n" "\n " _CUDA_ARCHS_OUTPUT " ${_CUDA_ARCHS_OUTPUT}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Detecting the CUDA native architecture(s) failed with "
|
||||
"the following output:\n${_CUDA_ARCHS_OUTPUT}\n\n")
|
||||
set(_CUDA_ARCHS_OUTPUT "")
|
||||
endif()
|
||||
unset(_CUDA_ARCHS_EXE)
|
||||
unset(_CUDA_ARCHS_RESULT)
|
||||
unset(_CUDA_ARCHS_OUTPUT)
|
||||
endif()
|
||||
|
||||
Reference in New Issue
Block a user