(self, cuda_version, cuda_arch_list='Auto', detected='')
return nvcc_flags, nvcc_archs_readable
Using the CUDA Toolkit version and the target architectures, compute
        the NVCC architecture flags.
Using the CUDA Toolkit version and the target architectures, compute
        the NVCC architecture flags.
Using the CUDA Toolkit version and the target architectures compute the NVCC architecture flags .
def _nvcc_arch_flags(self, cuda_version, cuda_arch_list='Auto', detected=''):
        """
        Using the CUDA Toolkit version and the target architectures, compute
        the NVCC architecture flags.
        """

        # Replicates much of the logic of
        #     https://github.com/Kitware/CMake/blob/master/Modules/FindCUDA/select_compute_arch.cmake
        # except that a bug with cuda_arch_list="All" is worked around by
        # tracking both lower and upper limits on GPU architectures.

        cuda_known_gpu_architectures   = ['Fermi', 'Kepler', 'Maxwell']  # noqa: E221
        cuda_common_gpu_architectures  = ['3.0', '3.5', '5.0']           # noqa: E221
        cuda_hi_limit_gpu_architecture = None                            # noqa: E221
        cuda_lo_limit_gpu_architecture = '2.0'                           # noqa: E221
        cuda_all_gpu_architectures     = ['3.0', '3.2', '3.5', '5.0']    # noqa: E221

        if version_compare(cuda_version, '<7.0'):
            cuda_hi_limit_gpu_architecture = '5.2'

        if version_compare(cuda_version, '>=7.0'):
            cuda_known_gpu_architectures  += ['Kepler+Tegra', 'Kepler+Tesla', 'Maxwell+Tegra']  # noqa: E221
            cuda_common_gpu_architectures += ['5.2']                                            # noqa: E221

            if version_compare(cuda_version, '<8.0'):
                cuda_common_gpu_architectures += ['5.2+PTX']  # noqa: E221
                cuda_hi_limit_gpu_architecture = '6.0'        # noqa: E221

        if version_compare(cuda_version, '>=8.0'):
            cuda_known_gpu_architectures  += ['Pascal', 'Pascal+Tegra']  # noqa: E221
            cuda_common_gpu_architectures += ['6.0', '6.1']              # noqa: E221
            cuda_all_gpu_architectures    += ['6.0', '6.1', '6.2']       # noqa: E221

            if version_compare(cuda_version, '<9.0'):
                cuda_common_gpu_architectures += ['6.1+PTX']  # noqa: E221
                cuda_hi_limit_gpu_architecture = '7.0'        # noqa: E221

        if version_compare(cuda_version, '>=9.0'):
            cuda_known_gpu_architectures  += ['Volta', 'Xavier'] # noqa: E221
            cuda_common_gpu_architectures += ['7.0']             # noqa: E221
            cuda_all_gpu_architectures    += ['7.0', '7.2']      # noqa: E221
            # https://docs.nvidia.com/cuda/archive/9.0/cuda-toolkit-release-notes/index.html#unsupported-features
            cuda_lo_limit_gpu_architecture = '3.0'               # noqa: E221

            if version_compare(cuda_version, '<10.0'):
                cuda_common_gpu_architectures += ['7.2+PTX']  # noqa: E221
                cuda_hi_limit_gpu_architecture = '8.0'        # noqa: E221

        if version_compare(cuda_version, '>=10.0'):
            cuda_known_gpu_architectures  += ['Turing'] # noqa: E221
            cuda_common_gpu_architectures += ['7.5']    # noqa: E221
            cuda_all_gpu_architectures    += ['7.5']    # noqa: E221

            if version_compare(cuda_version, '<11.0'):
                cuda_common_gpu_architectures += ['7.5+PTX']  # noqa: E221
                cuda_hi_limit_gpu_architecture = '8.0'        # noqa: E221

        if version_compare(cuda_version, '>=11.0'):
            cuda_known_gpu_architectures  += ['Ampere'] # noqa: E221
            cuda_common_gpu_architectures += ['8.0']    # noqa: E221
            cuda_all_gpu_architectures    += ['8.0']    # noqa: E221
            # https://docs.nvidia.com/cuda/archive/11.0/cuda-toolkit-release-notes/index.html#deprecated-features
            cuda_lo_limit_gpu_architecture = '3.5'      # noqa: E221

            if version_compare(cuda_version, '<11.1'):
                cuda_common_gpu_architectures += ['8.0+PTX']  # noqa: E221
                cuda_hi_limit_gpu_architecture = '8.6'        # noqa: E221

        if version_compare(cuda_version, '>=11.1'):
            cuda_common_gpu_architectures += ['8.6', '8.6+PTX']  # noqa: E221
            cuda_all_gpu_architectures    += ['8.6']             # noqa: E221

            if version_compare(cuda_version, '<12.0'):
                cuda_hi_limit_gpu_architecture = '9.0'        # noqa: E221

        if not cuda_arch_list:
            cuda_arch_list = 'Auto'

        if   cuda_arch_list == 'All':     # noqa: E271
            cuda_arch_list = cuda_known_gpu_architectures
        elif cuda_arch_list == 'Common':  # noqa: E271
            cuda_arch_list = cuda_common_gpu_architectures
        elif cuda_arch_list == 'Auto':    # noqa: E271
            if detected:
                if isinstance(detected, list):
                    cuda_arch_list = detected
                else:
                    cuda_arch_list = self._break_arch_string(detected)
                cuda_arch_list = self._filter_cuda_arch_list(cuda_arch_list,
                                                             cuda_lo_limit_gpu_architecture,
                                                             cuda_hi_limit_gpu_architecture,
                                                             cuda_common_gpu_architectures[-1])
            else:
                cuda_arch_list = cuda_common_gpu_architectures
        elif isinstance(cuda_arch_list, str):
            cuda_arch_list = self._break_arch_string(cuda_arch_list)

        cuda_arch_list = sorted(x for x in set(cuda_arch_list) if x)

        cuda_arch_bin = []
        cuda_arch_ptx = []
        for arch_name in cuda_arch_list:
            arch_bin = []
            arch_ptx = []
            add_ptx = arch_name.endswith('+PTX')
            if add_ptx:
                arch_name = arch_name[:-len('+PTX')]

            if re.fullmatch('[0-9]+\\.[0-9](\\([0-9]+\\.[0-9]\\))?', arch_name):
                arch_bin, arch_ptx = [arch_name], [arch_name]
            else:
                arch_bin, arch_ptx = {
                    'Fermi':         (['2.0', '2.1(2.0)'], []),
                    'Kepler+Tegra':  (['3.2'],             []),
                    'Kepler+Tesla':  (['3.7'],             []),
                    'Kepler':        (['3.0', '3.5'],      ['3.5']),
                    'Maxwell+Tegra': (['5.3'],             []),
                    'Maxwell':       (['5.0', '5.2'],      ['5.2']),
                    'Pascal':        (['6.0', '6.1'],      ['6.1']),
                    'Pascal+Tegra':  (['6.2'],             []),
                    'Volta':         (['7.0'],             ['7.0']),
                    'Xavier':        (['7.2'],             []),
                    'Turing':        (['7.5'],             ['7.5']),
                    'Ampere':        (['8.0'],             ['8.0']),
                }.get(arch_name, (None, None))

            if arch_bin is None:
                raise InvalidArguments(f'Unknown CUDA Architecture Name {arch_name}!')

            cuda_arch_bin += arch_bin

            if add_ptx:
                if not arch_ptx:
                    arch_ptx = arch_bin
                cuda_arch_ptx += arch_ptx

        cuda_arch_bin = sorted(list(set(cuda_arch_bin)))
        cuda_arch_ptx = sorted(list(set(cuda_arch_ptx)))

        nvcc_flags = []
        nvcc_archs_readable = []

        for arch in cuda_arch_bin:
            arch, codev = re.fullmatch(
                '([0-9]+\\.[0-9])(?:\\(([0-9]+\\.[0-9])\\))?', arch).groups()

            if version_compare(arch, '<' + cuda_lo_limit_gpu_architecture):
                continue
            if version_compare(arch, '>=' + cuda_hi_limit_gpu_architecture):
                continue

            if codev:
                arch = arch.replace('.', '')
                codev = codev.replace('.', '')
                nvcc_flags += ['-gencode', 'arch=compute_' + codev + ',code=sm_' + arch]
                nvcc_archs_readable += ['sm_' + arch]
            else:
                arch = arch.replace('.', '')
                nvcc_flags += ['-gencode', 'arch=compute_' + arch + ',code=sm_' + arch]
                nvcc_archs_readable += ['sm_' + arch]

        for arch in cuda_arch_ptx:
            arch, codev = re.fullmatch(
                '([0-9]+\\.[0-9])(?:\\(([0-9]+\\.[0-9])\\))?', arch).groups()

            if codev:
                arch = codev

            if version_compare(arch, '<' + cuda_lo_limit_gpu_architecture):
                continue
            if version_compare(arch, '>=' + cuda_hi_limit_gpu_architecture):
                continue

            arch = arch.replace('.', '')
            nvcc_flags += ['-gencode', 'arch=compute_' + arch + ',code=compute_' + arch]
            nvcc_archs_readable += ['compute_' + arch]

        return nvcc_flags, nvcc_archs_readable
def _nvcc_arch_flags ( self , cuda_version , cuda_arch_list = 'Auto' , detected = '' ) : # Replicates much of the logic of #     https://github.com/Kitware/CMake/blob/master/Modules/FindCUDA/select_compute_arch.cmake # except that a bug with cuda_arch_list="All" is worked around by # tracking both lower and upper limits on GPU architectures. cuda_known_gpu_architectures = [ 'Fermi' , 'Kepler' , 'Maxwell' ] # noqa: E221 cuda_common_gpu_architectures = [ '3.0' , '3.5' , '5.0' ] # noqa: E221 cuda_hi_limit_gpu_architecture = None # noqa: E221 cuda_lo_limit_gpu_architecture = '2.0' # noqa: E221 cuda_all_gpu_architectures = [ '3.0' , '3.2' , '3.5' , '5.0' ] # noqa: E221 if version_compare ( cuda_version , '<7.0' ) : cuda_hi_limit_gpu_architecture = '5.2' if version_compare ( cuda_version , '>=7.0' ) : cuda_known_gpu_architectures += [ 'Kepler+Tegra' , 'Kepler+Tesla' , 'Maxwell+Tegra' ] # noqa: E221 cuda_common_gpu_architectures += [ '5.2' ] # noqa: E221 if version_compare ( cuda_version , '<8.0' ) : cuda_common_gpu_architectures += [ '5.2+PTX' ] # noqa: E221 cuda_hi_limit_gpu_architecture = '6.0' # noqa: E221 if version_compare ( cuda_version , '>=8.0' ) : cuda_known_gpu_architectures += [ 'Pascal' , 'Pascal+Tegra' ] # noqa: E221 cuda_common_gpu_architectures += [ '6.0' , '6.1' ] # noqa: E221 cuda_all_gpu_architectures += [ '6.0' , '6.1' , '6.2' ] # noqa: E221 if version_compare ( cuda_version , '<9.0' ) : cuda_common_gpu_architectures += [ '6.1+PTX' ] # noqa: E221 cuda_hi_limit_gpu_architecture = '7.0' # noqa: E221 if version_compare ( cuda_version , '>=9.0' ) : cuda_known_gpu_architectures += [ 'Volta' , 'Xavier' ] # noqa: E221 cuda_common_gpu_architectures += [ '7.0' ] # noqa: E221 cuda_all_gpu_architectures += [ '7.0' , '7.2' ] # noqa: E221 # https://docs.nvidia.com/cuda/archive/9.0/cuda-toolkit-release-notes/index.html#unsupported-features cuda_lo_limit_gpu_architecture = '3.0' # noqa: E221 if version_compare ( cuda_version , '<10.0' ) : cuda_common_gpu_architectures += [ '7.2+PTX' ] # noqa: E221 cuda_hi_limit_gpu_architecture = '8.0' # noqa: E221 if version_compare ( cuda_version , '>=10.0' ) : cuda_known_gpu_architectures += [ 'Turing' ] # noqa: E221 cuda_common_gpu_architectures += [ '7.5' ] # noqa: E221 cuda_all_gpu_architectures += [ '7.5' ] # noqa: E221 if version_compare ( cuda_version , '<11.0' ) : cuda_common_gpu_architectures += [ '7.5+PTX' ] # noqa: E221 cuda_hi_limit_gpu_architecture = '8.0' # noqa: E221 if version_compare ( cuda_version , '>=11.0' ) : cuda_known_gpu_architectures += [ 'Ampere' ] # noqa: E221 cuda_common_gpu_architectures += [ '8.0' ] # noqa: E221 cuda_all_gpu_architectures += [ '8.0' ] # noqa: E221 # https://docs.nvidia.com/cuda/archive/11.0/cuda-toolkit-release-notes/index.html#deprecated-features cuda_lo_limit_gpu_architecture = '3.5' # noqa: E221 if version_compare ( cuda_version , '<11.1' ) : cuda_common_gpu_architectures += [ '8.0+PTX' ] # noqa: E221 cuda_hi_limit_gpu_architecture = '8.6' # noqa: E221 if version_compare ( cuda_version , '>=11.1' ) : cuda_common_gpu_architectures += [ '8.6' , '8.6+PTX' ] # noqa: E221 cuda_all_gpu_architectures += [ '8.6' ] # noqa: E221 if version_compare ( cuda_version , '<12.0' ) : cuda_hi_limit_gpu_architecture = '9.0' # noqa: E221 if not cuda_arch_list : cuda_arch_list = 'Auto' if cuda_arch_list == 'All' : # noqa: E271 cuda_arch_list = cuda_known_gpu_architectures elif cuda_arch_list == 'Common' : # noqa: E271 cuda_arch_list = cuda_common_gpu_architectures elif cuda_arch_list == 'Auto' : # noqa: E271 if detected : if isinstance ( detected , list ) : cuda_arch_list = detected else : cuda_arch_list = self . _break_arch_string ( detected ) cuda_arch_list = self . _filter_cuda_arch_list ( cuda_arch_list , cuda_lo_limit_gpu_architecture , cuda_hi_limit_gpu_architecture , cuda_common_gpu_architectures [ - 1 ] ) else : cuda_arch_list = cuda_common_gpu_architectures elif isinstance ( cuda_arch_list , str ) : cuda_arch_list = self . _break_arch_string ( cuda_arch_list ) cuda_arch_list = sorted ( x for x in set ( cuda_arch_list ) if x ) cuda_arch_bin = [ ] cuda_arch_ptx = [ ] for arch_name in cuda_arch_list : arch_bin = [ ] arch_ptx = [ ] add_ptx = arch_name . endswith ( '+PTX' ) if add_ptx : arch_name = arch_name [ : - len ( '+PTX' ) ] if re . fullmatch ( '[0-9]+\\.[0-9](\\([0-9]+\\.[0-9]\\))?' , arch_name ) : arch_bin , arch_ptx = [ arch_name ] , [ arch_name ] else : arch_bin , arch_ptx = { 'Fermi' : ( [ '2.0' , '2.1(2.0)' ] , [ ] ) , 'Kepler+Tegra' : ( [ '3.2' ] , [ ] ) , 'Kepler+Tesla' : ( [ '3.7' ] , [ ] ) , 'Kepler' : ( [ '3.0' , '3.5' ] , [ '3.5' ] ) , 'Maxwell+Tegra' : ( [ '5.3' ] , [ ] ) , 'Maxwell' : ( [ '5.0' , '5.2' ] , [ '5.2' ] ) , 'Pascal' : ( [ '6.0' , '6.1' ] , [ '6.1' ] ) , 'Pascal+Tegra' : ( [ '6.2' ] , [ ] ) , 'Volta' : ( [ '7.0' ] , [ '7.0' ] ) , 'Xavier' : ( [ '7.2' ] , [ ] ) , 'Turing' : ( [ '7.5' ] , [ '7.5' ] ) , 'Ampere' : ( [ '8.0' ] , [ '8.0' ] ) , } . get ( arch_name , ( None , None ) ) if arch_bin is None : raise InvalidArguments ( f'Unknown CUDA Architecture Name {arch_name}!' ) cuda_arch_bin += arch_bin if add_ptx : if not arch_ptx : arch_ptx = arch_bin cuda_arch_ptx += arch_ptx cuda_arch_bin = sorted ( list ( set ( cuda_arch_bin ) ) ) cuda_arch_ptx = sorted ( list ( set ( cuda_arch_ptx ) ) ) nvcc_flags = [ ] nvcc_archs_readable = [ ] for arch in cuda_arch_bin : arch , codev = re . fullmatch ( '([0-9]+\\.[0-9])(?:\\(([0-9]+\\.[0-9])\\))?' , arch ) . groups ( ) if version_compare ( arch , '<' + cuda_lo_limit_gpu_architecture ) : continue if version_compare ( arch , '>=' + cuda_hi_limit_gpu_architecture ) : continue if codev : arch = arch . replace ( '.' , '' ) codev = codev . replace ( '.' , '' ) nvcc_flags += [ '-gencode' , 'arch=compute_' + codev + ',code=sm_' + arch ] nvcc_archs_readable += [ 'sm_' + arch ] else : arch = arch . replace ( '.' , '' ) nvcc_flags += [ '-gencode' , 'arch=compute_' + arch + ',code=sm_' + arch ] nvcc_archs_readable += [ 'sm_' + arch ] for arch in cuda_arch_ptx : arch , codev = re . fullmatch ( '([0-9]+\\.[0-9])(?:\\(([0-9]+\\.[0-9])\\))?' , arch ) . groups ( ) if codev : arch = codev if version_compare ( arch , '<' + cuda_lo_limit_gpu_architecture ) : continue if version_compare ( arch , '>=' + cuda_hi_limit_gpu_architecture ) : continue arch = arch . replace ( '.' , '' ) nvcc_flags += [ '-gencode' , 'arch=compute_' + arch + ',code=compute_' + arch ] nvcc_archs_readable += [ 'compute_' + arch ] return nvcc_flags , nvcc_archs_readable