[intel-oneapi-mkl] provide omp lib for threads=openmp (#42653)

This commit is contained in:
Robert Cohn 2024-02-16 02:48:42 -05:00 committed by GitHub
parent 79087d08d9
commit 5c3df6e8ca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 1 deletions

View File

@ -9,16 +9,26 @@
import shutil
from os.path import basename, isdir
from llnl.util.filesystem import HeaderList, find_libraries, join_path, mkdirp
from llnl.util import tty
from llnl.util.filesystem import HeaderList, LibraryList, find_libraries, join_path, mkdirp
from llnl.util.link_tree import LinkTree
from spack.build_environment import dso_suffix
from spack.directives import conflicts, variant
from spack.package_base import InstallError
from spack.util.environment import EnvironmentModifications
from spack.util.executable import Executable
from .generic import Package
def raise_lib_error(*args):
"""Bails out with an error message. Shows args after the first as one per
line, tab-indented, useful for long paths to line up and stand out.
"""
raise InstallError("\n\t".join(str(i) for i in args))
class IntelOneApiPackage(Package):
"""Base class for Intel oneAPI packages."""
@ -179,6 +189,39 @@ class IntelOneApiLibraryPackage(IntelOneApiPackage):
"""
def openmp_libs(self):
"""Supply LibraryList for linking OpenMP"""
# NB: Hunting down explicit library files may be the Spack way of
# doing things, but it is better to add the compiler defined option
# e.g. -fopenmp
# If other packages use openmp, then all the packages need to
# support the same ABI. Spack usually uses the same compiler
# for all the packages, but you can force it if necessary:
#
# e.g. spack install blaspp%oneapi@2024 ^intel-oneapi-mkl%oneapi@2024
#
if self.spec.satisfies("%intel") or self.spec.satisfies("%oneapi"):
libname = "libiomp5"
elif self.spec.satisfies("%gcc"):
libname = "libgomp"
else:
raise_lib_error("MKL OMP requires one of %gcc, %oneapi,or %intel")
# query the compiler for the library path
with self.compiler.compiler_environment():
omp_lib_path = Executable(self.compiler.cc)(
"--print-file-name", f"{libname}.{dso_suffix}", output=str
).strip()
# if the compiler cannot find the file, it returns the input path
if not os.path.exists(omp_lib_path):
raise_lib_error(f"Cannot locate OpenMP library: {omp_lib_path}")
omp_libs = LibraryList(omp_lib_path)
tty.info(f"mkl requires openmp library: {omp_libs}")
return omp_libs
# find_headers uses heuristics to determine the include directory
# that does not work for oneapi packages. Use explicit directories
# instead.

View File

@ -241,6 +241,8 @@ def _find_mkl_libs(self, shared):
except spack.error.NoLibrariesError:
pass
if self.spec.satisfies("threads=openmp"):
resolved_libs += self.openmp_libs()
return resolved_libs
def _xlp64_lib(self, lib):