summaryrefslogblamecommitdiff
path: root/lib/spack/spack/build_systems/rocm.py
blob: f6ea0537fd5a00770d71742516de97fe52919ced (plain) (tree)
1
2
3
4
5
6
                                                                         



                                                                         
                                          

























                                                                          

                                                                             






                                                                           
                  

























                                            


                                                                             





                                                                              
                    
                                                           
                                          
 


                                                                              







                                                                               





                        

                 
                 
                        
                 
                        

                 

                        

                 

                 


                  
                  

                  








                  

     
                                                                     
 
                                              



                                                                 
                    

                     
 

                                            
                                         
 
                                       
                                                 
 





                                                                             
                                       
                                                  






                                                         









                                                                        

                                                                 












                                                                  






                                                                   
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

# Troubleshooting advice for +rocm builds:
#
# 1. When building with clang, go your compilers.yaml,
#    add an entry for the amd version of clang, as below.
#    This will ensure that your entire package is compiled/linked
#    with the same compiler version. If you use a different version of
#    clang which is linked against a different version of the gcc library,
#    you will get errors along the lines of:
#    undefined reference to
#       `std::__throw_out_of_range_fmt(char const*, ...)@@GLIBCXX_3.4.20'
#    which is indicative of a mismatch in standard library versions.
#
#    in compilers.yaml
#    - compiler:
#        spec: clang@amd
#        paths:
#          cc: /opt/rocm/llvm/bin/clang
#          cxx: /opt/rocm/llvm/bin/clang++
#          f77:
#          fc:
#        flags: {}
#        operating_system: rhel7
#        target: x86_64
#        modules: []
#        environment: {}
#        extra_rpaths: []
#
#    It is advisable to replace /rocm/ in the paths above with /rocm-version/
#    and introduce spec version numbers to ensure reproducible results.
#
# 2. hip and its dependencies are currently NOT picked up by spack
#    automatically, and should therefore be added to packages.yaml by hand:
#
#    in packages.yaml:
#    hip:
#      externals:
#      - spec: hip
#        prefix: /opt/rocm/hip
#        extra_attributes:
#          compilers:
#            c: /opt/rocm/llvm/bin/clang++
#            c++: /opt/rocm/llvm/bin/clang++
#            hip: /opt/rocm/hip/bin/hipcc
#      buildable: false
#    hsa-rocr-dev:
#      externals:
#      - spec: hsa-rocr-dev
#        prefix: /opt/rocm
#        extra_attributes:
#          compilers:
#            c: /opt/rocm/llvm/bin/clang++
#            cxx: /opt/rocm/llvm/bin/clang++
#      buildable: false
#    llvm-amdgpu:
#      externals:
#      - spec: llvm-amdgpu
#        prefix: /opt/rocm/llvm
#        extra_attributes:
#          compilers:
#            c: /opt/rocm/llvm/bin/clang++
#            cxx: /opt/rocm/llvm/bin/clang++
#      buildable: false
#
#    It is advisable to replace /rocm/ in the paths above with /rocm-version/
#    and introduce spec version numbers to ensure reproducible results.
#
# 3. In part 2, DO NOT list the path to hsa as /opt/rocm/hsa ! You want spack
#    to find hsa in /opt/rocm/include/hsa/hsa.h . The directory of
#    /opt/rocm/hsa also has an hsa.h file, but it won't be found because spack
#    does not like its directory structure.
#

import spack.variant
from spack.directives import conflicts, depends_on, variant
from spack.package_base import PackageBase


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",
        "gfx900:xnack-",
        "gfx902",
        "gfx904",
        "gfx906",
        "gfx906:xnack-",
        "gfx908",
        "gfx908:xnack-",
        "gfx909",
        "gfx90a",
        "gfx90a:xnack-",
        "gfx90a:xnack+",
        "gfx90c",
        "gfx940",
        "gfx941",
        "gfx942",
        "gfx1010",
        "gfx1011",
        "gfx1012",
        "gfx1013",
        "gfx1030",
        "gfx1031",
        "gfx1032",
        "gfx1033",
        "gfx1034",
        "gfx1035",
        "gfx1036",
        "gfx1100",
        "gfx1101",
        "gfx1102",
        "gfx1103",
    )

    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),
        sticky=True,
        when="+rocm",
    )

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

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

    # 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)

    # HIP version vs Architecture

    # TODO: add a bunch of lines like:
    # depends_on('hip@:6.0', when='amdgpu_target=gfx701')
    # to indicate minimum version for each architecture.

    # Add compiler minimum versions based on the first release where the
    # processor is included in llvm/lib/Support/TargetParser.cpp
    depends_on("llvm-amdgpu@4.1.0:", when="amdgpu_target=gfx900:xnack-")
    depends_on("llvm-amdgpu@4.1.0:", when="amdgpu_target=gfx906:xnack-")
    depends_on("llvm-amdgpu@4.1.0:", when="amdgpu_target=gfx908:xnack-")
    depends_on("llvm-amdgpu@4.1.0:", when="amdgpu_target=gfx90c")
    depends_on("llvm-amdgpu@4.3.0:", when="amdgpu_target=gfx90a")
    depends_on("llvm-amdgpu@4.3.0:", when="amdgpu_target=gfx90a:xnack-")
    depends_on("llvm-amdgpu@4.3.0:", when="amdgpu_target=gfx90a:xnack+")
    depends_on("llvm-amdgpu@5.2.0:", when="amdgpu_target=gfx940")
    depends_on("llvm-amdgpu@5.7.0:", when="amdgpu_target=gfx941")
    depends_on("llvm-amdgpu@5.7.0:", when="amdgpu_target=gfx942")
    depends_on("llvm-amdgpu@4.5.0:", when="amdgpu_target=gfx1013")
    depends_on("llvm-amdgpu@3.8.0:", when="amdgpu_target=gfx1030")
    depends_on("llvm-amdgpu@3.9.0:", when="amdgpu_target=gfx1031")
    depends_on("llvm-amdgpu@4.1.0:", when="amdgpu_target=gfx1032")
    depends_on("llvm-amdgpu@4.1.0:", when="amdgpu_target=gfx1033")
    depends_on("llvm-amdgpu@4.3.0:", when="amdgpu_target=gfx1034")
    depends_on("llvm-amdgpu@4.5.0:", when="amdgpu_target=gfx1035")
    depends_on("llvm-amdgpu@5.2.0:", when="amdgpu_target=gfx1036")
    depends_on("llvm-amdgpu@5.3.0:", when="amdgpu_target=gfx1100")
    depends_on("llvm-amdgpu@5.3.0:", when="amdgpu_target=gfx1101")
    depends_on("llvm-amdgpu@5.3.0:", when="amdgpu_target=gfx1102")
    depends_on("llvm-amdgpu@5.3.0:", when="amdgpu_target=gfx1103")

    # Compiler conflicts

    # TODO: add conflicts statements along the lines of
    # arch_platform = ' target=x86_64: platform=linux'
    # conflicts('%gcc@5:', when='+cuda ^cuda@:7.5' + arch_platform)
    # conflicts('platform=darwin', when='+cuda ^cuda@11.0.2:')
    # for hip-related limitations.