cp2k: bump version to 9.1, fix building with CUDA (#29108)

first step towards fixing #28554
This commit is contained in:
Tiziano Müller 2022-02-22 11:26:47 +01:00 committed by GitHub
parent 2ab1ace5f4
commit 37f021ef3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -21,6 +21,7 @@ class Cp2k(MakefilePackage, CudaPackage):
maintainers = ['dev-zero']
version('9.1', sha256='fedb4c684a98ad857cd49b69a3ae51a73f85a9c36e9cb63e3b02320c74454ce6')
version('8.2', sha256='2e24768720efed1a5a4a58e83e2aca502cd8b95544c21695eb0de71ed652f20a')
version('8.1', sha256='7f37aead120730234a60b2989d0547ae5e5498d93b1e9b5eb548c041ee8e7772')
version('7.1', sha256='ccd711a09a426145440e666310dd01cc5772ab103493c4ae6a3470898cd0addb')
@ -60,7 +61,7 @@ class Cp2k(MakefilePackage, CudaPackage):
' with cuda_arch=35 for a K20x instead of a K40'))
variant('cuda_fft', default=False,
description=('Use CUDA also for FFTs in the PW part of CP2K'))
variant('cuda_blas', default=False,
variant('cuda_blas', default=False, when='@:7', # req in CP2K v8+
description=('Use CUBLAS for general matrix operations in DBCSR'))
HFX_LMAX_RANGE = range(4, 8)
@ -85,8 +86,9 @@ class Cp2k(MakefilePackage, CudaPackage):
depends_on('openblas threads=openmp', when='^openblas')
with when('smm=libxsmm'):
depends_on('libxsmm@1.17:~header-only', when='@9.1:')
# require libxsmm-1.11+ since 1.10 can leak file descriptors in Fortran
depends_on('libxsmm@1.11:~header-only')
depends_on('libxsmm@1.11:~header-only', when="@:8.9")
# use pkg-config (support added in libxsmm-1.10) to link to libxsmm
depends_on('pkgconfig', type='build')
# please set variants: smm=blas by configuring packages.yaml or install
@ -108,7 +110,8 @@ class Cp2k(MakefilePackage, CudaPackage):
depends_on('libxc@2.2.2:3', when='@:5', type='build')
depends_on('libxc@4.0.3:4', when='@6.0:6.9', type='build')
depends_on('libxc@4.0.3:4', when='@7.0:8.1')
depends_on('libxc@5.1.3:5.1', when='@8.2:')
depends_on('libxc@5.1.3:5.1', when='@8.2:8')
depends_on('libxc@5.1.7:5.1', when='@9:')
with when('+mpi'):
depends_on('mpi@2:')
@ -116,6 +119,7 @@ class Cp2k(MakefilePackage, CudaPackage):
with when('+cosma'):
depends_on('cosma+scalapack')
depends_on('cosma@2.5.1:', when='@9:')
depends_on('cosma+cuda', when='+cuda')
conflicts('~mpi')
# COSMA support was introduced in 8+
@ -129,6 +133,7 @@ class Cp2k(MakefilePackage, CudaPackage):
depends_on('elpa@2011.12:2017.11', when='@6.0:6')
depends_on('elpa@2018.05:2020.11.001', when='@7.0:8.2')
depends_on('elpa@2021.05:', when='@8.3:')
depends_on('elpa@2021.11.001:', when='@9.1:')
with when('+plumed'):
depends_on('plumed+shared')
@ -151,7 +156,8 @@ class Cp2k(MakefilePackage, CudaPackage):
depends_on('sirius~openmp', when='~openmp')
depends_on('sirius@:6', when='@:7')
depends_on('sirius@7.0.0:7.0', when='@8:8.2')
depends_on('sirius@7.2:', when='@8.3:')
depends_on('sirius@7.2', when='@8.3:8.9')
depends_on('sirius@7.3:', when='@9.1')
conflicts('~mpi')
# sirius support was introduced in 7+
conflicts('@:6')
@ -508,6 +514,9 @@ def edit(self, spec, prefix):
int(elpa.version[1])))
fcflags += ['-I{0}'.format(join_path(elpa_incdir, 'elpa'))]
if '+cuda' in spec and '+cuda' in elpa:
cppflags += ['-D__ELPA_NVIDIA_GPU']
if spec.satisfies('+sirius'):
sirius = spec['sirius']
cppflags.append('-D__SIRIUS')
@ -515,14 +524,29 @@ def edit(self, spec, prefix):
libs += list(sirius.libs)
if spec.satisfies('+cuda'):
cppflags += ['-D__ACC']
libs += ['-lcudart', '-lnvrtc', '-lcuda']
libs += [
'-L{}'.format(spec['cuda'].libs.directories[0]),
'-L{}/stubs'.format(spec['cuda'].libs.directories[0]),
'-lcuda', '-lcudart', '-lnvrtc', '-lstdc++']
if spec.satisfies('+cuda_blas'):
cppflags += ['-D__DBCSR_ACC=2']
if spec.satisfies('@9:'):
acc_compiler_var = 'OFFLOAD_CC'
acc_flags_var = 'OFFLOAD_FLAGS'
cppflags += [
'-D__DBCSR_ACC',
'-D__GRID_CUDA',
'-DOFFLOAD_TARGET=cuda',
]
libs += ['-lcublas']
else:
cppflags += ['-D__DBCSR_ACC']
acc_compiler_var = 'NVCC'
acc_flags_var = 'NVFLAGS'
cppflags += ['-D__ACC']
if spec.satisfies('+cuda_blas'):
cppflags += ['-D__DBCSR_ACC=2']
libs += ['-lcublas']
else:
cppflags += ['-D__DBCSR_ACC']
if spec.satisfies('+cuda_fft'):
cppflags += ['-D__PW_CUDA']
@ -616,8 +640,9 @@ def edit(self, spec, prefix):
mkf.write('CPP = # {0} -E\n'.format(spack_cc))
mkf.write('AR = ar -r\n')
if spec.satisfies('+cuda'):
mkf.write('NVCC = {0}\n'.format(
if '+cuda' in spec:
mkf.write('{0} = {1}\n'.format(
acc_compiler_var,
join_path(spec['cuda'].prefix, 'bin', 'nvcc')))
# Write compiler flags to file
@ -631,7 +656,7 @@ def fflags(var, lst):
mkf.write(fflags('CPPFLAGS', cppflags))
mkf.write(fflags('CFLAGS', cflags))
mkf.write(fflags('CXXFLAGS', cxxflags))
mkf.write(fflags('NVFLAGS', nvflags))
mkf.write(fflags(acc_flags_var, nvflags))
mkf.write(fflags('FCFLAGS', fcflags))
mkf.write(fflags('LDFLAGS', ldflags))
mkf.write(fflags('LIBS', libs))