CUDA: Simplify CMAKE_CUDA_ARCHITECTURES special value logic

Refactor the logic checking `CMAKE_CUDA_ARCHITECTURES` special values.
Switch on the value first, and then make other decisions for each case.
This makes room for other special values to be added later.
This commit is contained in:
Brad King
2022-02-28 13:23:14 -05:00
parent 07a7772968
commit fe64c49e72
2 changed files with 31 additions and 33 deletions

View File

@@ -272,26 +272,24 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
endif()
endif()
# Detect explicit architectures and add them during detection.
if(DEFINED CMAKE_CUDA_ARCHITECTURES AND NOT "${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all" AND NOT "${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all-major")
set(architectures_explicit TRUE)
set(architectures_test ${CMAKE_CUDA_ARCHITECTURES})
endif()
# For sufficiently new NVCC we can just use the all and all-major flags.
# For VS we don't test since we can't figure out the version this early (see #23161).
# For others select based on version.
if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA" AND CMAKE_CUDA_COMPILER_TOOLKIT_VERSION VERSION_GREATER_EQUAL 11.5)
if("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all")
string(APPEND nvcc_test_flags " -arch=all")
elseif("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all-major")
string(APPEND nvcc_test_flags " -arch=all-major")
endif()
elseif(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
if("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all")
set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL})
elseif("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all-major")
set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR})
if(DEFINED CMAKE_CUDA_ARCHITECTURES)
if(CMAKE_CUDA_ARCHITECTURES MATCHES "^(all|all-major)$")
# For sufficiently new NVCC we can just use the all and all-major flags.
# For VS we don't test since we can't figure out the version this early (see #23161).
# For others select based on version.
if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA" AND CMAKE_CUDA_COMPILER_TOOLKIT_VERSION VERSION_GREATER_EQUAL 11.5)
string(APPEND nvcc_test_flags " -arch=${CMAKE_CUDA_ARCHITECTURES}")
elseif(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
if(CMAKE_CUDA_ARCHITECTURES STREQUAL "all")
set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL})
elseif(CMAKE_CUDA_ARCHITECTURES STREQUAL "all-major")
set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR})
endif()
endif()
else()
# Explicit architectures. Test them during detection.
set(architectures_explicit TRUE)
set(architectures_test ${CMAKE_CUDA_ARCHITECTURES})
endif()
endif()

View File

@@ -3447,22 +3447,22 @@ void cmGeneratorTarget::AddCUDAArchitectureFlags(std::string& flags) const
this->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_ID");
// Check for special modes: `all`, `all-major`.
if (compiler == "NVIDIA" &&
cmSystemTools::VersionCompare(
cmSystemTools::OP_GREATER_EQUAL,
this->Makefile->GetDefinition("CMAKE_CUDA_COMPILER_VERSION"),
"11.5")) {
if (property == "all" || property == "all-major") {
if (property == "all" || property == "all-major") {
if (compiler == "NVIDIA" &&
cmSystemTools::VersionCompare(
cmSystemTools::OP_GREATER_EQUAL,
this->Makefile->GetDefinition("CMAKE_CUDA_COMPILER_VERSION"),
"11.5")) {
flags = cmStrCat(flags, " -arch=", property);
return;
}
}
if (property == "all") {
property = *this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL");
} else if (property == "all-major") {
property =
*this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR");
if (property == "all") {
property =
*this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL");
} else if (property == "all-major") {
property =
*this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR");
}
}
struct CudaArchitecture