namd: Added optimization auto-selection for skylake-X+ CPU for 2.14 and 2.15a1 (AVX512 tile) (#18671)
This commit is contained in:
parent
5cff304809
commit
1b1bfd883a
@ -7,6 +7,7 @@
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
from spack import *
|
from spack import *
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
|
||||||
|
|
||||||
class Namd(MakefilePackage):
|
class Namd(MakefilePackage):
|
||||||
@ -19,10 +20,9 @@ class Namd(MakefilePackage):
|
|||||||
manual_download = True
|
manual_download = True
|
||||||
|
|
||||||
version("master", branch="master")
|
version("master", branch="master")
|
||||||
|
version('2.15a1', branch="master", tag='release-2-15-alpha-1')
|
||||||
version('2.14', sha256='34044d85d9b4ae61650ccdba5cda4794088c3a9075932392dd0752ef8c049235',
|
version('2.14', sha256='34044d85d9b4ae61650ccdba5cda4794088c3a9075932392dd0752ef8c049235',
|
||||||
preferred=True)
|
preferred=True)
|
||||||
version('2.14b2', sha256='cb4bd918d2d545bb618e4b4a20023a53916f0aa362d9e57f3de1562c36240b00')
|
|
||||||
version('2.14b1', sha256='9407e54f5271b3d3039a5a9d2eae63c7e108ce31b7481e2197c19e1125b43919')
|
|
||||||
version('2.13', '9e3323ed856e36e34d5c17a7b0341e38')
|
version('2.13', '9e3323ed856e36e34d5c17a7b0341e38')
|
||||||
version('2.12', '2a1191909b1ab03bf0205971ad4d8ee9')
|
version('2.12', '2a1191909b1ab03bf0205971ad4d8ee9')
|
||||||
|
|
||||||
@ -76,7 +76,8 @@ def arch(self):
|
|||||||
def build_directory(self):
|
def build_directory(self):
|
||||||
return '{0}-spack'.format(self.arch)
|
return '{0}-spack'.format(self.arch)
|
||||||
|
|
||||||
def edit(self, spec, prefix):
|
def _edit_arch_generic(self, spec, prefix):
|
||||||
|
"""Generic arch makefile generation"""
|
||||||
m64 = '-m64 ' if not spec.satisfies('arch=aarch64:') else ''
|
m64 = '-m64 ' if not spec.satisfies('arch=aarch64:') else ''
|
||||||
with working_dir('arch'):
|
with working_dir('arch'):
|
||||||
with open('{0}.arch'.format(self.build_directory), 'w') as fh:
|
with open('{0}.arch'.format(self.build_directory), 'w') as fh:
|
||||||
@ -89,12 +90,12 @@ def edit(self, spec, prefix):
|
|||||||
if self.spec.satisfies('^charmpp@:6.10.1'):
|
if self.spec.satisfies('^charmpp@:6.10.1'):
|
||||||
optims_opts = {
|
optims_opts = {
|
||||||
'gcc': m64 + '-O3 -fexpensive-optimizations \
|
'gcc': m64 + '-O3 -fexpensive-optimizations \
|
||||||
-ffast-math -lpthread ' + archopt,
|
-ffast-math -lpthread ' + archopt,
|
||||||
'intel': '-O2 -ip ' + archopt}
|
'intel': '-O2 -ip -qopenmp-simd' + archopt}
|
||||||
else:
|
else:
|
||||||
optims_opts = {
|
optims_opts = {
|
||||||
'gcc': m64 + '-O3 -fexpensive-optimizations \
|
'gcc': m64 + '-O3 -fexpensive-optimizations \
|
||||||
-ffast-math ' + archopt,
|
-ffast-math ' + archopt,
|
||||||
'intel': '-O2 -ip ' + archopt}
|
'intel': '-O2 -ip ' + archopt}
|
||||||
|
|
||||||
optim_opts = optims_opts[self.compiler.name] \
|
optim_opts = optims_opts[self.compiler.name] \
|
||||||
@ -111,6 +112,67 @@ def edit(self, spec, prefix):
|
|||||||
''
|
''
|
||||||
]))
|
]))
|
||||||
|
|
||||||
|
def _edit_arch_target_based(self, spec, prefix):
|
||||||
|
"""Try to use target base arch file return True if succeed"""
|
||||||
|
if spec.version < Version("2.14"):
|
||||||
|
return False
|
||||||
|
|
||||||
|
found_special_opt = False
|
||||||
|
with working_dir('arch'):
|
||||||
|
arch_filename = '{0}.arch'.format(self.build_directory)
|
||||||
|
|
||||||
|
replace = [
|
||||||
|
[
|
||||||
|
r"^CHARMARCH = .*$",
|
||||||
|
'CHARMARCH = {0}'.format(self.spec['charmpp'].charmarch)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
r"^NAMD_ARCH = .*$",
|
||||||
|
'NAMD_ARCH = {0}'.format(self.arch)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
# Optimizations for skylake_avx512
|
||||||
|
if spec.platform == "linux" and \
|
||||||
|
self.compiler.name == "intel" and \
|
||||||
|
'avx512' in spec.target and \
|
||||||
|
spec.target >= 'skylake_avx512':
|
||||||
|
if spec.version >= Version("2.15") and \
|
||||||
|
os.path.exists("Linux-AVX512-icc.arch"):
|
||||||
|
tty.info("Building binaries with AVX512-tile optimization")
|
||||||
|
copy("Linux-AVX512-icc.arch", arch_filename)
|
||||||
|
elif spec.version >= Version("2.14") and \
|
||||||
|
os.path.exists("Linux-SKX-icc.arch"):
|
||||||
|
tty.info("Building binaries with Skylake-X"
|
||||||
|
"AVX512 optimization")
|
||||||
|
copy("Linux-SKX-icc.arch", arch_filename)
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
replace.append([
|
||||||
|
r"^CXX = icpc",
|
||||||
|
'CXX = {0}'.format(self.compiler.cxx)
|
||||||
|
])
|
||||||
|
replace.append([
|
||||||
|
r"^CC = icc",
|
||||||
|
'CC = {0}'.format(self.compiler.cc)
|
||||||
|
])
|
||||||
|
found_special_opt = True
|
||||||
|
|
||||||
|
if found_special_opt:
|
||||||
|
for pattern, replacement in replace:
|
||||||
|
filter_file(pattern, replacement, arch_filename)
|
||||||
|
|
||||||
|
return found_special_opt
|
||||||
|
|
||||||
|
def _edit_arch(self, spec, prefix):
|
||||||
|
"""Try to use target base arch file, if not make generic"""
|
||||||
|
if not self._edit_arch_target_based(spec, prefix):
|
||||||
|
self._edit_arch_generic(spec, prefix)
|
||||||
|
|
||||||
|
def edit(self, spec, prefix):
|
||||||
|
self._edit_arch(spec, prefix)
|
||||||
|
|
||||||
self._copy_arch_file('base')
|
self._copy_arch_file('base')
|
||||||
|
|
||||||
opts = ['--charm-base', spec['charmpp'].prefix]
|
opts = ['--charm-base', spec['charmpp'].prefix]
|
||||||
|
Loading…
Reference in New Issue
Block a user