99import reframe .utility .sanity as sn
1010
1111
12- class LAMMPSBaseCheck (rfm .RunOnlyRegressionTest ):
13- def __init__ (self ):
12+ class LAMMPSCheck (rfm .RunOnlyRegressionTest ):
13+ scale = parameter (['small' , 'large' ])
14+ variant = parameter (['maint' , 'prod' ])
15+ modules = ['cray-python' , 'LAMMPS' ]
16+ tags = {'scs' , 'external-resources' }
17+ maintainers = ['LM' ]
18+ strict_check = False
19+ extra_resources = {
20+ 'switches' : {
21+ 'num_switches' : 1
22+ }
23+ }
24+
25+ @run_after ('init' )
26+ def setup_by_system (self ):
27+ # Reset sources dir relative to the SCS apps prefix
28+ self .sourcesdir = os .path .join (self .current_system .resourcesdir ,
29+ 'LAMMPS' )
1430 if self .current_system .name in ['eiger' , 'pilatus' ]:
1531 self .valid_prog_environs = ['cpeGNU' ]
1632 else :
1733 self .valid_prog_environs = ['builtin' ]
18- self .modules = ['LAMMPS' ]
1934
20- # Reset sources dir relative to the SCS apps prefix
21- self .sourcesdir = os .path .join (self .current_system .resourcesdir ,
22- 'LAMMPS' )
35+ @performance_function ('timesteps/s' )
36+ def perf (self ):
37+ return sn .extractsingle (r'\s+(?P<perf>\S+) timesteps/s' ,
38+ self .stdout , 'perf' , float )
39+
40+ @sanity_function
41+ def assert_energy_diff (self ):
2342 energy_reference = - 4.6195
2443 energy = sn .extractsingle (
2544 r'\s+500000(\s+\S+){3}\s+(?P<energy>\S+)\s+\S+\s\n' ,
2645 self .stdout , 'energy' , float )
27- self .perf_patterns = {
28- 'perf' : sn .extractsingle (r'\s+(?P<perf>\S+) timesteps/s' ,
29- self .stdout , 'perf' , float ),
30- }
31- energy_diff = sn .abs (energy - energy_reference )
32- self .sanity_patterns = sn .all ([
46+ energy_diff = sn .abs (energy - energy_reference )
47+ return sn .all ([
3348 sn .assert_found (r'Total wall time:' , self .stdout ),
3449 sn .assert_lt (energy_diff , 6e-4 )
3550 ])
36- self .strict_check = False
37- self .extra_resources = {
38- 'switches' : {
39- 'num_switches' : 1
51+
52+
53+ @rfm .simple_test
54+ class LAMMPSGPUCheck (LAMMPSCheck ):
55+ valid_systems = ['daint:gpu' ]
56+ executable = 'lmp_mpi'
57+ executable_opts = ['-sf gpu' , '-pk gpu 1' , '-in in.lj.gpu' ]
58+ variables = {'CRAY_CUDA_MPS' : '1' }
59+ num_gpus_per_node = 1
60+ references_by_variant = {
61+ 'maint' : {
62+ 'small' : {
63+ 'dom:gpu' : {'perf' : (3457 , - 0.10 , None , 'timesteps/s' )},
64+ 'daint:gpu' : {'perf' : (2524 , - 0.10 , None , 'timesteps/s' )}
65+ },
66+ 'large' : {
67+ 'daint:gpu' : {'perf' : (3832 , - 0.05 , None , 'timesteps/s' )}
4068 }
41- }
69+ },
70+ 'prod' : {
71+ 'small' : {
72+ 'dom:gpu' : {'perf' : (3132 , - 0.05 , None , 'timesteps/s' )},
73+ 'daint:gpu' : {'perf' : (2400 , - 0.40 , None , 'timesteps/s' )}
74+ },
75+ 'large' : {
76+ 'daint:gpu' : {'perf' : (3260 , - 0.50 , None , 'timesteps/s' )}
77+ }
78+ },
79+ }
4280
43- self .tags = {'scs' , 'external-resources' }
44- self .maintainers = ['VH' ]
45-
46-
47- @rfm .parameterized_test (* ([s , v ]
48- for s in ['small' , 'large' ]
49- for v in ['prod' , 'maint' ]))
50- class LAMMPSGPUCheck (LAMMPSBaseCheck ):
51- def __init__ (self , scale , variant ):
52- super ().__init__ ()
53- self .valid_systems = ['daint:gpu' ]
54- self .executable = 'lmp_mpi'
55- self .executable_opts = ['-sf gpu' , '-pk gpu 1' , '-in in.lj.gpu' ]
56- self .variables = {'CRAY_CUDA_MPS' : '1' }
57- self .num_gpus_per_node = 1
58- if scale == 'small' :
81+ @run_after ('init' )
82+ def setup_by_variant (self ):
83+ self .descr = (f'LAMMPS GPU check (version: { self .scale } , '
84+ f'{ self .variant } )' )
85+ if self .scale == 'small' :
5986 self .valid_systems += ['dom:gpu' ]
6087 self .num_tasks = 12
6188 self .num_tasks_per_node = 2
6289 else :
6390 self .num_tasks = 32
6491 self .num_tasks_per_node = 2
6592
66- references = {
67- 'maint' : {
68- 'small' : {
69- 'dom:gpu' : {'perf' : (3457 , - 0.10 , None , 'timesteps/s' )},
70- 'daint:gpu' : {'perf' : (2524 , - 0.10 , None , 'timesteps/s' )}
71- },
72- 'large' : {
73- 'daint:gpu' : {'perf' : (3832 , - 0.05 , None , 'timesteps/s' )}
74- }
93+ self .reference = self .references_by_variant [self .variant ][self .scale ]
94+ self .tags |= {
95+ 'maintenance' if self .variant == 'maint' else 'production'
96+ }
97+
98+
99+ @rfm .simple_test
100+ class LAMMPSCPUCheck (LAMMPSCheck ):
101+ valid_systems = ['daint:mc' , 'eiger:mc' , 'pilatus:mc' ]
102+ references_by_variant = {
103+ 'maint' : {
104+ 'small' : {
105+ 'dom:mc' : {'perf' : (4394 , - 0.05 , None , 'timesteps/s' )},
106+ 'daint:mc' : {'perf' : (3824 , - 0.10 , None , 'timesteps/s' )},
107+ 'eiger:mc' : {'perf' : (4500 , - 0.10 , None , 'timesteps/s' )},
108+ 'pilatus:mc' : {'perf' : (5000 , - 0.10 , None , 'timesteps/s' )}
75109 },
76- 'prod' : {
77- 'small' : {
78- 'dom:gpu' : {'perf' : (3132 , - 0.05 , None , 'timesteps/s' )},
79- 'daint:gpu' : {'perf' : (2400 , - 0.40 , None , 'timesteps/s' )}
80- },
81- 'large' : {
82- 'daint:gpu' : {'perf' : (3260 , - 0.50 , None , 'timesteps/s' )}
83- }
110+ 'large' : {
111+ 'daint:mc' : {'perf' : (5310 , - 0.65 , None , 'timesteps/s' )},
112+ 'eiger:mc' : {'perf' : (6500 , - 0.10 , None , 'timesteps/s' )},
113+ 'pilatus:mc' : {'perf' : (7500 , - 0.10 , None , 'timesteps/s' )}
114+ }
115+ },
116+ 'prod' : {
117+ 'small' : {
118+ 'dom:mc' : {'perf' : (4394 , - 0.05 , None , 'timesteps/s' )},
119+ 'daint:mc' : {'perf' : (3824 , - 0.10 , None , 'timesteps/s' )},
120+ 'eiger:mc' : {'perf' : (4500 , - 0.10 , None , 'timesteps/s' )},
121+ 'pilatus:mc' : {'perf' : (5000 , - 0.10 , None , 'timesteps/s' )}
84122 },
123+ 'large' : {
124+ 'daint:mc' : {'perf' : (5310 , - 0.65 , None , 'timesteps/s' )},
125+ 'eiger:mc' : {'perf' : (6500 , - 0.10 , None , 'timesteps/s' )},
126+ 'pilatus:mc' : {'perf' : (7500 , - 0.10 , None , 'timesteps/s' )}
127+ }
85128 }
86- self .reference = references [variant ][scale ]
87- self .tags |= {'maintenance' if variant == 'maint' else 'production' }
129+ }
88130
89-
90- @rfm .parameterized_test (* ([s , v ]
91- for s in ['small' , 'large' ]
92- for v in ['prod' ]))
93- class LAMMPSCPUCheck (LAMMPSBaseCheck ):
94- def __init__ (self , scale , variant ):
95- super ().__init__ ()
96- self .valid_systems = ['daint:mc' , 'eiger:mc' , 'pilatus:mc' ]
131+ @run_after ('init' )
132+ def setup_by_variant (self ):
133+ self .descr = (f'LAMMPS CPU check (version: { self .scale } , '
134+ f'{ self .variant } )' )
97135 if self .current_system .name in ['eiger' , 'pilatus' ]:
98136 self .executable = 'lmp_mpi'
99137 self .executable_opts = ['-in in.lj.cpu' ]
100138 else :
101139 self .executable = 'lmp_omp'
102140 self .executable_opts = ['-sf omp' , '-pk omp 1' , '-in in.lj.cpu' ]
103141
104- self .scale = scale
105- if scale == 'small' :
142+ if self .scale == 'small' :
106143 self .valid_systems += ['dom:mc' ]
107144 self .num_tasks = 216
108145 self .num_tasks_per_node = 36
@@ -114,20 +151,7 @@ def __init__(self, scale, variant):
114151 self .num_tasks_per_node = 128
115152 self .num_tasks = 256 if self .scale == 'small' else 512
116153
117- references = {
118- 'prod' : {
119- 'small' : {
120- 'dom:mc' : {'perf' : (4394 , - 0.05 , None , 'timesteps/s' )},
121- 'daint:mc' : {'perf' : (3824 , - 0.10 , None , 'timesteps/s' )},
122- 'eiger:mc' : {'perf' : (4500 , - 0.10 , None , 'timesteps/s' )},
123- 'pilatus:mc' : {'perf' : (5000 , - 0.10 , None , 'timesteps/s' )}
124- },
125- 'large' : {
126- 'daint:mc' : {'perf' : (5310 , - 0.65 , None , 'timesteps/s' )},
127- 'eiger:mc' : {'perf' : (6500 , - 0.10 , None , 'timesteps/s' )},
128- 'pilatus:mc' : {'perf' : (7500 , - 0.10 , None , 'timesteps/s' )}
129- }
130- },
154+ self .reference = self .references_by_variant [self .variant ][self .scale ]
155+ self .tags |= {
156+ 'maintenance' if self .variant == 'maint' else 'production'
131157 }
132- self .reference = references [variant ][scale ]
133- self .tags |= {'maintenance' if variant == 'maint' else 'production' }
0 commit comments