summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaul Tambre <raul@tambre.ee>2020-08-29 09:44:08 (GMT)
committerRaul Tambre <raul@tambre.ee>2020-08-29 10:06:45 (GMT)
commit01428c5560f87122999a14fe4bf3e9b186b0127e (patch)
tree514db3bd1cd7d0ecbde7c5862832702d0f2b3643
parent9f81aa0f6908785791b4a9c16331986b1dee7319 (diff)
downloadCMake-01428c5560f87122999a14fe4bf3e9b186b0127e.zip
CMake-01428c5560f87122999a14fe4bf3e9b186b0127e.tar.gz
CMake-01428c5560f87122999a14fe4bf3e9b186b0127e.tar.bz2
CUDA: Fail fast if CMAKE_CUDA_ARCHITECTURES doesn't work during detection
Also re-ordered the code to avoid testing flags for other compilers, since we know the vendor before full detection.
-rw-r--r--Help/release/dev/cuda-fail-fast.rst3
-rw-r--r--Modules/CMakeDetermineCUDACompiler.cmake37
2 files changed, 21 insertions, 19 deletions
diff --git a/Help/release/dev/cuda-fail-fast.rst b/Help/release/dev/cuda-fail-fast.rst
index 50bfce0..d857eb2 100644
--- a/Help/release/dev/cuda-fail-fast.rst
+++ b/Help/release/dev/cuda-fail-fast.rst
@@ -2,4 +2,5 @@ cuda-fail-fast
--------------
* If ``CUDA`` compiler detection fails with user-specified
- :variable:`CMAKE_CUDA_ARCHITECTURES` an error is raised.
+ :variable:`CMAKE_CUDA_ARCHITECTURES` or :variable:`CMAKE_CUDA_HOST_COMPILER`
+ an error is raised.
diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake
index 85b6695..6bdd06b 100644
--- a/Modules/CMakeDetermineCUDACompiler.cmake
+++ b/Modules/CMakeDetermineCUDACompiler.cmake
@@ -206,34 +206,35 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
endif()
endif()
- # First try with the user-specified architectures.
+ # Append 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}")
+ string(APPEND clang_test_flags " --cuda-gpu-arch=sm_${arch_name}")
+ string(APPEND nvcc_test_flags " -gencode=arch=compute_${arch_name},code=sm_${arch_name}")
list(APPEND tested_architectures "${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}")
+ # If the user has specified architectures we'll want to fail during compiler detection if they don't work.
+ set(CMAKE_CUDA_COMPILER_ID_REQUIRE_SUCCESS ON)
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")
- list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags} --cuda-gpu-arch=sm_${arch}")
- endforeach()
+ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
+ if(NOT CMAKE_CUDA_ARCHITECTURES)
+ # 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")
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags} --cuda-gpu-arch=sm_${arch}")
+ endforeach()
+ endif()
- # Finally also try the default.
- list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags}")
+ # If the user specified CMAKE_CUDA_ARCHITECTURES this will include all the architecture flags.
+ # Otherwise this won't include any architecture flags and we'll fallback to Clang's defaults.
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${clang_test_flags}")
+ elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
+ list(APPEND CMAKE_CUDA_COMPILER_ID_TEST_FLAGS_FIRST "${nvcc_test_flags}")
+ endif()
# We perform compiler identification for a second time to extract implicit linking info and host compiler for NVCC.
# We also use it to verify that CMAKE_CUDA_ARCHITECTURES and additionally on Clang that CUDA toolkit path works.