Browse Source

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.
Raul Tambre 4 years ago
parent
commit
c4ae9384ff

+ 13 - 0
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`.

+ 1 - 0
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

+ 6 - 0
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.

+ 2 - 1
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 <CMAKE_<LANG>_COMPILER_ID>`:
+Initialized by the :envvar:`CUDAARCHS` environment variable if set.
+Otherwise as follows depending on :variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>`:
 
 - For ``Clang``: the oldest architecture that works.
 

+ 4 - 0
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)