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:
Brian Van Essen 2020-11-14 16:59:12 -08:00 committed by GitHub
parent 35511c178b
commit 55ec18a580
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 80 additions and 30 deletions

View File

@ -64,7 +64,7 @@ def cmake_args(self):
args.append(
'-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(
'-DCUB_DIR:FILEPATH=%s' % spec['cub'].prefix)

View File

@ -3,6 +3,7 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
from spack import *
@ -110,6 +111,8 @@ class Dihydrogen(CMakePackage, CudaPackage):
depends_on('py-breathe', type='build', when='+docs')
depends_on('doxygen', type='build', when='+docs')
depends_on('llvm-openmp', when='%apple-clang +openmp')
illegal_cuda_arch_values = [
'10', '11', '12', '13',
'20', '21',
@ -159,4 +162,26 @@ def cmake_args(self):
args.append('-DCUB_DIR={0}'.format(
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
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)

View File

@ -33,8 +33,8 @@ class Hydrogen(CMakePackage, CudaPackage):
variant('shared', default=True,
description='Enables the build of shared libraries')
variant('hybrid', default=True,
description='Make use of OpenMP within MPI packing/unpacking')
variant('openmp', default=True,
description='Make use of OpenMP within CPU-kernels')
variant('openmp_blas', default=False,
description='Use OpenMP for threading in the BLAS library')
variant('quad', default=False,
@ -63,28 +63,29 @@ class Hydrogen(CMakePackage, CudaPackage):
description='Use OpenMP taskloops instead of parallel for loops.')
variant('half', default=False,
description='Builds with support for FP16 precision data types')
conflicts('~openmp', when='+omp_taskloops')
depends_on('cmake@3.17.0:', type='build')
depends_on('mpi')
depends_on('hwloc@1.11:')
# Note that #1712 forces us to enumerate the different blas variants
depends_on('openblas', when='blas=openblas ~openmp_blas ~int64_blas')
depends_on('openblas +ilp64', when='blas=openblas ~openmp_blas +int64_blas')
depends_on('openblas threads=openmp', when='blas=openblas +openmp_blas ~int64_blas')
depends_on('openblas threads=openmp +lip64', when='blas=openblas +openmp_blas +int64_blas')
depends_on('openblas', when='blas=openblas')
depends_on('openblas +ilp64', when='blas=openblas +int64_blas')
depends_on('openblas threads=openmp', when='blas=openblas +openmp_blas')
depends_on('intel-mkl', when="blas=mkl ~openmp_blas ~int64_blas")
depends_on('intel-mkl +ilp64', when="blas=mkl ~openmp_blas +int64_blas")
depends_on('intel-mkl threads=openmp', when='blas=mkl +openmp_blas ~int64_blas')
depends_on('intel-mkl@2017.1 +openmp +ilp64', when='blas=mkl +openmp_blas +int64_blas')
depends_on('intel-mkl', when="blas=mkl")
depends_on('intel-mkl +ilp64', when="blas=mkl +int64_blas")
depends_on('intel-mkl threads=openmp', when='blas=mkl +openmp_blas')
depends_on('veclibfort', when='blas=accelerate')
conflicts('blas=accelerate +openmp_blas')
depends_on('essl -cuda', when='blas=essl -openmp_blas ~int64_blas')
depends_on('essl -cuda +ilp64', when='blas=essl -openmp_blas +int64_blas')
depends_on('essl threads=openmp', when='blas=essl +openmp_blas ~int64_blas')
depends_on('essl threads=openmp +ilp64', when='blas=essl +openmp_blas +int64_blas')
depends_on('essl', when='blas=essl')
depends_on('essl -cuda', when='blas=essl -openmp_blas')
depends_on('essl +ilp64', when='blas=essl +int64_blas')
depends_on('essl threads=openmp', when='blas=essl +openmp_blas')
depends_on('netlib-lapack +external-blas', when='blas=essl')
# Specify the correct version of Aluminum
@ -107,6 +108,8 @@ class Hydrogen(CMakePackage, CudaPackage):
depends_on('cub', when='^cuda@:10.99')
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. " +
"Did you mean to use Elemental instead?")
@ -126,7 +129,7 @@ def cmake_args(self):
args = [
'-DCMAKE_INSTALL_MESSAGE:STRING=LAZY',
'-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_USE_64BIT_INTS:BOOL=%s' % ('+int64' 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)
if self.spec.satisfies('%clang platform=darwin'):
if self.spec.satisfies('%clang +openmp platform=darwin'):
clang = self.compiler.cc
clang_bin = os.path.dirname(clang)
clang_root = os.path.dirname(clang_bin)
@ -173,3 +176,14 @@ def cmake_args(self):
spec['aluminum'].prefix)])
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)

View File

@ -4,7 +4,6 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
import sys
from spack import *
@ -68,7 +67,7 @@ class Lbann(CMakePackage, CudaPackage):
depends_on('hydrogen@1.5.0:', when='@:0.90,0.102:')
# 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 ~cuda', when='~cuda')
@ -153,6 +152,8 @@ class Lbann(CMakePackage, CudaPackage):
depends_on('catch2', type='test')
depends_on('clara')
depends_on('llvm-openmp', when='%apple-clang')
generator = 'Ninja'
depends_on('ninja', type='build')
@ -169,6 +170,17 @@ def common_config_args(self):
'-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
# Note that develop > numeric and non-develop < numeric
@when('@:0.90,0.94:')
@ -216,9 +228,8 @@ def cmake_args(self):
'-DLBANN_CONDUIT_DIR={0}'.format(spec['conduit'].prefix),
'-DConduit_DIR={0}'.format(spec['conduit'].prefix)])
# Add support for OpenMP
if spec.satisfies('%clang') or spec.satisfies('%apple-clang'):
if sys.platform == 'darwin':
# Add support for OpenMP with external (Brew) clang
if spec.satisfies('%clang platform=darwin'):
clang = self.compiler.cc
clang_bin = os.path.dirname(clang)
clang_root = os.path.dirname(clang_bin)