From 37f021ef3c9b016ddbd0811d7b51d865c626ef22 Mon Sep 17 00:00:00 2001 From: Tiziano Müller Date: Tue, 22 Feb 2022 11:26:47 +0100 Subject: cp2k: bump version to 9.1, fix building with CUDA (#29108) first step towards fixing #28554 --- var/spack/repos/builtin/packages/cp2k/package.py | 51 ++++++++++++++++++------ 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 3e20e8a62c..ddae41db19 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -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 @@ class Cp2k(MakefilePackage, CudaPackage): 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 @@ class Cp2k(MakefilePackage, CudaPackage): libs += list(sirius.libs) if spec.satisfies('+cuda'): - cppflags += ['-D__ACC'] - libs += ['-lcudart', '-lnvrtc', '-lcuda'] - - if spec.satisfies('+cuda_blas'): - cppflags += ['-D__DBCSR_ACC=2'] + libs += [ + '-L{}'.format(spec['cuda'].libs.directories[0]), + '-L{}/stubs'.format(spec['cuda'].libs.directories[0]), + '-lcuda', '-lcudart', '-lnvrtc', '-lstdc++'] + + 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 @@ class Cp2k(MakefilePackage, CudaPackage): 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 @@ class Cp2k(MakefilePackage, CudaPackage): 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)) -- cgit v1.2.3-70-g09d2