Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
312 changes: 158 additions & 154 deletions cscs-checks/apps/cp2k/cp2k_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,174 +4,178 @@
# SPDX-License-Identifier: BSD-3-Clause

import reframe as rfm
import reframe.utility.sanity as sn

from hpctestlib.apps.cp2k.nve import Cp2k_NVE


REFERENCE_CPU_PERFORMANCE_SMALL = {
'dom:mc': {
'maint': (202.2, None, 0.05, 's'),
'prod': (202.2, None, 0.05, 's')
},
'daint:mc': {
'maint': (180.9, None, 0.08, 's'),
'prod': (180.9, None, 0.08, 's')
},
'eiger:mc': {
'maint': (70.0, None, 0.08, 's'),
'prod': (46.0, None, 0.05, 's')
},
'pilatus:mc': {
'maint': (70.0, None, 0.08, 's'),
'prod': (70.0, None, 0.08, 's')
},
}

REFERENCE_CPU_PERFORMANCE_LARGE = {
'daint:mc': {
'maint': (141.0, None, 0.05, 's'),
'prod': (113.0, None, 0.05, 's')
},
'eiger:mc': {
'maint': (46.0, None, 0.05, 's'),
'prod': (46.0, None, 0.05, 's')
},
'pilatus:mc': {
'maint': (46.0, None, 0.05, 's'),
'prod': (46.0, None, 0.05, 's')
},
}

REFERENCE_CPU_PERFORMANCE = {
'small': REFERENCE_CPU_PERFORMANCE_SMALL,
'large': REFERENCE_CPU_PERFORMANCE_LARGE,
}

REFERENCE_GPU_PERFORMANCE_SMALL = {
'dom:mc': {
'maint': (251.8, None, 0.15, 's'),
'prod': (240.0, None, 0.05, 's')
},
'daint:mc': {
'maint': (241.3, None, 0.05, 's'),
'prod': (241.3, None, 0.05, 's')
}
}

REFERENCE_GPU_PERFORMANCE_LARGE = {
'daint:mc': {
'maint': (199.6, None, 0.06, 's'),
'prod': (199.6, None, 0.06, 's')
}
}

REFERENCE_GPU_PERFORMANCE = {
'small': REFERENCE_GPU_PERFORMANCE_SMALL,
'large': REFERENCE_GPU_PERFORMANCE_LARGE,
}

REFERENCE_PERFORMANCE = {
'cpu': REFERENCE_CPU_PERFORMANCE,
'gpu': REFERENCE_GPU_PERFORMANCE,
}


@rfm.simple_test
class cp2k_check(Cp2k_NVE):
modules = ['CP2K']
maintainers = ['LM']
tags = {'scs'}
strict_check = False
extra_resources = {
'switches': {
'num_switches': 1
}
}
scale = parameter(['small', 'large'])
mode = parameter(['prod', 'maint'])

class Cp2kCheck(rfm.RunOnlyRegressionTest):
def __init__(self):
@run_after('init')
def env_define(self):
if self.current_system.name in ['eiger', 'pilatus']:
self.valid_prog_environs = ['cpeGNU']
else:
self.valid_prog_environs = ['builtin']

self.modules = ['CP2K']
self.executable = 'cp2k.psmp'
self.executable_opts = ['H2O-256.inp']

energy = sn.extractsingle(
r'\s+ENERGY\| Total FORCE_EVAL \( QS \) '
r'energy [\[\(]a\.u\.[\]\)]:\s+(?P<energy>\S+)',
self.stdout, 'energy', float, item=-1
)
energy_reference = -4404.2323
energy_diff = sn.abs(energy-energy_reference)
self.sanity_patterns = sn.all([
sn.assert_found(r'PROGRAM STOPPED IN', self.stdout),
sn.assert_eq(sn.count(sn.extractall(
r'(?i)(?P<step_count>STEP NUMBER)',
self.stdout, 'step_count')), 10),
sn.assert_lt(energy_diff, 1e-4)
])

self.perf_patterns = {
'time': sn.extractsingle(r'^ CP2K(\s+[\d\.]+){4}\s+(?P<perf>\S+)',
self.stdout, 'perf', float)
}

self.maintainers = ['LM']
self.tags = {'scs'}
self.strict_check = False
self.extra_resources = {
'switches': {
'num_switches': 1
}
}
@run_after('init')
def set_tags(self):
self.tags |= {'maintenance' if self.mode == 'maint'
else 'production'}


@rfm.parameterized_test(*([s, v]
for s in ['small', 'large']
for v in ['maint', 'prod']))
class Cp2kCpuCheck(Cp2kCheck):
def __init__(self, scale, variant):
super().__init__()
self.descr = 'CP2K CPU check (version: %s, %s)' % (scale, variant)
self.valid_systems = ['daint:mc', 'eiger:mc', 'pilatus:mc']
if scale == 'small':
self.valid_systems += ['dom:mc']
if self.current_system.name in ['daint', 'dom']:
self.num_tasks = 216
self.num_tasks_per_node = 36
elif self.current_system.name in ['eiger', 'pilatus']:
@run_after('init')
def set_valid_systems(self):
if self.platform_name == 'cpu':
self.valid_systems = ['daint:mc', 'eiger:mc', 'pilatus:mc']
else:
self.valid_systems = ['daint:gpu']

@run_after('init')
def set_description(self):
if self.platform_name == 'cpu':
self.descr = (f'CP2K {self.platform_name} check'
f'(version: {self.scale}, {self.mode})')

@run_after('init')
def set_num_tasks(self):
if self.platform_name == 'cpu':
if self.scale == 'small':
self.valid_systems += ['dom:mc']
if self.current_system.name in ['daint', 'dom']:
self.num_tasks = 216
self.num_tasks_per_node = 36
elif self.current_system.name in ['eiger', 'pilatus']:
self.num_tasks = 96
self.num_tasks_per_node = 16
self.num_cpus_per_task = 16
self.num_tasks_per_core = 1
self.use_multithreading = False
self.variables = {
'MPICH_OFI_STARTUP_CONNECT': '1',
'OMP_NUM_THREADS': '8',
'OMP_PLACES': 'cores',
'OMP_PROC_BIND': 'close'
}

else:
if self.current_system.name in ['daint', 'dom']:
self.num_tasks = 576
self.num_tasks_per_node = 36
elif self.current_system.name in ['eiger', 'pilatus']:
self.num_tasks = 256
self.num_tasks_per_node = 16
self.num_cpus_per_task = 16
self.num_tasks_per_core = 1
self.use_multithreading = False
self.variables = {
'MPICH_OFI_STARTUP_CONNECT': '1',
'OMP_NUM_THREADS': '8',
'OMP_PLACES': 'cores',
'OMP_PROC_BIND': 'close'
}
else:
self.num_gpus_per_node = 1
self.num_tasks_per_node = 6
self.num_cpus_per_task = 2
if self.scale == 'small':
self.valid_systems += ['dom:gpu']
self.num_tasks = 36
else:
self.num_tasks = 96
self.num_tasks_per_node = 16
self.num_cpus_per_task = 16
self.num_tasks_per_core = 1
self.use_multithreading = False
self.variables = {
'MPICH_OFI_STARTUP_CONNECT': '1',
'OMP_NUM_THREADS': '8',
'OMP_PLACES': 'cores',
'OMP_PROC_BIND': 'close'
}

else:
if self.current_system.name in ['daint', 'dom']:
self.num_tasks = 576
self.num_tasks_per_node = 36
elif self.current_system.name in ['eiger', 'pilatus']:
self.num_tasks = 256
self.num_tasks_per_node = 16
self.num_cpus_per_task = 16
self.num_tasks_per_core = 1
self.use_multithreading = False
self.variables = {
'MPICH_OFI_STARTUP_CONNECT': '1',
'OMP_NUM_THREADS': '8',
'OMP_PLACES': 'cores',
'OMP_PROC_BIND': 'close'
}

references = {
'maint': {
'small': {
'dom:mc': {'time': (202.2, None, 0.05, 's')},
'daint:mc': {'time': (180.9, None, 0.08, 's')},
'eiger:mc': {'time': (70.0, None, 0.08, 's')},
'pilatus:mc': {'time': (70.0, None, 0.08, 's')}
},
'large': {
'daint:mc': {'time': (141.0, None, 0.05, 's')},
'eiger:mc': {'time': (46.0, None, 0.05, 's')},
'pilatus:mc': {'time': (46.0, None, 0.05, 's')}
}
},
'prod': {
'small': {
'dom:mc': {'time': (202.2, None, 0.05, 's')},
'daint:mc': {'time': (180.9, None, 0.08, 's')},
'eiger:mc': {'time': (70.0, None, 0.08, 's')},
'pilatus:mc': {'time': (70.0, None, 0.08, 's')}
},
'large': {
'daint:mc': {'time': (113.0, None, 0.05, 's')},
'eiger:mc': {'time': (46.0, None, 0.05, 's')},
'pilatus:mc': {'time': (46.0, None, 0.05, 's')}
}
self.variables = {
'CRAY_CUDA_MPS': '1',
'OMP_NUM_THREADS': str(self.num_cpus_per_task)
}
}

self.reference = references[variant][scale]
self.tags |= {'maintenance' if variant == 'maint' else 'production'}
@run_after('setup')
def set_reference(self):
self.reference = REFERENCE_PERFORMANCE[self.platform_name][self.scale]

@run_before('run')
def set_task_distribution(self):
self.job.options = ['--distribution=block:block']
if self.platform_name == 'cpu':
self.job.options = ['--distribution=block:block']

@run_before('run')
def set_cpu_binding(self):
self.job.launcher.options = ['--cpu-bind=cores']


@rfm.parameterized_test(*([s, v]
for s in ['small', 'large']
for v in ['maint', 'prod']))
class Cp2kGpuCheck(Cp2kCheck):
def __init__(self, scale, variant):
super().__init__()
self.descr = 'CP2K GPU check (version: %s, %s)' % (scale, variant)
self.valid_systems = ['daint:gpu']
self.num_gpus_per_node = 1
if scale == 'small':
self.valid_systems += ['dom:gpu']
self.num_tasks = 36
else:
self.num_tasks = 96

self.num_tasks_per_node = 6
self.num_cpus_per_task = 2
self.variables = {
'CRAY_CUDA_MPS': '1',
'OMP_NUM_THREADS': str(self.num_cpus_per_task)
}
references = {
'maint': {
'small': {
'dom:gpu': {'time': (251.8, None, 0.15, 's')},
'daint:gpu': {'time': (241.3, None, 0.05, 's')}
},
'large': {
'daint:gpu': {'time': (199.6, None, 0.06, 's')}
}
},
'prod': {
'small': {
'dom:gpu': {'time': (240.0, None, 0.05, 's')},
'daint:gpu': {'time': (241.3, None, 0.05, 's')}
},
'large': {
'daint:gpu': {'time': (199.6, None, 0.06, 's')}
}
}
}
self.reference = references[variant][scale]
self.tags |= {'maintenance' if variant == 'maint' else 'production'}
if self.platform_name == 'cpu':
self.job.launcher.options = ['--cpu-bind=cores']
Loading