11import os
22
3+ import reframe as rfm
34import reframe .utility .sanity as sn
4- from reframe .core .pipeline import RunOnlyRegressionTest
55
66
7- class AmberBaseCheck (RunOnlyRegressionTest ):
8- def __init__ (self , name , input_file , output_file , ** kwargs ):
9- super ().__init__ (name , os .path .dirname (__file__ ), ** kwargs )
10-
11- self .valid_prog_environs = ['PrgEnv-gnu' ]
12-
13- self .modules = ['Amber' ]
7+ class AmberBaseCheck (rfm .RunOnlyRegressionTest ):
8+ def __init__ (self , input_file , output_file ):
9+ super ().__init__ ()
1410
1511 self .sourcesdir = os .path .join (self .current_system .resourcesdir ,
1612 'Amber' )
17- self .executable_opts = \
18- ('-O -i %s -o %s' % (input_file , output_file )).split ()
13+
14+ self .valid_prog_environs = ['PrgEnv-gnu' ]
15+ self .modules = ['Amber' ]
16+ self .num_tasks = 1
17+ self .num_tasks_per_node = 1
18+ self .num_gpus_per_node = 1
19+ self .executable_opts = ['-O' , '-i' , input_file , '-o' , output_file ]
1920 self .keep_files = [output_file ]
21+ self .extra_resources = {
22+ 'switches' : {
23+ 'num_switches' : 1
24+ }
25+ }
2026
2127 energy = sn .extractsingle (r' Etot\s+=\s+(?P<energy>\S+)' ,
2228 output_file , 'energy' , float , item = - 2 )
@@ -31,84 +37,53 @@ def __init__(self, name, input_file, output_file, **kwargs):
3137 'perf' : sn .extractsingle (r'ns/day =\s+(?P<perf>\S+)' ,
3238 output_file , 'perf' , float , item = 1 )
3339 }
34-
3540 self .maintainers = ['SO' , 'VH' ]
3641 self .tags = {'scs' }
37- self .extra_resources = {
38- 'switches' : {
39- 'num_switches' : 1
40- }
41- }
42-
43-
44- class AmberGPUCheck (AmberBaseCheck ):
45- def __init__ (self , version , ** kwargs ):
46- super ().__init__ ('amber_gpu_%s_check' % version , 'mdin.GPU' ,
47- 'amber.out' , ** kwargs )
48- self .valid_systems = ['daint:gpu' , 'dom:gpu' ]
49- self .executable = 'pmemd.cuda.MPI'
50- self .num_tasks = 1
51- self .num_tasks_per_node = 1
52- self .num_gpus_per_node = 1
53-
54-
55- class AmberGPUProdCheck (AmberGPUCheck ):
56- def __init__ (self , ** kwargs ):
57- super ().__init__ ('prod' , ** kwargs )
58- self .descr = 'Amber parallel GPU production check'
59- self .tags |= {'production' }
60- self .reference = {
61- 'dom:gpu' : {
62- 'perf' : (22.2 , - 0.05 , None )
63- },
64- 'daint:gpu' : {
65- 'perf' : (21.7 , - 0.05 , None )
66- },
67- }
6842
6943
70- class AmberGPUMaintCheck (AmberGPUCheck ):
71- def __init__ (self , ** kwargs ):
72- super ().__init__ ('maint' , ** kwargs )
73- self .descr = 'Amber parallel GPU maintenance check'
74- self .tags |= {'maintenance' }
75- self .reference = {
76- 'dom:gpu' : {
77- 'perf' : (22.2 , - 0.05 , None )
78- },
79- 'daint:gpu' : {
80- 'perf' : (21.7 , - 0.05 , None )
81- },
82- }
83-
84-
85- class AmberCPUCheck (AmberBaseCheck ):
86- def __init__ (self , ** kwargs ):
87- super ().__init__ ('amber_cpu_check' , 'mdin.CPU' , 'amber.out' , ** kwargs )
88- self .descr = 'Amber parallel CPU check'
89- self .tags |= {'production' }
90- self .executable = 'pmemd.MPI'
91- self .strict_check = False
92- self .valid_systems = ['daint:mc' , 'dom:mc' ]
93- self .modules = ['Amber' ]
94-
95- self .reference = {
96- 'dom:mc' : {
97- 'perf' : (8.0 , - 0.05 , None )
98- },
99- 'daint:mc' : {
100- 'perf' : (10.7 , - 0.25 , None )
101- },
102- }
103-
104- if self .current_system .name == 'dom' :
105- self .num_tasks = 216
106- self .num_tasks_per_node = 36
107- else :
108- self .num_tasks = 576
109- self .num_tasks_per_node = 36
110-
44+ @rfm .parameterized_test (* ([variant , arch ]
45+ for variant in ['prod' , 'maint' ]
46+ for arch in ['CPU' , 'GPU' ]))
47+ class AmberCheck (AmberBaseCheck ):
48+ def __init__ (self , variant , arch ):
49+ super ().__init__ ('mdin.%s' % arch , 'amber.out' )
50+ if arch == 'GPU' :
51+ self .valid_systems = ['daint:gpu' , 'dom:gpu' ]
52+ self .executable = 'pmemd.cuda.MPI'
53+ self .reference = {
54+ 'dom:gpu' : {
55+ 'perf' : (30.0 , - 0.05 , None )
56+ },
57+ 'daint:gpu' : {
58+ 'perf' : (30.0 , - 0.05 , None )
59+ },
60+ }
61+ if variant == 'prod' :
62+ self .descr = 'Amber parallel GPU production check'
63+ self .tags |= {'production' }
64+ elif variant == 'maint' :
65+ self .descr = 'Amber parallel GPU maintenance check'
66+ self .tags |= {'maintenance' }
67+ elif arch == 'CPU' :
68+ self .valid_systems = ['daint:mc' , 'dom:mc' ]
69+ if variant == 'prod' :
70+ self .descr = 'Amber parallel CPU production check'
71+ self .tags |= {'production' }
72+ self .executable = 'pmemd.MPI'
73+ self .strict_check = False
74+ if self .current_system .name == 'dom' :
75+ self .num_tasks = 216
76+ self .num_tasks_per_node = 36
77+ else :
78+ self .num_tasks = 576
79+ self .num_tasks_per_node = 36
80+
81+ self .reference = {
82+ 'dom:mc' : {
83+ 'perf' : (8.0 , - 0.05 , None )
84+ },
85+ 'daint:mc' : {
86+ 'perf' : (10.7 , - 0.25 , None )
87+ },
88+ }
11189
112- def _get_checks (** kwargs ):
113- return [AmberGPUProdCheck (** kwargs ), AmberGPUMaintCheck (** kwargs ),
114- AmberCPUCheck (** kwargs )]
0 commit comments