Ejemplo n.º 1
0
class ROCmPackage(PackageBase):
    """Auxiliary class which contains ROCm variant, dependencies and conflicts
    and is meant to unify and facilitate its usage. Closely mimics CudaPackage.

    Maintainers: dtaller
    """

    # https://llvm.org/docs/AMDGPUUsage.html
    # Possible architectures
    amdgpu_targets = (
        'gfx701', 'gfx801', 'gfx802', 'gfx803',
        'gfx900', 'gfx906', 'gfx908', 'gfx90a', 'gfx1010',
        'gfx1011', 'gfx1012'
    )

    variant('rocm', default=False, description='Enable ROCm support')

    # possible amd gpu targets for rocm builds
    variant('amdgpu_target',
            description='AMD GPU architecture',
            values=spack.variant.any_combination_of(*amdgpu_targets),
            when='+rocm')

    depends_on('llvm-amdgpu', when='+rocm')
    depends_on('hsa-rocr-dev', when='+rocm')
    depends_on('hip', when='+rocm')

    conflicts('^blt@:0.3.6', when='+rocm')

    # need amd gpu type for rocm builds
    conflicts('amdgpu_target=none', when='+rocm')

    # Make sure amdgpu_targets cannot be used without +rocm
    for value in amdgpu_targets:
        conflicts('~rocm', when='amdgpu_target=' + value)

    # https://github.com/ROCm-Developer-Tools/HIP/blob/master/bin/hipcc
    # It seems that hip-clang does not (yet?) accept this flag, in which case
    # we will still need to set the HCC_AMDGPU_TARGET environment flag in the
    # hip package file. But I will leave this here for future development.
    @staticmethod
    def hip_flags(amdgpu_target):
        archs = ",".join(amdgpu_target)
        return '--amdgpu-target={0}'.format(archs)
Ejemplo n.º 2
0
class CudaPackage(PackageBase):
    """Auxiliary class which contains CUDA variant, dependencies and conflicts
    and is meant to unify and facilitate its usage.

    Maintainers: ax3l, Rombur, davidbeckingsale
    """

    # https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-feature-list
    # https://developer.nvidia.com/cuda-gpus
    # https://en.wikipedia.org/wiki/CUDA#GPUs_supported
    cuda_arch_values = (
        '10', '11', '12', '13',
        '20', '21',
        '30', '32', '35', '37',
        '50', '52', '53',
        '60', '61', '62',
        '70', '72', '75',
        '80', '86'
    )

    # FIXME: keep cuda and cuda_arch separate to make usage easier until
    # Spack has depends_on(cuda, when='cuda_arch!=None') or alike
    variant('cuda', default=False,
            description='Build with CUDA')

    variant('cuda_arch',
            description='CUDA architecture',
            values=spack.variant.any_combination_of(*cuda_arch_values),
            when='+cuda')

    # https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#nvcc-examples
    # https://llvm.org/docs/CompileCudaWithLLVM.html#compiling-cuda-code
    @staticmethod
    def cuda_flags(arch_list):
        return [('--generate-code arch=compute_{0},code=sm_{0} '
                 '--generate-code arch=compute_{0},code=compute_{0}').format(s)
                for s in arch_list]

    depends_on('cuda', when='+cuda')

    # CUDA version vs Architecture
    # https://en.wikipedia.org/wiki/CUDA#GPUs_supported
    # https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#deprecated-features
    depends_on('cuda@:6.0',     when='cuda_arch=10')
    depends_on('cuda@:6.5',     when='cuda_arch=11')
    depends_on('[email protected]:6.5',  when='cuda_arch=12')
    depends_on('[email protected]:6.5',  when='cuda_arch=13')

    depends_on('[email protected]:8.0',  when='cuda_arch=20')
    depends_on('[email protected]:8.0',  when='cuda_arch=21')

    depends_on('[email protected]:10.2', when='cuda_arch=30')
    depends_on('[email protected]:10.2', when='cuda_arch=32')
    depends_on('[email protected]:',     when='cuda_arch=35')
    depends_on('[email protected]:',     when='cuda_arch=37')

    depends_on('[email protected]:',     when='cuda_arch=50')
    depends_on('[email protected]:',     when='cuda_arch=52')
    depends_on('[email protected]:',     when='cuda_arch=53')

    depends_on('[email protected]:',     when='cuda_arch=60')
    depends_on('[email protected]:',     when='cuda_arch=61')
    depends_on('[email protected]:',     when='cuda_arch=62')

    depends_on('[email protected]:',     when='cuda_arch=70')
    depends_on('[email protected]:',     when='cuda_arch=72')
    depends_on('[email protected]:',    when='cuda_arch=75')

    depends_on('[email protected]:',    when='cuda_arch=80')
    depends_on('[email protected]:',    when='cuda_arch=86')

    # From the NVIDIA install guide we know of conflicts for particular
    # platforms (linux, darwin), architectures (x86, powerpc) and compilers
    # (gcc, clang). We don't restrict %gcc and %clang conflicts to
    # platform=linux, since they should also apply to platform=cray, and may
    # apply to platform=darwin. We currently do not provide conflicts for
    # platform=darwin with %apple-clang.

    # Linux x86_64 compiler conflicts from here:
    # https://gist.github.com/ax3l/9489132

    # GCC
    # According to
    # https://github.com/spack/spack/pull/25054#issuecomment-886531664
    # these conflicts are valid independently from the architecture

    # minimum supported versions
    conflicts('%gcc@:4', when='+cuda ^[email protected]:')
    conflicts('%gcc@:5', when='+cuda ^[email protected]:')

    # maximum supported version
    # NOTE:
    # in order to not constrain future cuda version to old gcc versions,
    # it has been decided to use an upper bound for the latest version.
    # This implies that the last one in the list has to be updated at
    # each release of a new cuda minor version.
    conflicts('%gcc@10:', when='+cuda ^cuda@:11.0')
    conflicts('%gcc@12:', when='+cuda ^cuda@:11.6')
    conflicts('%clang@13:', when='+cuda ^cuda@:11.5')
    conflicts('%clang@14:', when='+cuda ^cuda@:11.6')

    # https://gist.github.com/ax3l/9489132#gistcomment-3860114
    conflicts('%gcc@10', when='+cuda ^cuda@:11.4.0')
    conflicts('%gcc@5:', when='+cuda ^cuda@:7.5 target=x86_64:')
    conflicts('%gcc@6:', when='+cuda ^cuda@:8 target=x86_64:')
    conflicts('%gcc@7:', when='+cuda ^cuda@:9.1 target=x86_64:')
    conflicts('%gcc@8:', when='+cuda ^cuda@:10.0.130 target=x86_64:')
    conflicts('%gcc@9:', when='+cuda ^cuda@:10.2.89 target=x86_64:')
    conflicts('%pgi@:14.8', when='+cuda ^cuda@:7.0.27 target=x86_64:')
    conflicts('%pgi@:15.3,15.5:', when='+cuda ^[email protected] target=x86_64:')
    conflicts('%pgi@:16.2,16.0:16.3', when='+cuda ^cuda@8 target=x86_64:')
    conflicts('%pgi@:15,18:', when='+cuda ^[email protected]:9.1 target=x86_64:')
    conflicts('%pgi@:16,19:', when='+cuda ^[email protected]:10 target=x86_64:')
    conflicts('%pgi@:17,20:', when='+cuda ^[email protected]:10.2.89 target=x86_64:')
    conflicts('%pgi@:17,21:', when='+cuda ^[email protected]:11.1.0 target=x86_64:')
    conflicts('%clang@:3.4', when='+cuda ^cuda@:7.5 target=x86_64:')
    conflicts('%clang@:3.7,4:', when='+cuda ^[email protected]:9.0 target=x86_64:')
    conflicts('%clang@:3.7,4.1:', when='+cuda ^[email protected] target=x86_64:')
    conflicts('%clang@:3.7,5.1:', when='+cuda ^[email protected] target=x86_64:')
    conflicts('%clang@:3.7,6.1:', when='+cuda ^[email protected] target=x86_64:')
    conflicts('%clang@:3.7,7.1:', when='+cuda ^[email protected] target=x86_64:')
    conflicts('%clang@:3.7,8.1:',
              when='+cuda ^[email protected]:10.1.243 target=x86_64:')
    conflicts('%clang@:3.2,9:', when='+cuda ^[email protected] target=x86_64:')
    conflicts('%clang@:5', when='+cuda ^[email protected]: target=x86_64:')
    conflicts('%clang@10:', when='+cuda ^cuda@:11.0.3 target=x86_64:')
    conflicts('%clang@11:', when='+cuda ^cuda@:11.1.0 target=x86_64:')

    # x86_64 vs. ppc64le differ according to NVidia docs
    # Linux ppc64le compiler conflicts from Table from the docs below:
    # https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
    # https://docs.nvidia.com/cuda/archive/9.2/cuda-installation-guide-linux/index.html
    # https://docs.nvidia.com/cuda/archive/9.1/cuda-installation-guide-linux/index.html
    # https://docs.nvidia.com/cuda/archive/9.0/cuda-installation-guide-linux/index.html
    # https://docs.nvidia.com/cuda/archive/8.0/cuda-installation-guide-linux/index.html

    # information prior to CUDA 9 difficult to find
    conflicts('%gcc@6:', when='+cuda ^cuda@:9 target=ppc64le:')
    conflicts('%gcc@8:', when='+cuda ^cuda@:10.0.130 target=ppc64le:')
    conflicts('%gcc@9:', when='+cuda ^cuda@:10.1.243 target=ppc64le:')
    # officially, CUDA 11.0.2 only supports the system GCC 8.3 on ppc64le
    conflicts('%pgi', when='+cuda ^cuda@:8 target=ppc64le:')
    conflicts('%pgi@:16', when='+cuda ^cuda@:9.1.185 target=ppc64le:')
    conflicts('%pgi@:17', when='+cuda ^cuda@:10 target=ppc64le:')
    conflicts('%clang@4:', when='+cuda ^cuda@:9.0.176 target=ppc64le:')
    conflicts('%clang@5:', when='+cuda ^cuda@:9.1 target=ppc64le:')
    conflicts('%clang@6:', when='+cuda ^cuda@:9.2 target=ppc64le:')
    conflicts('%clang@7:', when='+cuda ^[email protected] target=ppc64le:')
    conflicts('%[email protected]:', when='+cuda ^cuda@:10.1.105 target=ppc64le:')
    conflicts('%[email protected]:', when='+cuda ^cuda@:10.2.89 target=ppc64le:')
    conflicts('%clang@:5', when='+cuda ^[email protected]: target=ppc64le:')
    conflicts('%clang@10:', when='+cuda ^cuda@:11.0.2 target=ppc64le:')
    conflicts('%clang@11:', when='+cuda ^cuda@:11.1.0 target=ppc64le:')

    # Intel is mostly relevant for x86_64 Linux, even though it also
    # exists for Mac OS X. No information prior to CUDA 3.2 or Intel 11.1
    conflicts('%intel@:11.0', when='+cuda ^cuda@:3.1')
    conflicts('%intel@:12.0', when='+cuda ^[email protected]:')
    conflicts('%intel@:13.0', when='+cuda ^[email protected]:')
    conflicts('%intel@:13.2', when='+cuda ^[email protected]:')
    conflicts('%intel@:14.9', when='+cuda ^cuda@7:')
    # Intel 15.x is compatible with CUDA 7 thru current CUDA
    conflicts('%[email protected]:', when='+cuda ^cuda@:8.0.43')
    conflicts('%[email protected]:', when='+cuda ^cuda@:8.0.60')
    conflicts('%[email protected]:', when='+cuda ^cuda@:9.9')
    conflicts('%[email protected]:', when='+cuda ^cuda@:10.0')
    conflicts('%[email protected]:', when='+cuda ^cuda@:10.1')
    conflicts('%[email protected]:', when='+cuda ^cuda@:11.1.0')

    # XL is mostly relevant for ppc64le Linux
    conflicts('%xl@:12,14:', when='+cuda ^cuda@:9.1')
    conflicts('%xl@:12,14:15,17:', when='+cuda ^[email protected]')
    conflicts('%xl@:12,17:', when='+cuda ^cuda@:11.1.0')

    # Darwin.
    # TODO: add missing conflicts for %apple-clang cuda@:10
    conflicts('platform=darwin', when='+cuda ^[email protected]: ')

    # Make sure cuda_arch can not be used without +cuda
    for value in cuda_arch_values:
        conflicts('~cuda', when='cuda_arch=' + value)