From c4ae9384ff4d355f51c06180984dd4d053f074cc Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Tue, 24 Nov 2020 19:21:36 +0200 Subject: CUDA: Initialize CMAKE_CUDA_ARCHITECTURES using $ENV{CUDAARCHS} NVCC's default architecture may be newer than the one supported by the machine's GPU. In such cases it's useful to have an environment variable for initializing CMAKE_CUDA_ARCHITECTURES to avoid specifying it for every invocation. --- Help/envvar/CUDAARCHS.rst | 13 +++++++++++++ Help/manual/cmake-env-variables.7.rst | 1 + Help/release/dev/cuda-archs-env.rst | 6 ++++++ Help/variable/CMAKE_CUDA_ARCHITECTURES.rst | 3 ++- Modules/CMakeDetermineCUDACompiler.cmake | 4 ++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Help/envvar/CUDAARCHS.rst create mode 100644 Help/release/dev/cuda-archs-env.rst diff --git a/Help/envvar/CUDAARCHS.rst b/Help/envvar/CUDAARCHS.rst new file mode 100644 index 0000000..82369cd --- /dev/null +++ b/Help/envvar/CUDAARCHS.rst @@ -0,0 +1,13 @@ +CUDAARCHS +--------- + +.. versionadded:: 3.20 + +.. include:: ENV_VAR.txt + +Value used to initialize :variable:`CMAKE_CUDA_ARCHITECTURES` on the first +configuration if it's not already defined. Subsequent runs will use the value +stored in the cache. + +This is a semicolon-separated list of architectures as described in +:prop_tgt:`CUDA_ARCHITECTURES`. diff --git a/Help/manual/cmake-env-variables.7.rst b/Help/manual/cmake-env-variables.7.rst index 13e0d39..26e0c48 100644 --- a/Help/manual/cmake-env-variables.7.rst +++ b/Help/manual/cmake-env-variables.7.rst @@ -56,6 +56,7 @@ Environment Variables for Languages /envvar/CC /envvar/CFLAGS /envvar/CSFLAGS + /envvar/CUDAARCHS /envvar/CUDACXX /envvar/CUDAFLAGS /envvar/CUDAHOSTCXX diff --git a/Help/release/dev/cuda-archs-env.rst b/Help/release/dev/cuda-archs-env.rst new file mode 100644 index 0000000..a2afcbe --- /dev/null +++ b/Help/release/dev/cuda-archs-env.rst @@ -0,0 +1,6 @@ +cuda-archs-env +-------------- + +* The :envvar:`CUDAARCHS` environment variable was added for initializing + :variable:`CMAKE_CUDA_ARCHITECTURES`. Useful in cases where the compiler + default is unsuitable for the machine's GPU. diff --git a/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst b/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst index 985040d..7f7e679 100644 --- a/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst +++ b/Help/variable/CMAKE_CUDA_ARCHITECTURES.rst @@ -5,7 +5,8 @@ CMAKE_CUDA_ARCHITECTURES Default value for :prop_tgt:`CUDA_ARCHITECTURES` property of targets. -This is initialized as follows depending on :variable:`CMAKE_CUDA_COMPILER_ID _COMPILER_ID>`: +Initialized by the :envvar:`CUDAARCHS` environment variable if set. +Otherwise as follows depending on :variable:`CMAKE_CUDA_COMPILER_ID _COMPILER_ID>`: - For ``Clang``: the oldest architecture that works. diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake index 972adef..578729c 100644 --- a/Modules/CMakeDetermineCUDACompiler.cmake +++ b/Modules/CMakeDetermineCUDACompiler.cmake @@ -47,6 +47,10 @@ if(NOT $ENV{CUDAHOSTCXX} STREQUAL "") endif() endif() +if(NOT "$ENV{CUDAARCHS}" STREQUAL "") + set(CMAKE_CUDA_ARCHITECTURES "$ENV{CUDAARCHS}" CACHE STRING "CUDA architectures") +endif() + # Build a small source file to identify the compiler. if(NOT CMAKE_CUDA_COMPILER_ID_RUN) set(CMAKE_CUDA_COMPILER_ID_RUN 1) -- cgit v0.12 From c57541d874ce2a22555e1aae302d27190d74a5a4 Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Fri, 27 Nov 2020 17:18:29 +0200 Subject: CUDA: Fix tests with CUDAARCHS set With CUDAARCHS there's the possibility of tests being run with multiple architectures or having CMAKE_CUDA_ARCHITECTURES set with NVCC despite CMP0104 being OLD. Fix a few tests to work properly in such cases. --- Tests/CudaOnly/CompileFlags/CMakeLists.txt | 1 + Tests/CudaOnly/ExportPTX/CMakeLists.txt | 6 +++++- Tests/RunCMake/CMP0104/CMP0104-OLD.cmake | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Tests/CudaOnly/CompileFlags/CMakeLists.txt b/Tests/CudaOnly/CompileFlags/CMakeLists.txt index 5e8a8e4..38765ec 100644 --- a/Tests/CudaOnly/CompileFlags/CMakeLists.txt +++ b/Tests/CudaOnly/CompileFlags/CMakeLists.txt @@ -8,6 +8,7 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA") target_compile_options(CudaOnlyCompileFlags PRIVATE -gencode arch=compute_50,code=compute_50 ) + set_property(TARGET CudaOnlyCompileFlags PROPERTY CUDA_ARCHITECTURES) else() set_property(TARGET CudaOnlyCompileFlags PROPERTY CUDA_ARCHITECTURES 50-real) endif() diff --git a/Tests/CudaOnly/ExportPTX/CMakeLists.txt b/Tests/CudaOnly/ExportPTX/CMakeLists.txt index ee5f54d..e7e7bc4 100644 --- a/Tests/CudaOnly/ExportPTX/CMakeLists.txt +++ b/Tests/CudaOnly/ExportPTX/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.19) project (ExportPTX CUDA) #Goal for this example: @@ -6,6 +6,10 @@ project (ExportPTX CUDA) # How to reference PTX files for custom commands # How to install PTX files +# PTX can be compiled only for a single virtual architecture at a time +list(SUBLIST CMAKE_CUDA_ARCHITECTURES 0 1 CMAKE_CUDA_ARCHITECTURES) +string(APPEND CMAKE_CUDA_ARCHITECTURES "-virtual") + add_library(CudaPTX OBJECT kernelA.cu kernelB.cu) set_property(TARGET CudaPTX PROPERTY CUDA_PTX_COMPILATION ON) diff --git a/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake b/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake index 415eecc..6988447 100644 --- a/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake +++ b/Tests/RunCMake/CMP0104/CMP0104-OLD.cmake @@ -1,3 +1,5 @@ +set(ENV{CUDAARCHS}) + cmake_policy(SET CMP0104 OLD) include(CMP0104-Common.cmake) -- cgit v0.12