blob: ddacfa22aa3af0afcec6001c2c5ca3769c83609f (
plain) (
tree)
|
|
# Copyright 2013-2020 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)
from spack import *
class Blaspp(CMakePackage, CudaPackage):
"""C++ API for the Basic Linear Algebra Subroutines. Developed by the
Innovative Computing Laboratory at the University of Tennessee,
Knoxville."""
homepage = "https://bitbucket.org/icl/blaspp"
git = "https://bitbucket.org/icl/blaspp"
maintainers = ['teonnik', 'Sely85', 'G-Ragghianti', 'mgates3']
version('develop', commit='6293d96')
variant('gfort',
default=False,
description=('Use GNU Fortran interface. '
'Default is Intel interface. (MKL)'))
variant('ilp64',
default=False,
description=('Use 64bit integer interface. '
'Default is 32bit. (MKL & ESSL)'))
variant('openmp',
default=False,
description=('Use OpenMP threaded backend. '
'Default is sequential. (MKL & ESSL)'))
depends_on('blas')
# 1) The CMake options exposed by `blaspp` allow for a value called `auto`.
# The value is not needed here as the choice of dependency in the spec
# determines the appropriate flags.
#
# 2) BLASFinder.cmake handles most options. For `auto`, it searches all
# blas libraries listed in `def_lib_list`.
#
# 3) ?? Custom blas library can be supplied via `BLAS_LIBRARIES`.
#
def cmake_args(self):
spec = self.spec
args = ['-DBLASPP_BUILD_TESTS:BOOL={0}'.format(
'ON' if self.run_tests else 'OFF')]
if '+gfort' in spec:
args.append('-DBLAS_LIBRARY_MKL="GNU gfortran conventions"')
else:
args.append('-DBLAS_LIBRARY_MKL="Intel ifort conventions"')
if '+ilp64' in spec:
args.append('-DBLAS_LIBRARY_INTEGER="int64_t (ILP64)"')
else:
args.append('-DBLAS_LIBRARY_INTEGER="int (LP64)"')
if '+openmp' in spec:
args.append(['-DUSE_OPENMP=ON',
'-DBLAS_LIBRARY_THREADING="threaded"'])
else:
args.append('-DBLAS_LIBRARY_THREADING="sequential"')
# `blaspp` has an implicit CUDA detection mechanism. This disables it
# in cases where it may backfire. One such case is when `cuda` is
# external and marked with `buildable=false`. `blaspp`'s CMake CUDA
# detection mechanism finds CUDA but doesn't set certain paths properly
# which leads to a build issues [1].
#
# [1]: https://bitbucket.org/icl/blaspp/issues/6/compile-error-due-to-implicit-cuda
if '~cuda' in spec:
args.append('-DCMAKE_CUDA_COMPILER=')
# Missing:
#
# - acml : BLAS_LIBRARY="AMD ACML"
# BLAS_LIBRARY_THREADING= threaded/sequential
#
# - apple : BLAS_LIBRARY="Apple Accelerate" (veclibfort ???)
#
if '^mkl' in spec:
args.append('-DBLAS_LIBRARY="Intel MKL"')
elif '^essl' in spec:
args.append('-DBLAS_LIBRARY="IBM ESSL"')
elif '^openblas' in spec:
args.append('-DBLAS_LIBRARY="OpenBLAS"')
elif '^cray-libsci' in spec:
args.append('-DBLAS_LIBRARY="Cray LibSci"')
else: # e.g. netlib-lapack
args.append('-DBLAS_LIBRARY="generic"')
return args
|