some fixes to blas/lapack usage in packages (#1852)
* atlas: fix unit test * openblas: remove symlinks; use lapack_libs.ld_flags in the test * mkl: fix openmp variant of blas/lapack libs * intel-parallel-studio: fix openmp variant of blas/lapack libs * netlib-scalapack: fix blas/lapack for multilib case (e.g. mkl) * arpack-ng: fix blas/lapack for multilib case (e.g. mkl) * petsc: explicitly specify blas/lapack * minor * cantera: fix blas/lapack usage * ipopt: fix blas/lapack usage * netlib-lapack: fix external blas usage * mfem: fix lapack/blas usage * superlu-mt: fix blas usage * flake8 fixes
This commit is contained in:
parent
cb36aadaf6
commit
1e10309ff7
@ -88,8 +88,8 @@ def install(self, spec, prefix):
|
||||
options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s/lib' % prefix)
|
||||
|
||||
# Make sure we use Spack's blas/lapack:
|
||||
lapack_libs = spec['lapack'].lapack_libs.joined()
|
||||
blas_libs = spec['blas'].blas_libs.joined()
|
||||
lapack_libs = spec['lapack'].lapack_libs.joined(';')
|
||||
blas_libs = spec['blas'].blas_libs.joined(';')
|
||||
|
||||
options.extend([
|
||||
'-DLAPACK_FOUND=true',
|
||||
|
@ -142,7 +142,7 @@ def install_test(self):
|
||||
'test_cblas_dgemm.output')
|
||||
|
||||
include_flags = ["-I%s" % self.spec.prefix.include]
|
||||
link_flags = self.lapack_libs.ld_flags
|
||||
link_flags = self.lapack_libs.ld_flags.split()
|
||||
|
||||
output = compile_c_and_execute(source_file, include_flags, link_flags)
|
||||
compare_output_file(output, blessed_file)
|
||||
|
@ -85,8 +85,9 @@ def install(self, spec, prefix):
|
||||
|
||||
# BLAS/LAPACK support
|
||||
if '+lapack' in spec:
|
||||
lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs
|
||||
options.extend([
|
||||
'blas_lapack_libs=lapack,blas',
|
||||
'blas_lapack_libs={0}'.format(','.join(lapack_blas.names)),
|
||||
'blas_lapack_dir={0}'.format(spec['lapack'].prefix.lib)
|
||||
])
|
||||
|
||||
|
@ -64,7 +64,10 @@ def blas_libs(self):
|
||||
shared = True if '+shared' in self.spec else False
|
||||
suffix = dso_suffix if '+shared' in self.spec else 'a'
|
||||
mkl_integer = ['libmkl_intel_ilp64'] if '+ilp64' in self.spec else ['libmkl_intel_lp64'] # NOQA: ignore=E501
|
||||
mkl_threading = ['libmkl_intel_thread'] if '+openmp' in self.spec else ['libmkl_sequential'] # NOQA: ignore=E501
|
||||
mkl_threading = ['libmkl_sequential']
|
||||
if '+openmp' in self.spec:
|
||||
mkl_threading = ['libmkl_intel_thread', 'libiomp5'] if '%intel' in self.spec else ['libmkl_gnu_thread'] # NOQA: ignore=E501
|
||||
# TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++']
|
||||
mkl_libs = find_libraries(
|
||||
mkl_integer + ['libmkl_core'] + mkl_threading,
|
||||
root=join_path(self.prefix.lib, 'intel64'),
|
||||
|
@ -53,9 +53,8 @@ def install(self, spec, prefix):
|
||||
mumps_flags = "-ldmumps -lmumps_common -lpord -lmpiseq"
|
||||
mumps_libcmd = "-L%s " % mumps_dir.lib + mumps_flags
|
||||
|
||||
# By convention, spack links blas & lapack libs to libblas & liblapack
|
||||
blas_lib = "-L%s" % blas_dir.lib + " -lblas"
|
||||
lapack_lib = "-L%s" % lapack_dir.lib + " -llapack"
|
||||
blas_lib = spec['blas'].blas_libs.ld_flags
|
||||
lapack_lib = spec['lapack'].lapack_libs.ld_flags
|
||||
|
||||
configure_args = [
|
||||
"--prefix=%s" % prefix,
|
||||
|
@ -89,8 +89,7 @@ def install(self, spec, prefix):
|
||||
options = ['PREFIX=%s' % prefix]
|
||||
|
||||
if '+lapack' in spec:
|
||||
lapack_lib = '-L{0} -llapack -L{1} -lblas'.format(
|
||||
spec['lapack'].prefix.lib, spec['blas'].prefix.lib)
|
||||
lapack_lib = (spec['lapack'].lapack_libs + spec['blas'].blas_libs).ld_flags # NOQA: ignore=E501
|
||||
options.extend([
|
||||
'MFEM_USE_LAPACK=YES',
|
||||
'LAPACK_OPT=-I%s' % spec['lapack'].prefix.include,
|
||||
|
@ -39,8 +39,9 @@ def blas_libs(self):
|
||||
suffix = dso_suffix if '+shared' in self.spec else 'a'
|
||||
mkl_integer = ['libmkl_intel_ilp64'] if '+ilp64' in self.spec else ['libmkl_intel_lp64'] # NOQA: ignore=E501
|
||||
mkl_threading = ['libmkl_sequential']
|
||||
if '+openmp' in spec:
|
||||
mkl_threading = ['libmkl_intel_thread'] if '%intel' in self.spec else ['libmkl_gnu_thread'] # NOQA: ignore=E501
|
||||
if '+openmp' in self.spec:
|
||||
mkl_threading = ['libmkl_intel_thread', 'libiomp5'] if '%intel' in self.spec else ['libmkl_gnu_thread'] # NOQA: ignore=E501
|
||||
# TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++']
|
||||
mkl_libs = find_libraries(
|
||||
mkl_integer + ['libmkl_core'] + mkl_threading,
|
||||
root=join_path(self.prefix.lib, 'intel64'),
|
||||
|
@ -91,12 +91,9 @@ def install_one(self, spec, prefix, shared):
|
||||
cmake_args.extend(['-DCBLAS=ON']) # always build CBLAS
|
||||
|
||||
if '+external-blas' in spec:
|
||||
# TODO : mechanism to specify the library should be more general,
|
||||
# TODO : but this allows to have an hook to an external blas
|
||||
cmake_args.extend([
|
||||
'-DUSE_OPTIMIZED_BLAS:BOOL=ON',
|
||||
'-DBLAS_LIBRARIES:PATH=%s' % join_path(
|
||||
spec['blas'].prefix.lib, 'libblas.a')
|
||||
'-DBLAS_LIBRARIES:PATH=%s' % spec['blas'].blas_libs.joined(';')
|
||||
])
|
||||
|
||||
cmake_args.extend(std_cmake_args)
|
||||
|
@ -79,8 +79,8 @@ def install(self, spec, prefix):
|
||||
options.extend([
|
||||
'-DLAPACK_FOUND=true',
|
||||
'-DLAPACK_INCLUDE_DIRS=%s' % spec['lapack'].prefix.include,
|
||||
'-DLAPACK_LIBRARIES=%s' % (lapack.joined()),
|
||||
'-DBLAS_LIBRARIES=%s' % (blas.joined())
|
||||
'-DLAPACK_LIBRARIES=%s' % (lapack.joined(';')),
|
||||
'-DBLAS_LIBRARIES=%s' % (blas.joined(';'))
|
||||
])
|
||||
|
||||
if '+fpic' in spec:
|
||||
|
@ -111,24 +111,6 @@ def install(self, spec, prefix):
|
||||
# no quotes around prefix (spack doesn't use a shell)
|
||||
make('install', "PREFIX=%s" % prefix, *make_defs)
|
||||
|
||||
# TODO : the links below are mainly there because client
|
||||
# TODO : packages are wrongly written. Check if they can be removed
|
||||
|
||||
# Blas virtual package should provide blas.a and libblas.a
|
||||
with working_dir(prefix.lib):
|
||||
symlink('libopenblas.a', 'blas.a')
|
||||
symlink('libopenblas.a', 'libblas.a')
|
||||
if '+shared' in spec:
|
||||
symlink('libopenblas.%s' % dso_suffix,
|
||||
'libblas.%s' % dso_suffix)
|
||||
|
||||
# Lapack virtual package should provide liblapack.a
|
||||
with working_dir(prefix.lib):
|
||||
symlink('libopenblas.a', 'liblapack.a')
|
||||
if '+shared' in spec:
|
||||
symlink('libopenblas.%s' % dso_suffix,
|
||||
'liblapack.%s' % dso_suffix)
|
||||
|
||||
# Openblas may pass its own test but still fail to compile Lapack
|
||||
# symbols. To make sure we get working Blas and Lapack, do a small
|
||||
# test.
|
||||
@ -141,10 +123,8 @@ def check_install(self, spec):
|
||||
'test_cblas_dgemm.output')
|
||||
|
||||
include_flags = ["-I%s" % join_path(spec.prefix, "include")]
|
||||
link_flags = ["-L%s" % join_path(spec.prefix, "lib"),
|
||||
"-llapack",
|
||||
"-lblas",
|
||||
"-lpthread"]
|
||||
link_flags = self.lapack_libs.ld_flags.split()
|
||||
link_flags.extend(["-lpthread"])
|
||||
if '+openmp' in spec:
|
||||
link_flags.extend([self.compiler.openmp_flag])
|
||||
|
||||
|
@ -129,9 +129,15 @@ def install(self, spec, prefix):
|
||||
'--with-scalar-type=%s' % (
|
||||
'complex' if '+complex' in spec else 'real'),
|
||||
'--with-shared-libraries=%s' % ('1' if '+shared' in spec else '0'),
|
||||
'--with-debugging=%s' % ('1' if '+debug' in spec else '0'),
|
||||
'--with-blas-lapack-dir=%s' % spec['lapack'].prefix
|
||||
'--with-debugging=%s' % ('1' if '+debug' in spec else '0')
|
||||
])
|
||||
# Make sure we use exactly the same Blas/Lapack libraries
|
||||
# across the DAG. To that end list them explicitly
|
||||
lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs
|
||||
options.extend([
|
||||
'--with-blas-lapack-lib=%s' % lapack_blas.joined()
|
||||
])
|
||||
|
||||
# Activates library support if needed
|
||||
for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis',
|
||||
'mumps', 'scalapack'):
|
||||
|
@ -86,7 +86,7 @@ def configure(self, spec):
|
||||
if '+blas' in spec:
|
||||
config.extend([
|
||||
'BLASDEF = -DUSE_VENDOR_BLAS',
|
||||
'BLASLIB = -L{0} -lblas'.format(spec['blas'].prefix.lib)
|
||||
'BLASLIB = {0}'.format(spec['blas'].blas_libs.ld_flags)
|
||||
])
|
||||
else:
|
||||
config.append('BLASLIB = ../lib/libblas$(PLAT).a')
|
||||
|
Loading…
Reference in New Issue
Block a user