mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-15 03:48:02 +08:00
CUDA: Detect non-working user-specified architectures on NVCC
Extend the improved error message added for Clang by commit 19cc5bc296
(CUDA: Throw error if user-specified architectures don't work,
2020-05-26) to cover NVCC as well.
Also fix the error incorrectly being thrown if the user-specified list
differed in order to the architectures parsed from the compiler output.
Implements: #20757
This commit is contained in:
@@ -70,7 +70,6 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
|
||||
if(CMAKE_CUDA_HOST_COMPILER)
|
||||
string(APPEND nvcc_test_flags " -ccbin=${CMAKE_CUDA_HOST_COMPILER}")
|
||||
endif()
|
||||
list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST ${nvcc_test_flags})
|
||||
|
||||
# Clang
|
||||
if(CMAKE_CROSSCOMPILING)
|
||||
@@ -83,16 +82,22 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
|
||||
# First try with the user-specified architectures.
|
||||
if(CMAKE_CUDA_ARCHITECTURES)
|
||||
set(clang_archs "${clang_test_flags}")
|
||||
set(nvcc_archs "${nvcc_test_flags}")
|
||||
|
||||
foreach(arch ${CMAKE_CUDA_ARCHITECTURES})
|
||||
# Strip specifiers as PTX vs binary doesn't matter.
|
||||
string(REGEX MATCH "[0-9]+" arch_name "${arch}")
|
||||
string(APPEND clang_archs " --cuda-gpu-arch=sm_${arch_name}")
|
||||
string(APPEND nvcc_archs " -gencode=arch=compute_${arch_name},code=sm_${arch_name}")
|
||||
endforeach()
|
||||
|
||||
list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_archs}")
|
||||
list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${nvcc_archs}")
|
||||
endif()
|
||||
|
||||
# Fallback default NVCC flags.
|
||||
list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST ${nvcc_test_flags})
|
||||
|
||||
# Clang doesn't automatically select an architecture supported by the SDK.
|
||||
# Try in reverse order of deprecation with the most recent at front (i.e. the most likely to work for new setups).
|
||||
foreach(arch "20" "30" "52")
|
||||
@@ -141,11 +146,7 @@ elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
|
||||
if(NOT CMAKE_CUDA_ARCHITECTURES)
|
||||
# Find the architecture that we successfully compiled using and set it as the default.
|
||||
string(REGEX MATCH "-target-cpu sm_([0-9]+)" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
|
||||
set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "CUDA architectures")
|
||||
|
||||
if(NOT CMAKE_CUDA_ARCHITECTURES)
|
||||
message(FATAL_ERROR "Failed to find a working CUDA architecture.")
|
||||
endif()
|
||||
set(detected_architecture "${CMAKE_MATCH_1}")
|
||||
else()
|
||||
string(REGEX MATCHALL "-target-cpu sm_([0-9]+)" target_cpus "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
|
||||
|
||||
@@ -153,15 +154,6 @@ elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
|
||||
string(REGEX MATCH "-target-cpu sm_([0-9]+)" dont_care "${cpu}")
|
||||
list(APPEND architectures "${CMAKE_MATCH_1}")
|
||||
endforeach()
|
||||
|
||||
if(NOT "${architectures}" STREQUAL "${CMAKE_CUDA_ARCHITECTURES}")
|
||||
message(FATAL_ERROR
|
||||
"The CMAKE_CUDA_ARCHITECTURES:\n"
|
||||
" ${CMAKE_CUDA_ARCHITECTURES}\n"
|
||||
"do not all work with this compiler. Try:\n"
|
||||
" ${architectures}\n"
|
||||
"instead.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Clang does not add any CUDA SDK libraries or directories when invoking the host linker.
|
||||
@@ -346,11 +338,35 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
|
||||
cmake_policy(GET CMP0104 _CUDA_CMP0104)
|
||||
if(NOT CMAKE_CUDA_ARCHITECTURES AND _CUDA_CMP0104 STREQUAL "NEW")
|
||||
string(REGEX MATCH "arch[ =]compute_([0-9]+)" dont_care "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
|
||||
set(CMAKE_CUDA_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "CUDA architectures")
|
||||
set(detected_architecture "${CMAKE_MATCH_1}")
|
||||
elseif(CMAKE_CUDA_ARCHITECTURES)
|
||||
string(REGEX MATCHALL "-arch compute_([0-9]+)" target_cpus "${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
|
||||
|
||||
foreach(cpu ${target_cpus})
|
||||
string(REGEX MATCH "-arch compute_([0-9]+)" dont_care "${cpu}")
|
||||
list(APPEND architectures "${CMAKE_MATCH_1}")
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(DEFINED detected_architecture)
|
||||
set(CMAKE_CUDA_ARCHITECTURES "${detected_architecture}" CACHE STRING "CUDA architectures")
|
||||
|
||||
if(NOT CMAKE_CUDA_ARCHITECTURES)
|
||||
message(FATAL_ERROR "Failed to find default CUDA architecture.")
|
||||
message(FATAL_ERROR "Failed to find a working CUDA architecture.")
|
||||
endif()
|
||||
elseif(architectures)
|
||||
# Sort since order mustn't matter.
|
||||
list(SORT CMAKE_CUDA_ARCHITECTURES)
|
||||
list(SORT architectures)
|
||||
|
||||
if(NOT "${architectures}" STREQUAL "${CMAKE_CUDA_ARCHITECTURES}")
|
||||
message(FATAL_ERROR
|
||||
"The CMAKE_CUDA_ARCHITECTURES:\n"
|
||||
" ${CMAKE_CUDA_ARCHITECTURES}\n"
|
||||
"do not all work with this compiler. Try:\n"
|
||||
" ${architectures}\n"
|
||||
"instead.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
Reference in New Issue
Block a user