Bugfixes for lbann sw stack (#19903)
* Added guard for setting CUB_DIR to only when cuda variant is true * Added support for OpenMP on OSX platforms * Updated the way that LBANN, Hydrogen, and DiHydrogen handle apple-clang with OpenMP and Clang installed on OS X via brew. * Fixed bug in spec resolution * Fixed merge conflict * Fixed typo * Fixed flake8
This commit is contained in:
parent
35511c178b
commit
55ec18a580
@ -64,7 +64,7 @@ def cmake_args(self):
|
|||||||
args.append(
|
args.append(
|
||||||
'-DALUMINUM_ENABLE_MPI_CUDA:BOOL=%s' % ('+ht' in spec))
|
'-DALUMINUM_ENABLE_MPI_CUDA:BOOL=%s' % ('+ht' in spec))
|
||||||
|
|
||||||
if '@:0.1,0.6.0:' and spec.satisfies('^cuda@:10.99'):
|
if spec.satisfies('@:0.1,0.6.0: +cuda ^cuda@:10.99'):
|
||||||
args.append(
|
args.append(
|
||||||
'-DCUB_DIR:FILEPATH=%s' % spec['cub'].prefix)
|
'-DCUB_DIR:FILEPATH=%s' % spec['cub'].prefix)
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
import os
|
||||||
from spack import *
|
from spack import *
|
||||||
|
|
||||||
|
|
||||||
@ -110,6 +111,8 @@ class Dihydrogen(CMakePackage, CudaPackage):
|
|||||||
depends_on('py-breathe', type='build', when='+docs')
|
depends_on('py-breathe', type='build', when='+docs')
|
||||||
depends_on('doxygen', type='build', when='+docs')
|
depends_on('doxygen', type='build', when='+docs')
|
||||||
|
|
||||||
|
depends_on('llvm-openmp', when='%apple-clang +openmp')
|
||||||
|
|
||||||
illegal_cuda_arch_values = [
|
illegal_cuda_arch_values = [
|
||||||
'10', '11', '12', '13',
|
'10', '11', '12', '13',
|
||||||
'20', '21',
|
'20', '21',
|
||||||
@ -159,4 +162,26 @@ def cmake_args(self):
|
|||||||
args.append('-DCUB_DIR={0}'.format(
|
args.append('-DCUB_DIR={0}'.format(
|
||||||
spec['cub'].prefix))
|
spec['cub'].prefix))
|
||||||
|
|
||||||
|
# Add support for OpenMP with external (Brew) clang
|
||||||
|
if spec.satisfies('%clang +openmp platform=darwin'):
|
||||||
|
clang = self.compiler.cc
|
||||||
|
clang_bin = os.path.dirname(clang)
|
||||||
|
clang_root = os.path.dirname(clang_bin)
|
||||||
|
args.extend([
|
||||||
|
'-DOpenMP_CXX_FLAGS=-fopenmp=libomp',
|
||||||
|
'-DOpenMP_CXX_LIB_NAMES=libomp',
|
||||||
|
'-DOpenMP_libomp_LIBRARY={0}/lib/libomp.dylib'.format(
|
||||||
|
clang_root)])
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
def setup_build_environment(self, env):
|
||||||
|
if self.spec.satisfies('%apple-clang +openmp'):
|
||||||
|
env.append_flags(
|
||||||
|
'CPPFLAGS', self.compiler.openmp_flag)
|
||||||
|
env.append_flags(
|
||||||
|
'CFLAGS', self.spec['llvm-openmp'].headers.include_flags)
|
||||||
|
env.append_flags(
|
||||||
|
'CXXFLAGS', self.spec['llvm-openmp'].headers.include_flags)
|
||||||
|
env.append_flags(
|
||||||
|
'LDFLAGS', self.spec['llvm-openmp'].libs.ld_flags)
|
||||||
|
@ -33,8 +33,8 @@ class Hydrogen(CMakePackage, CudaPackage):
|
|||||||
|
|
||||||
variant('shared', default=True,
|
variant('shared', default=True,
|
||||||
description='Enables the build of shared libraries')
|
description='Enables the build of shared libraries')
|
||||||
variant('hybrid', default=True,
|
variant('openmp', default=True,
|
||||||
description='Make use of OpenMP within MPI packing/unpacking')
|
description='Make use of OpenMP within CPU-kernels')
|
||||||
variant('openmp_blas', default=False,
|
variant('openmp_blas', default=False,
|
||||||
description='Use OpenMP for threading in the BLAS library')
|
description='Use OpenMP for threading in the BLAS library')
|
||||||
variant('quad', default=False,
|
variant('quad', default=False,
|
||||||
@ -63,28 +63,29 @@ class Hydrogen(CMakePackage, CudaPackage):
|
|||||||
description='Use OpenMP taskloops instead of parallel for loops.')
|
description='Use OpenMP taskloops instead of parallel for loops.')
|
||||||
variant('half', default=False,
|
variant('half', default=False,
|
||||||
description='Builds with support for FP16 precision data types')
|
description='Builds with support for FP16 precision data types')
|
||||||
|
|
||||||
|
conflicts('~openmp', when='+omp_taskloops')
|
||||||
|
|
||||||
depends_on('cmake@3.17.0:', type='build')
|
depends_on('cmake@3.17.0:', type='build')
|
||||||
depends_on('mpi')
|
depends_on('mpi')
|
||||||
depends_on('hwloc@1.11:')
|
depends_on('hwloc@1.11:')
|
||||||
|
|
||||||
# Note that #1712 forces us to enumerate the different blas variants
|
# Note that #1712 forces us to enumerate the different blas variants
|
||||||
depends_on('openblas', when='blas=openblas ~openmp_blas ~int64_blas')
|
depends_on('openblas', when='blas=openblas')
|
||||||
depends_on('openblas +ilp64', when='blas=openblas ~openmp_blas +int64_blas')
|
depends_on('openblas +ilp64', when='blas=openblas +int64_blas')
|
||||||
depends_on('openblas threads=openmp', when='blas=openblas +openmp_blas ~int64_blas')
|
depends_on('openblas threads=openmp', when='blas=openblas +openmp_blas')
|
||||||
depends_on('openblas threads=openmp +lip64', when='blas=openblas +openmp_blas +int64_blas')
|
|
||||||
|
|
||||||
depends_on('intel-mkl', when="blas=mkl ~openmp_blas ~int64_blas")
|
depends_on('intel-mkl', when="blas=mkl")
|
||||||
depends_on('intel-mkl +ilp64', when="blas=mkl ~openmp_blas +int64_blas")
|
depends_on('intel-mkl +ilp64', when="blas=mkl +int64_blas")
|
||||||
depends_on('intel-mkl threads=openmp', when='blas=mkl +openmp_blas ~int64_blas')
|
depends_on('intel-mkl threads=openmp', when='blas=mkl +openmp_blas')
|
||||||
depends_on('intel-mkl@2017.1 +openmp +ilp64', when='blas=mkl +openmp_blas +int64_blas')
|
|
||||||
|
|
||||||
depends_on('veclibfort', when='blas=accelerate')
|
depends_on('veclibfort', when='blas=accelerate')
|
||||||
conflicts('blas=accelerate +openmp_blas')
|
conflicts('blas=accelerate +openmp_blas')
|
||||||
|
|
||||||
depends_on('essl -cuda', when='blas=essl -openmp_blas ~int64_blas')
|
depends_on('essl', when='blas=essl')
|
||||||
depends_on('essl -cuda +ilp64', when='blas=essl -openmp_blas +int64_blas')
|
depends_on('essl -cuda', when='blas=essl -openmp_blas')
|
||||||
depends_on('essl threads=openmp', when='blas=essl +openmp_blas ~int64_blas')
|
depends_on('essl +ilp64', when='blas=essl +int64_blas')
|
||||||
depends_on('essl threads=openmp +ilp64', when='blas=essl +openmp_blas +int64_blas')
|
depends_on('essl threads=openmp', when='blas=essl +openmp_blas')
|
||||||
depends_on('netlib-lapack +external-blas', when='blas=essl')
|
depends_on('netlib-lapack +external-blas', when='blas=essl')
|
||||||
|
|
||||||
# Specify the correct version of Aluminum
|
# Specify the correct version of Aluminum
|
||||||
@ -107,6 +108,8 @@ class Hydrogen(CMakePackage, CudaPackage):
|
|||||||
depends_on('cub', when='^cuda@:10.99')
|
depends_on('cub', when='^cuda@:10.99')
|
||||||
depends_on('half', when='+half')
|
depends_on('half', when='+half')
|
||||||
|
|
||||||
|
depends_on('llvm-openmp', when='%apple-clang +openmp')
|
||||||
|
|
||||||
conflicts('@0:0.98', msg="Hydrogen did not exist before v0.99. " +
|
conflicts('@0:0.98', msg="Hydrogen did not exist before v0.99. " +
|
||||||
"Did you mean to use Elemental instead?")
|
"Did you mean to use Elemental instead?")
|
||||||
|
|
||||||
@ -126,7 +129,7 @@ def cmake_args(self):
|
|||||||
args = [
|
args = [
|
||||||
'-DCMAKE_INSTALL_MESSAGE:STRING=LAZY',
|
'-DCMAKE_INSTALL_MESSAGE:STRING=LAZY',
|
||||||
'-DBUILD_SHARED_LIBS:BOOL=%s' % ('+shared' in spec),
|
'-DBUILD_SHARED_LIBS:BOOL=%s' % ('+shared' in spec),
|
||||||
'-DHydrogen_ENABLE_OPENMP:BOOL=%s' % ('+hybrid' in spec),
|
'-DHydrogen_ENABLE_OPENMP:BOOL=%s' % ('+openmp' in spec),
|
||||||
'-DHydrogen_ENABLE_QUADMATH:BOOL=%s' % ('+quad' in spec),
|
'-DHydrogen_ENABLE_QUADMATH:BOOL=%s' % ('+quad' in spec),
|
||||||
'-DHydrogen_USE_64BIT_INTS:BOOL=%s' % ('+int64' in spec),
|
'-DHydrogen_USE_64BIT_INTS:BOOL=%s' % ('+int64' in spec),
|
||||||
'-DHydrogen_USE_64BIT_BLAS_INTS:BOOL=%s' % ('+int64_blas' in spec),
|
'-DHydrogen_USE_64BIT_BLAS_INTS:BOOL=%s' % ('+int64_blas' in spec),
|
||||||
@ -140,7 +143,7 @@ def cmake_args(self):
|
|||||||
]
|
]
|
||||||
|
|
||||||
# Add support for OS X to find OpenMP (LLVM installed via brew)
|
# Add support for OS X to find OpenMP (LLVM installed via brew)
|
||||||
if self.spec.satisfies('%clang platform=darwin'):
|
if self.spec.satisfies('%clang +openmp platform=darwin'):
|
||||||
clang = self.compiler.cc
|
clang = self.compiler.cc
|
||||||
clang_bin = os.path.dirname(clang)
|
clang_bin = os.path.dirname(clang)
|
||||||
clang_root = os.path.dirname(clang_bin)
|
clang_root = os.path.dirname(clang_bin)
|
||||||
@ -173,3 +176,14 @@ def cmake_args(self):
|
|||||||
spec['aluminum'].prefix)])
|
spec['aluminum'].prefix)])
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
def setup_build_environment(self, env):
|
||||||
|
if self.spec.satisfies('%apple-clang +openmp'):
|
||||||
|
env.append_flags(
|
||||||
|
'CPPFLAGS', self.compiler.openmp_flag)
|
||||||
|
env.append_flags(
|
||||||
|
'CFLAGS', self.spec['llvm-openmp'].headers.include_flags)
|
||||||
|
env.append_flags(
|
||||||
|
'CXXFLAGS', self.spec['llvm-openmp'].headers.include_flags)
|
||||||
|
env.append_flags(
|
||||||
|
'LDFLAGS', self.spec['llvm-openmp'].libs.ld_flags)
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
from spack import *
|
from spack import *
|
||||||
|
|
||||||
|
|
||||||
@ -68,7 +67,7 @@ class Lbann(CMakePackage, CudaPackage):
|
|||||||
depends_on('hydrogen@1.5.0:', when='@:0.90,0.102:')
|
depends_on('hydrogen@1.5.0:', when='@:0.90,0.102:')
|
||||||
|
|
||||||
# Add Hydrogen variants
|
# Add Hydrogen variants
|
||||||
depends_on('hydrogen +openmp_blas +shared +int64')
|
depends_on('hydrogen +openmp +openmp_blas +shared +int64')
|
||||||
depends_on('hydrogen ~al', when='~al')
|
depends_on('hydrogen ~al', when='~al')
|
||||||
depends_on('hydrogen +al', when='+al')
|
depends_on('hydrogen +al', when='+al')
|
||||||
depends_on('hydrogen ~cuda', when='~cuda')
|
depends_on('hydrogen ~cuda', when='~cuda')
|
||||||
@ -153,6 +152,8 @@ class Lbann(CMakePackage, CudaPackage):
|
|||||||
depends_on('catch2', type='test')
|
depends_on('catch2', type='test')
|
||||||
depends_on('clara')
|
depends_on('clara')
|
||||||
|
|
||||||
|
depends_on('llvm-openmp', when='%apple-clang')
|
||||||
|
|
||||||
generator = 'Ninja'
|
generator = 'Ninja'
|
||||||
depends_on('ninja', type='build')
|
depends_on('ninja', type='build')
|
||||||
|
|
||||||
@ -169,6 +170,17 @@ def common_config_args(self):
|
|||||||
'-DCNPY_DIR={0}'.format(spec['cnpy'].prefix),
|
'-DCNPY_DIR={0}'.format(spec['cnpy'].prefix),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def setup_build_environment(self, env):
|
||||||
|
if self.spec.satisfies('%apple-clang'):
|
||||||
|
env.append_flags(
|
||||||
|
'CPPFLAGS', self.compiler.openmp_flag)
|
||||||
|
env.append_flags(
|
||||||
|
'CFLAGS', self.spec['llvm-openmp'].headers.include_flags)
|
||||||
|
env.append_flags(
|
||||||
|
'CXXFLAGS', self.spec['llvm-openmp'].headers.include_flags)
|
||||||
|
env.append_flags(
|
||||||
|
'LDFLAGS', self.spec['llvm-openmp'].libs.ld_flags)
|
||||||
|
|
||||||
# Get any recent versions or non-numeric version
|
# Get any recent versions or non-numeric version
|
||||||
# Note that develop > numeric and non-develop < numeric
|
# Note that develop > numeric and non-develop < numeric
|
||||||
@when('@:0.90,0.94:')
|
@when('@:0.90,0.94:')
|
||||||
@ -216,9 +228,8 @@ def cmake_args(self):
|
|||||||
'-DLBANN_CONDUIT_DIR={0}'.format(spec['conduit'].prefix),
|
'-DLBANN_CONDUIT_DIR={0}'.format(spec['conduit'].prefix),
|
||||||
'-DConduit_DIR={0}'.format(spec['conduit'].prefix)])
|
'-DConduit_DIR={0}'.format(spec['conduit'].prefix)])
|
||||||
|
|
||||||
# Add support for OpenMP
|
# Add support for OpenMP with external (Brew) clang
|
||||||
if spec.satisfies('%clang') or spec.satisfies('%apple-clang'):
|
if spec.satisfies('%clang platform=darwin'):
|
||||||
if sys.platform == 'darwin':
|
|
||||||
clang = self.compiler.cc
|
clang = self.compiler.cc
|
||||||
clang_bin = os.path.dirname(clang)
|
clang_bin = os.path.dirname(clang)
|
||||||
clang_root = os.path.dirname(clang_bin)
|
clang_root = os.path.dirname(clang_bin)
|
||||||
|
Loading…
Reference in New Issue
Block a user