146 lines
5.8 KiB
Python
146 lines
5.8 KiB
Python
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
from spack_repo.builtin.packages.netlib_scalapack.package import ScalapackBase
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Amdscalapack(ScalapackBase):
|
|
"""
|
|
ScaLAPACK is a library of high-performance linear algebra routines
|
|
for parallel distributed memory machines. It depends on external
|
|
libraries including BLAS and LAPACK for Linear Algebra computations.
|
|
|
|
AMD's optimized version of ScaLAPACK enables using BLIS and
|
|
LibFLAME library that have optimized dense matrix functions and
|
|
solvers for AMD EPYC processor family CPUs.
|
|
|
|
LICENSING INFORMATION: By downloading, installing and using this software,
|
|
you agree to the terms and conditions of the AMD AOCL-ScaLAPACK license
|
|
agreement. You may obtain a copy of this license agreement from
|
|
https://www.amd.com/en/developer/aocl/scalapack/eula/scalapack-libraries-4-2-eula.html
|
|
https://www.amd.com/en/developer/aocl/scalapack/eula/scalapack-libraries-eula.html
|
|
"""
|
|
|
|
_name = "amdscalapack"
|
|
homepage = "https://www.amd.com/en/developer/aocl/scalapack.html"
|
|
git = "https://github.com/amd/aocl-scalapack"
|
|
|
|
maintainers("amd-toolchain-support")
|
|
|
|
tags = ["e4s"]
|
|
|
|
license("BSD-3-Clause-Open-MPI")
|
|
version(
|
|
"5.0",
|
|
sha256="a33cf16c51cfd65c7acb5fbdb8884a5c147cdefea73931b07863c56d54f812cc",
|
|
preferred=True,
|
|
)
|
|
version("4.2", sha256="c6e9a846c05cdc05252b0b5f264164329812800bf13f9d97c77114dc138e6ccb")
|
|
version("4.1", sha256="b2e51c3604e5869d1faaef2e52c92071fcb3de1345aebb2ea172206622067ad9")
|
|
version("4.0", sha256="f02913b5984597b22cdb9a36198ed61039a1bf130308e778dc31b2a7eb88b33b")
|
|
version("3.2", sha256="9e00979bb1be39d627bdacb01774bc043029840d542fafc934d16fec3e3b0892")
|
|
version("3.1", sha256="4c2ee2c44644a0feec0c6fc1b1a413fa9028f14d7035d43a398f5afcfdbacb98")
|
|
version("3.0", sha256="6e6f3578f44a8e64518d276e7580530599ecfa8729f568303ed2590688e7096f")
|
|
version("2.2", sha256="2d64926864fc6d12157b86e3f88eb1a5205e7fc157bf67e7577d0f18b9a7484c")
|
|
|
|
depends_on("c", type="build") # generated
|
|
depends_on("fortran", type="build") # generated
|
|
depends_on("amdblis", when="^[virtuals=blas] amdblis")
|
|
depends_on("amdlibflame", when="^[virtuals=lapack] amdlibflame")
|
|
|
|
variant("ilp64", default=False, description="Build with ILP64 support")
|
|
|
|
conflicts("+ilp64", when="@:3.0", msg="ILP64 is supported from 3.1 onwards")
|
|
requires("target=x86_64:", msg="AMD scalapack available only on x86_64")
|
|
|
|
patch("clang-hollerith.patch", when="@=4.0 %clang@16:")
|
|
|
|
def patch(self):
|
|
# Flang-New gets confused and thinks it finds Hollerith constants
|
|
if self.spec.satisfies("%clang@16:"):
|
|
filter_file("-cpp", "", "CMakeLists.txt")
|
|
# remove the C-style comments in header file that cause issues with flang
|
|
if self.spec.satisfies("@4.2: %clang@18:"):
|
|
which("sed")(
|
|
"-i",
|
|
"1,23d",
|
|
join_path(self.stage.source_path, "FRAMEWORK", "SL_Context_fortran_include.h"),
|
|
)
|
|
|
|
def url_for_version(self, version):
|
|
vers = "https://github.com/amd/{0}/archive/{1}.tar.gz"
|
|
if version >= Version("3.1"):
|
|
return vers.format("aocl-scalapack", version)
|
|
else:
|
|
return vers.format("scalapack", version)
|
|
|
|
def flag_handler(self, name, flags):
|
|
(flags, _, _) = super().flag_handler(name, flags)
|
|
# remove a flag set in ScalapackBase that is not working
|
|
if self.spec.satisfies("%gcc@14:"):
|
|
if "-std=gnu89" in flags:
|
|
flags.remove("-std=gnu89")
|
|
return (flags, None, None)
|
|
|
|
def cmake_args(self):
|
|
"""cmake_args function"""
|
|
args = super().cmake_args()
|
|
spec = self.spec
|
|
|
|
if spec.satisfies("%gcc@10:"):
|
|
args.extend(["-DCMAKE_Fortran_FLAGS={0}".format("-fallow-argument-mismatch")])
|
|
|
|
if spec.satisfies("%clang@16:"):
|
|
flags = "-cpp -fno-implicit-none"
|
|
if spec.satisfies("%clang@18"):
|
|
flags += " -flang-experimental-polymorphism"
|
|
if spec.satisfies("%clang@18:"):
|
|
flags += " -I{0}".format(join_path(self.stage.source_path, "FRAMEWORK"))
|
|
args.extend(["-DCMAKE_Fortran_FLAGS={0}".format(flags)])
|
|
|
|
if spec.satisfies("@2.2"):
|
|
args.extend(
|
|
[
|
|
"-DUSE_DOTC_WRAPPER:BOOL=%s"
|
|
% ("ON" if spec.satisfies("%aocc ^amdblis") else "OFF")
|
|
]
|
|
)
|
|
|
|
# -DENABLE_ILP64:BOOL=ON
|
|
args.extend([self.define_from_variant("ENABLE_ILP64", "ilp64")])
|
|
|
|
# -DUSE_F2C:BOOL=ON
|
|
args.extend([self.define("USE_F2C", spec.satisfies("@:3.0"))])
|
|
|
|
if self.spec.satisfies("%clang@16:") or self.spec.satisfies("%aocc@4.1.0:"):
|
|
c_flags = []
|
|
c_flags.append("-Wno-implicit-function-declaration")
|
|
c_flags.append("-Wno-deprecated-non-prototype")
|
|
c_flags.append("-Wno-incompatible-pointer-types")
|
|
args.append(self.define("CMAKE_C_FLAGS", " ".join(c_flags)))
|
|
elif self.spec.satisfies("%gcc@14:"):
|
|
args.append(self.define("CMAKE_C_FLAGS", "-Wno-incompatible-pointer-types"))
|
|
|
|
# link libflame library
|
|
args.extend(["-DLAPACK_LIBRARIES={0}".format(self.spec["lapack"].libs)])
|
|
|
|
args.extend(
|
|
[
|
|
"-DLAPACK_FOUND=true",
|
|
"-DUSE_OPTIMIZED_LAPACK_BLAS=true",
|
|
"-DCMAKE_C_COMPILER=%s" % spec["mpi"].mpicc,
|
|
"-DCMAKE_Fortran_COMPILER=%s" % spec["mpi"].mpifc,
|
|
]
|
|
)
|
|
|
|
return args
|
|
|
|
def setup_dependent_run_environment(
|
|
self, env: EnvironmentModifications, dependent_spec: Spec
|
|
) -> None:
|
|
if self.spec.external:
|
|
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib)
|