Merge topic 'cuda-arch-all'

2796d6eeca CUDA: Fix CMAKE_CUDA_ARCHITECTURES=all/all-major with NVCC 11.5+
e450d55552 Help: Update CUDA_ARCHITECTURES docs for generic all/all-major support
fe64c49e72 CUDA: Simplify CMAKE_CUDA_ARCHITECTURES special value logic

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !7026
This commit is contained in:
Brad King
2022-03-02 12:52:11 +00:00
committed by Kitware Robot
3 changed files with 45 additions and 42 deletions
+10 -8
View File
@@ -20,17 +20,19 @@ variable if it is set when a target is created.
The ``CUDA_ARCHITECTURES`` target property must be set to a non-empty value on targets
that compile CUDA sources, or it is an error. See policy :policy:`CMP0104`.
.. versionadded:: 3.23
The ``CUDA_ARCHITECTURES`` may be set to one of the following special values:
The ``CUDA_ARCHITECTURES`` may be set to the following special keywords:
``all``
.. versionadded:: 3.23
``all``
Requires NVIDIA 11.5+. Will compile for all supported major and minor real
architectures, and the highest major virtual architecture.
Compile for all supported major and minor real architectures,
and the highest major virtual architecture.
``all-major``
Requires NVIDIA 11.5+. Will compile for all supported major real
architectures, and the highest major virtual architecture.
``all-major``
.. versionadded:: 3.23
Compile for all supported major real architectures, and the highest
major virtual architecture.
Examples
^^^^^^^^
+22 -21
View File
@@ -272,26 +272,25 @@ 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}")
set(architectures_tested "${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()
@@ -632,7 +631,7 @@ if("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "")
message(FATAL_ERROR "Failed to detect a default CUDA architecture.\n\nCompiler output:\n${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
endif()
endif()
else()
elseif(NOT "${architectures_tested}" MATCHES "^(all|all-major)$")
# Sort since order mustn't matter.
list(SORT architectures_detected)
list(SORT architectures_tested)
@@ -673,6 +672,8 @@ unset(_CUDA_TARGET_DIR)
unset(_CUDA_TARGET_NAME)
unset(architectures_explicit)
unset(architectures_detected)
unset(architectures_tested)
set(CMAKE_CUDA_COMPILER_ENV_VAR "CUDACXX")
set(CMAKE_CUDA_HOST_COMPILER_ENV_VAR "CUDAHOSTCXX")
+13 -13
View File
@@ -3451,22 +3451,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