cp2k: added support for AMD toolchain (#21371)
This commit is contained in:
parent
83f7541420
commit
9eb5c8f843
@ -158,6 +158,7 @@ class Cp2k(MakefilePackage, CudaPackage):
|
|||||||
conflicts('smm=libxsmm', when='target=aarch64:', msg='libxsmm is not available on arm')
|
conflicts('smm=libxsmm', when='target=aarch64:', msg='libxsmm is not available on arm')
|
||||||
|
|
||||||
conflicts('^fftw~openmp', when='+openmp')
|
conflicts('^fftw~openmp', when='+openmp')
|
||||||
|
conflicts('^amdfftw~openmp', when='+openmp')
|
||||||
conflicts('^openblas threads=none', when='+openmp')
|
conflicts('^openblas threads=none', when='+openmp')
|
||||||
conflicts('^openblas threads=pthreads', when='+openmp')
|
conflicts('^openblas threads=pthreads', when='+openmp')
|
||||||
|
|
||||||
@ -192,11 +193,11 @@ def makefile(self):
|
|||||||
makefile_basename = '.'.join([
|
makefile_basename = '.'.join([
|
||||||
self.makefile_architecture, self.makefile_version
|
self.makefile_architecture, self.makefile_version
|
||||||
])
|
])
|
||||||
return os.path.join('arch', makefile_basename)
|
return join_path('arch', makefile_basename)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def archive_files(self):
|
def archive_files(self):
|
||||||
return [os.path.join(self.stage.source_path, self.makefile)]
|
return [join_path(self.stage.source_path, self.makefile)]
|
||||||
|
|
||||||
def edit(self, spec, prefix):
|
def edit(self, spec, prefix):
|
||||||
pkgconf = which('pkg-config')
|
pkgconf = which('pkg-config')
|
||||||
@ -204,6 +205,9 @@ def edit(self, spec, prefix):
|
|||||||
if '^fftw' in spec:
|
if '^fftw' in spec:
|
||||||
fftw = spec['fftw:openmp' if '+openmp' in spec else 'fftw']
|
fftw = spec['fftw:openmp' if '+openmp' in spec else 'fftw']
|
||||||
fftw_header_dir = fftw.headers.directories[0]
|
fftw_header_dir = fftw.headers.directories[0]
|
||||||
|
elif '^amdfftw' in spec:
|
||||||
|
fftw = spec['amdfftw:openmp' if '+openmp' in spec else 'amdfftw']
|
||||||
|
fftw_header_dir = fftw.headers.directories[0]
|
||||||
elif '^intel-mkl' in spec:
|
elif '^intel-mkl' in spec:
|
||||||
fftw = spec['intel-mkl']
|
fftw = spec['intel-mkl']
|
||||||
fftw_header_dir = fftw.headers.directories[0] + '/fftw'
|
fftw_header_dir = fftw.headers.directories[0] + '/fftw'
|
||||||
@ -227,6 +231,7 @@ def edit(self, spec, prefix):
|
|||||||
'nvhpc': ['-fast'],
|
'nvhpc': ['-fast'],
|
||||||
'cray': ['-O2'],
|
'cray': ['-O2'],
|
||||||
'xl': ['-O3'],
|
'xl': ['-O3'],
|
||||||
|
'aocc': ['-O1'],
|
||||||
}
|
}
|
||||||
|
|
||||||
dflags = ['-DNDEBUG']
|
dflags = ['-DNDEBUG']
|
||||||
@ -263,6 +268,10 @@ def edit(self, spec, prefix):
|
|||||||
'-ffree-line-length-none',
|
'-ffree-line-length-none',
|
||||||
'-ggdb', # make sure we get proper Fortran backtraces
|
'-ggdb', # make sure we get proper Fortran backtraces
|
||||||
]
|
]
|
||||||
|
elif '%aocc' in spec:
|
||||||
|
fcflags += [
|
||||||
|
'-ffree-form',
|
||||||
|
]
|
||||||
elif '%pgi' in spec or '%nvhpc' in spec:
|
elif '%pgi' in spec or '%nvhpc' in spec:
|
||||||
fcflags += ['-Mfreeform', '-Mextend']
|
fcflags += ['-Mfreeform', '-Mextend']
|
||||||
elif '%cray' in spec:
|
elif '%cray' in spec:
|
||||||
@ -297,8 +306,8 @@ def edit(self, spec, prefix):
|
|||||||
dflags.extend(['-D__PLUMED2'])
|
dflags.extend(['-D__PLUMED2'])
|
||||||
cppflags.extend(['-D__PLUMED2'])
|
cppflags.extend(['-D__PLUMED2'])
|
||||||
libs.extend([
|
libs.extend([
|
||||||
os.path.join(self.spec['plumed'].prefix.lib,
|
join_path(self.spec['plumed'].prefix.lib,
|
||||||
'libplumed.{0}'.format(dso_suffix))
|
'libplumed.{0}'.format(dso_suffix))
|
||||||
])
|
])
|
||||||
|
|
||||||
cc = spack_cc if '~mpi' in spec else spec['mpi'].mpicc
|
cc = spack_cc if '~mpi' in spec else spec['mpi'].mpicc
|
||||||
@ -351,7 +360,7 @@ def edit(self, spec, prefix):
|
|||||||
|
|
||||||
if 'wannier90' in spec:
|
if 'wannier90' in spec:
|
||||||
cppflags.append('-D__WANNIER90')
|
cppflags.append('-D__WANNIER90')
|
||||||
wannier = os.path.join(
|
wannier = join_path(
|
||||||
spec['wannier90'].libs.directories[0], 'libwannier.a'
|
spec['wannier90'].libs.directories[0], 'libwannier.a'
|
||||||
)
|
)
|
||||||
libs.append(wannier)
|
libs.append(wannier)
|
||||||
@ -371,9 +380,9 @@ def edit(self, spec, prefix):
|
|||||||
# runtime due to wrong offsets into the shared library
|
# runtime due to wrong offsets into the shared library
|
||||||
# symbols.
|
# symbols.
|
||||||
libs.extend([
|
libs.extend([
|
||||||
os.path.join(
|
join_path(
|
||||||
spec['libint'].libs.directories[0], 'libderiv.a'),
|
spec['libint'].libs.directories[0], 'libderiv.a'),
|
||||||
os.path.join(
|
join_path(
|
||||||
spec['libint'].libs.directories[0], 'libint.a'),
|
spec['libint'].libs.directories[0], 'libint.a'),
|
||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
@ -394,18 +403,17 @@ def edit(self, spec, prefix):
|
|||||||
|
|
||||||
if '+pexsi' in spec:
|
if '+pexsi' in spec:
|
||||||
cppflags.append('-D__LIBPEXSI')
|
cppflags.append('-D__LIBPEXSI')
|
||||||
fcflags.append('-I' + os.path.join(
|
fcflags.append('-I' + join_path(
|
||||||
spec['pexsi'].prefix, 'fortran'))
|
spec['pexsi'].prefix, 'fortran'))
|
||||||
libs.extend([
|
libs.extend([
|
||||||
os.path.join(spec['pexsi'].libs.directories[0],
|
join_path(spec['pexsi'].libs.directories[0], 'libpexsi.a'),
|
||||||
'libpexsi.a'),
|
join_path(spec['superlu-dist'].libs.directories[0],
|
||||||
os.path.join(spec['superlu-dist'].libs.directories[0],
|
'libsuperlu_dist.a'),
|
||||||
'libsuperlu_dist.a'),
|
join_path(
|
||||||
os.path.join(
|
|
||||||
spec['parmetis'].libs.directories[0],
|
spec['parmetis'].libs.directories[0],
|
||||||
'libparmetis.{0}'.format(dso_suffix)
|
'libparmetis.{0}'.format(dso_suffix)
|
||||||
),
|
),
|
||||||
os.path.join(
|
join_path(
|
||||||
spec['metis'].libs.directories[0],
|
spec['metis'].libs.directories[0],
|
||||||
'libmetis.{0}'.format(dso_suffix)
|
'libmetis.{0}'.format(dso_suffix)
|
||||||
),
|
),
|
||||||
@ -416,11 +424,18 @@ def edit(self, spec, prefix):
|
|||||||
elpa_suffix = '_openmp' if '+openmp' in elpa else ''
|
elpa_suffix = '_openmp' if '+openmp' in elpa else ''
|
||||||
elpa_incdir = elpa.headers.directories[0]
|
elpa_incdir = elpa.headers.directories[0]
|
||||||
|
|
||||||
fcflags += ['-I{0}'.format(os.path.join(elpa_incdir, 'modules'))]
|
fcflags += ['-I{0}'.format(join_path(elpa_incdir, 'modules'))]
|
||||||
libs.append(os.path.join(elpa.libs.directories[0],
|
|
||||||
('libelpa{elpa_suffix}.{dso_suffix}'
|
# Currently AOCC support only static libraries of ELPA
|
||||||
.format(elpa_suffix=elpa_suffix,
|
if '%aocc' in spec:
|
||||||
dso_suffix=dso_suffix))))
|
libs.append(join_path(elpa.prefix.lib,
|
||||||
|
('libelpa{elpa_suffix}.a'
|
||||||
|
.format(elpa_suffix=elpa_suffix))))
|
||||||
|
else:
|
||||||
|
libs.append(join_path(elpa.prefix.lib,
|
||||||
|
('libelpa{elpa_suffix}.{dso_suffix}'
|
||||||
|
.format(elpa_suffix=elpa_suffix,
|
||||||
|
dso_suffix=dso_suffix))))
|
||||||
|
|
||||||
if spec.satisfies('@:4.999'):
|
if spec.satisfies('@:4.999'):
|
||||||
if elpa.satisfies('@:2014.5.999'):
|
if elpa.satisfies('@:2014.5.999'):
|
||||||
@ -433,7 +448,7 @@ def edit(self, spec, prefix):
|
|||||||
cppflags.append('-D__ELPA={0}{1:02d}'
|
cppflags.append('-D__ELPA={0}{1:02d}'
|
||||||
.format(elpa.version[0],
|
.format(elpa.version[0],
|
||||||
int(elpa.version[1])))
|
int(elpa.version[1])))
|
||||||
fcflags += ['-I{0}'.format(os.path.join(elpa_incdir, 'elpa'))]
|
fcflags += ['-I{0}'.format(join_path(elpa_incdir, 'elpa'))]
|
||||||
|
|
||||||
if spec.satisfies('+sirius'):
|
if spec.satisfies('+sirius'):
|
||||||
sirius = spec['sirius']
|
sirius = spec['sirius']
|
||||||
@ -469,12 +484,12 @@ def edit(self, spec, prefix):
|
|||||||
gpuver = 'K20X'
|
gpuver = 'K20X'
|
||||||
|
|
||||||
if 'smm=libsmm' in spec:
|
if 'smm=libsmm' in spec:
|
||||||
lib_dir = os.path.join(
|
lib_dir = join_path(
|
||||||
'lib', self.makefile_architecture, self.makefile_version
|
'lib', self.makefile_architecture, self.makefile_version
|
||||||
)
|
)
|
||||||
mkdirp(lib_dir)
|
mkdirp(lib_dir)
|
||||||
try:
|
try:
|
||||||
copy(env['LIBSMM_PATH'], os.path.join(lib_dir, 'libsmm.a'))
|
copy(env['LIBSMM_PATH'], join_path(lib_dir, 'libsmm.a'))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise KeyError('Point environment variable LIBSMM_PATH to '
|
raise KeyError('Point environment variable LIBSMM_PATH to '
|
||||||
'the absolute path of the libsmm.a file')
|
'the absolute path of the libsmm.a file')
|
||||||
@ -545,7 +560,7 @@ def edit(self, spec, prefix):
|
|||||||
|
|
||||||
if spec.satisfies('+cuda'):
|
if spec.satisfies('+cuda'):
|
||||||
mkf.write('NVCC = {0}\n'.format(
|
mkf.write('NVCC = {0}\n'.format(
|
||||||
os.path.join(spec['cuda'].prefix, 'bin', 'nvcc')))
|
join_path(spec['cuda'].prefix, 'bin', 'nvcc')))
|
||||||
|
|
||||||
# Write compiler flags to file
|
# Write compiler flags to file
|
||||||
def fflags(var, lst):
|
def fflags(var, lst):
|
||||||
@ -576,7 +591,7 @@ def build_directory(self):
|
|||||||
|
|
||||||
if self.spec.satisfies('@:6.9999'):
|
if self.spec.satisfies('@:6.9999'):
|
||||||
# prior to version 7.1 was the Makefile located in makefiles/
|
# prior to version 7.1 was the Makefile located in makefiles/
|
||||||
build_dir = os.path.join(build_dir, 'makefiles')
|
build_dir = join_path(build_dir, 'makefiles')
|
||||||
|
|
||||||
return build_dir
|
return build_dir
|
||||||
|
|
||||||
@ -597,12 +612,12 @@ def build(self, spec, prefix):
|
|||||||
super(Cp2k, self).build(spec, prefix)
|
super(Cp2k, self).build(spec, prefix)
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
exe_dir = os.path.join('exe', self.makefile_architecture)
|
exe_dir = join_path('exe', self.makefile_architecture)
|
||||||
install_tree(exe_dir, self.prefix.bin)
|
install_tree(exe_dir, self.prefix.bin)
|
||||||
install_tree('data', self.prefix.share.data)
|
install_tree('data', self.prefix.share.data)
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
data_dir = os.path.join(self.stage.source_path, 'data')
|
data_dir = join_path(self.stage.source_path, 'data')
|
||||||
|
|
||||||
# CP2K < 7 still uses $PWD to detect the current working dir
|
# CP2K < 7 still uses $PWD to detect the current working dir
|
||||||
# and Makefile is in a subdir, account for both facts here:
|
# and Makefile is in a subdir, account for both facts here:
|
||||||
|
@ -22,6 +22,7 @@ class Elpa(AutotoolsPackage, CudaPackage):
|
|||||||
version('2017.11.001', sha256='59f99c3abe2190fac0db8a301d0b9581ee134f438669dbc92551a54f6f861820')
|
version('2017.11.001', sha256='59f99c3abe2190fac0db8a301d0b9581ee134f438669dbc92551a54f6f861820')
|
||||||
version('2017.05.003', sha256='bccd49ce35a323bd734b17642aed8f2588fea4cc78ee8133d88554753bc3bf1b')
|
version('2017.05.003', sha256='bccd49ce35a323bd734b17642aed8f2588fea4cc78ee8133d88554753bc3bf1b')
|
||||||
version('2017.05.002', sha256='568b71024c094d667b5cbb23045ad197ed5434071152ac608dae490ace5eb0aa')
|
version('2017.05.002', sha256='568b71024c094d667b5cbb23045ad197ed5434071152ac608dae490ace5eb0aa')
|
||||||
|
version('2017.05.001', sha256='28f7edad60984d93da299016ad33571dc6db1cdc9fab0ceaef05dc07de2c7dfd')
|
||||||
version('2016.11.001.pre', sha256='69b67f0f6faaa2b3b5fd848127b632be32771636d2ad04583c5269d550956f92')
|
version('2016.11.001.pre', sha256='69b67f0f6faaa2b3b5fd848127b632be32771636d2ad04583c5269d550956f92')
|
||||||
version('2016.05.004', sha256='08c59dc9da458bab856f489d779152e5506e04f0d4b8d6dcf114ca5fbbe46c58')
|
version('2016.05.004', sha256='08c59dc9da458bab856f489d779152e5506e04f0d4b8d6dcf114ca5fbbe46c58')
|
||||||
version('2016.05.003', sha256='c8da50c987351514e61491e14390cdea4bdbf5b09045261991876ed5b433fca4')
|
version('2016.05.003', sha256='c8da50c987351514e61491e14390cdea4bdbf5b09045261991876ed5b433fca4')
|
||||||
@ -79,6 +80,10 @@ def configure_args(self):
|
|||||||
if spec.target.family == 'aarch64':
|
if spec.target.family == 'aarch64':
|
||||||
options.append('--disable-sse-assembly')
|
options.append('--disable-sse-assembly')
|
||||||
|
|
||||||
|
if '%aocc' in spec:
|
||||||
|
options.append('--disable-shared')
|
||||||
|
options.append('--enable-static')
|
||||||
|
|
||||||
# If no features are found, enable the generic ones
|
# If no features are found, enable the generic ones
|
||||||
if not any(f in spec.target for f in simd_features):
|
if not any(f in spec.target for f in simd_features):
|
||||||
options.append('--enable-generic')
|
options.append('--enable-generic')
|
||||||
@ -89,6 +94,12 @@ def configure_args(self):
|
|||||||
'CFLAGS=-O2'
|
'CFLAGS=-O2'
|
||||||
])
|
])
|
||||||
|
|
||||||
|
if '%aocc' in spec:
|
||||||
|
options.extend([
|
||||||
|
'FCFLAGS=-O3',
|
||||||
|
'CFLAGS=-O3'
|
||||||
|
])
|
||||||
|
|
||||||
if '+cuda' in spec:
|
if '+cuda' in spec:
|
||||||
prefix = spec['cuda'].prefix
|
prefix = spec['cuda'].prefix
|
||||||
options.append('--enable-gpu')
|
options.append('--enable-gpu')
|
||||||
@ -113,7 +124,8 @@ def configure_args(self):
|
|||||||
'FC={0}'.format(spec['mpi'].mpifc),
|
'FC={0}'.format(spec['mpi'].mpifc),
|
||||||
'CXX={0}'.format(spec['mpi'].mpicxx),
|
'CXX={0}'.format(spec['mpi'].mpicxx),
|
||||||
'LDFLAGS={0}'.format(spec['lapack'].libs.search_flags),
|
'LDFLAGS={0}'.format(spec['lapack'].libs.search_flags),
|
||||||
'LIBS={0}'.format(spec['lapack'].libs.link_flags),
|
'LIBS={0} {1}'.format(
|
||||||
|
spec['lapack'].libs.link_flags, spec['blas'].libs.link_flags),
|
||||||
'SCALAPACK_LDFLAGS={0}'.format(spec['scalapack'].libs.joined())
|
'SCALAPACK_LDFLAGS={0}'.format(spec['scalapack'].libs.joined())
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ def build(self, spec, prefix):
|
|||||||
]
|
]
|
||||||
|
|
||||||
# JIT (AVX and later) makes MNK, M, N, or K spec. superfluous
|
# JIT (AVX and later) makes MNK, M, N, or K spec. superfluous
|
||||||
# make_args += ['MNK=1 4 5 6 8 9 13 16 17 22 23 24 26 32']
|
# make_args += ['MNK=1 4 5 6 8 9 13 16 17 22 23 24 26 32']
|
||||||
|
|
||||||
# include call trace as the build is already de-optimized
|
# include call trace as the build is already de-optimized
|
||||||
if '+debug' in spec:
|
if '+debug' in spec:
|
||||||
|
Loading…
Reference in New Issue
Block a user