mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-21 05:38:24 -05:00
Merge topic 'cuda-arch-all'
2796d6eecaCUDA: Fix CMAKE_CUDA_ARCHITECTURES=all/all-major with NVCC 11.5+e450d55552Help: Update CUDA_ARCHITECTURES docs for generic all/all-major supportfe64c49e72CUDA: Simplify CMAKE_CUDA_ARCHITECTURES special value logic Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !7026
This commit is contained in:
@@ -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
|
||||
^^^^^^^^
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user