--- short-description: CUDA module authors: - name: Olexa Bilaniuk years: [2019] has-copyright: false ... # Unstable CUDA Module _Since: 0.50.0_ This module provides helper functionality related to the CUDA Toolkit and building code using it. **Note**: this module is unstable. It is only provided as a technology preview. Its API may change in arbitrary ways between releases or it might be removed from Meson altogether. ## Importing the module The module may be imported as follows: ``` meson cuda = import('unstable-cuda') ``` It offers several useful functions that are enumerated below. ## Functions ### `nvcc_arch_flags()` _Since: 0.50.0_ ``` meson cuda.nvcc_arch_flags(cuda_version_string, ..., detected: string_or_array) ``` Returns a list of `-gencode` flags that should be passed to `cuda_args:` in order to compile a "fat binary" for the architectures/compute capabilities enumerated in the positional argument(s). The flags shall be acceptable to an NVCC with CUDA Toolkit version string `cuda_version_string`. A set of architectures and/or compute capabilities may be specified by: - The single positional argument `'All'`, `'Common'` or `'Auto'` - As (an array of) - Architecture names (`'Kepler'`, `'Maxwell+Tegra'`, `'Turing'`) and/or - Compute capabilities (`'3.0'`, `'3.5'`, `'5.3'`, `'7.5'`) A suffix of `+PTX` requests PTX code generation for the given architecture. A compute capability given as `A.B(X.Y)` requests PTX generation for an older virtual architecture `X.Y` before binary generation for a newer architecture `A.B`. Multiple architectures and compute capabilities may be passed in using - Multiple positional arguments - Lists of strings - Space (` `), comma (`,`) or semicolon (`;`)-separated strings The single-word architectural sets `'All'`, `'Common'` or `'Auto'` cannot be mixed with architecture names or compute capabilities. Their interpretation is: | Name | Compute Capability | |-------------------|--------------------| | `'All'` | All CCs supported by given NVCC compiler. | | `'Common'` | Relatively common CCs supported by given NVCC compiler. Generally excludes Tegra and Tesla devices. | | `'Auto'` | The CCs provided by the `detected:` keyword, filtered for support by given NVCC compiler. | The supported architecture names and their corresponding compute capabilities are: | Name | Compute Capability | |-------------------|--------------------| | `'Fermi'` | 2.0, 2.1(2.0) | | `'Kepler'` | 3.0, 3.5 | | `'Kepler+Tegra'` | 3.2 | | `'Kepler+Tesla'` | 3.7 | | `'Maxwell'` | 5.0, 5.2 | | `'Maxwell+Tegra'` | 5.3 | | `'Pascal'` | 6.0, 6.1 | | `'Pascal+Tegra'` | 6.2 | | `'Volta'` | 7.0 | | `'Xavier'` | 7.2 | | `'Turing'` | 7.5 | | `'Ampere'` | 8.0, 8.6 | Examples: cuda.nvcc_arch_flags('10.0', '3.0', '3.5', '5.0+PTX') cuda.nvcc_arch_flags('10.0', ['3.0', '3.5', '5.0+PTX']) cuda.nvcc_arch_flags('10.0', [['3.0', '3.5'], '5.0+PTX']) cuda.nvcc_arch_flags('10.0', '3.0 3.5 5.0+PTX') cuda.nvcc_arch_flags('10.0', '3.0,3.5,5.0+PTX') cuda.nvcc_arch_flags('10.0', '3.0;3.5;5.0+PTX') cuda.nvcc_arch_flags('10.0', 'Kepler 5.0+PTX') # Returns ['-gencode', 'arch=compute_30,code=sm_30', # '-gencode', 'arch=compute_35,code=sm_35', # '-gencode', 'arch=compute_50,code=sm_50', # '-gencode', 'arch=compute_50,code=compute_50'] cuda.nvcc_arch_flags('10.0', '3.5(3.0)') # Returns ['-gencode', 'arch=compute_30,code=sm_35'] cuda.nvcc_arch_flags('8.0', 'Common') # Returns ['-gencode', 'arch=compute_30,code=sm_30', # '-gencode', 'arch=compute_35,code=sm_35', # '-gencode', 'arch=compute_50,code=sm_50', # '-gencode', 'arch=compute_52,code=sm_52', # '-gencode', 'arch=compute_60,code=sm_60', # '-gencode', 'arch=compute_61,code=sm_61', # '-gencode', 'arch=compute_61,code=compute_61'] cuda.nvcc_arch_flags('9.2', 'Auto', detected: '6.0 6.0 6.0 6.0') cuda.nvcc_arch_flags('9.2', 'Auto', detected: ['6.0', '6.0', '6.0', '6.0']) # Returns ['-gencode', 'arch=compute_60,code=sm_60'] cuda.nvcc_arch_flags(nvcc, 'All') # Returns ['-gencode', 'arch=compute_20,code=sm_20', # '-gencode', 'arch=compute_20,code=sm_21', # '-gencode', 'arch=compute_30,code=sm_30', # '-gencode', 'arch=compute_32,code=sm_32', # '-gencode', 'arch=compute_35,code=sm_35', # '-gencode', 'arch=compute_37,code=sm_37', # '-gencode', 'arch=compute_50,code=sm_50', # nvcc.version() < 7.0 # '-gencode', 'arch=compute_52,code=sm_52', # '-gencode', 'arch=compute_53,code=sm_53', # nvcc.version() >= 7.0 # '-gencode', 'arch=compute_60,code=sm_60', # '-gencode', 'arch=compute_61,code=sm_61', # nvcc.version() >= 8.0 # '-gencode', 'arch=compute_70,code=sm_70', # '-gencode', 'arch=compute_72,code=sm_72', # nvcc.version() >= 9.0 # '-gencode', 'arch=compute_75,code=sm_75'] # nvcc.version() >= 10.0 _Note:_ This function is intended to closely replicate CMake's FindCUDA module function `CUDA_SELECT_NVCC_ARCH_FLAGS(out_variable, [list of CUDA compute architectures])` ### `nvcc_arch_readable()` _Since: 0.50.0_ ``` meson cuda.nvcc_arch_readable(cuda_version_string, ..., detected: string_or_array) ``` Has precisely the same interface as [`nvcc_arch_flags()`](#nvcc_arch_flags), but rather than returning a list of flags, it returns a "readable" list of architectures that will be compiled for. The output of this function is solely intended for informative message printing. archs = '3.0 3.5 5.0+PTX' readable = cuda.nvcc_arch_readable('10.0', archs) message('Building for architectures ' + ' '.join(readable)) This will print Message: Building for architectures sm30 sm35 sm50 compute50 _Note:_ This function is intended to closely replicate CMake's FindCUDA module function `CUDA_SELECT_NVCC_ARCH_FLAGS(out_variable, [list of CUDA compute architectures])` ### `min_driver_version()` _Since: 0.50.0_ ``` meson cuda.min_driver_version(cuda_version_string) ``` Returns the minimum NVIDIA proprietary driver version required, on the host system, by kernels compiled with a CUDA Toolkit with the given version string. The output of this function is generally intended for informative message printing, but could be used for assertions or to conditionally enable features known to exist within the minimum NVIDIA driver required.