From 4a4036a99484ecae37da5ced0b232915f378c0e5 Mon Sep 17 00:00:00 2001 From: jg Date: Thu, 23 May 2019 16:44:17 +0200 Subject: [PATCH 1/5] [test] Make the stream test generic --- cscs-checks/microbenchmarks/stream/stream.py | 87 ++++++++++++-------- 1 file changed, 51 insertions(+), 36 deletions(-) diff --git a/cscs-checks/microbenchmarks/stream/stream.py b/cscs-checks/microbenchmarks/stream/stream.py index 2089ecf9b3..f28283a8e5 100644 --- a/cscs-checks/microbenchmarks/stream/stream.py +++ b/cscs-checks/microbenchmarks/stream/stream.py @@ -5,15 +5,22 @@ @rfm.required_version('>=2.14') @rfm.simple_test class StreamTest(rfm.RegressionTest): + """This test checks the stream test: + Function Best Rate MB/s Avg time Min time Max time + Triad: 13991.7 0.017174 0.017153 0.017192 + """ def __init__(self): super().__init__() self.descr = 'STREAM Benchmark' self.exclusive_access = True - # All available systems are supported self.valid_systems = ['daint:gpu', 'daint:mc', 'dom:gpu', 'dom:mc', 'kesch:cn', 'kesch:pn', 'leone:normal'] - self.valid_prog_environs = ['PrgEnv-cray', 'PrgEnv-gnu', - 'PrgEnv-intel', 'PrgEnv-pgi'] + if self.current_system.name in {'dom', 'daint', 'kesch', 'leone'}: + self.valid_prog_environs = ['PrgEnv-cray', 'PrgEnv-gnu', + 'PrgEnv-intel', 'PrgEnv-pgi'] + else: + self.valid_prog_environs = ['*'] + if self.current_system.name == 'kesch': self.exclusive_access = True self.valid_prog_environs += ['PrgEnv-cray-nompi', @@ -28,8 +35,7 @@ def __init__(self): } self.sourcepath = 'stream.c' self.build_system = 'SingleSource' - self.sanity_patterns = sn.assert_found( - r'Solution Validates: avg error less than', self.stdout) + self.prebuild_cmd = ['module list'] self.num_tasks = 1 self.num_tasks_per_node = 1 self.stream_cpus_per_task = { @@ -42,55 +48,64 @@ def __init__(self): 'leone:normal': 16, 'monch:compute': 20, } - self.variables = { 'OMP_PLACES': 'threads', 'OMP_PROC_BIND': 'spread' } + self.sanity_patterns = sn.assert_found( + r'Solution Validates: avg error less than', self.stdout) + self.perf_patterns = { + 'triad': sn.extractsingle(r'Triad:\s+(?P\S+)\s+\S+', + self.stdout, 'triad', float) + } self.stream_bw_reference = { 'PrgEnv-cray': { - 'daint:gpu': {'triad': (50223.0, -0.15, None)}, - 'daint:mc': {'triad': (56643.0, -0.25, None)}, - 'dom:gpu': {'triad': (50440.0, -0.15, None)}, - 'dom:mc': {'triad': (56711.0, -0.25, None)}, - 'kesch:cn': {'triad': (103129.0, -0.05, None)}, - 'kesch:pn': {'triad': (55967.0, -0.1, None)}, + 'daint:gpu': {'triad': (50223.0, -0.15, None, 'MB/s')}, + 'daint:mc': {'triad': (56643.0, -0.25, None, 'MB/s')}, + 'dom:gpu': {'triad': (50440.0, -0.15, None, 'MB/s')}, + 'dom:mc': {'triad': (56711.0, -0.25, None, 'MB/s')}, + 'kesch:cn': {'triad': (103129.0, -0.05, None, 'MB/s')}, + 'kesch:pn': {'triad': (55967.0, -0.1, None, 'MB/s')}, + '*': {'triad': (0.0, None, None, 'MB/s')}, }, 'PrgEnv-gnu': { - 'daint:gpu': {'triad': (50223.0, -0.15, None)}, - 'daint:mc': {'triad': (56643.0, -0.25, None)}, - 'dom:gpu': {'triad': (50440.0, -0.15, None)}, - 'dom:mc': {'triad': (56711.0, -0.25, None)}, - 'kesch:cn': {'triad': (78046.0, -0.05, None)}, - 'kesch:pn': {'triad': (43803.0, -0.1, None)}, - 'leone:normal': {'triad': (44767.0, -0.05, None)}, - 'monch:compute': {'triad': (31011.0, -0.05, None)}, + 'daint:gpu': {'triad': (50223.0, -0.15, None, 'MB/s')}, + 'daint:mc': {'triad': (56643.0, -0.25, None, 'MB/s')}, + 'dom:gpu': {'triad': (50440.0, -0.15, None, 'MB/s')}, + 'dom:mc': {'triad': (56711.0, -0.25, None, 'MB/s')}, + 'kesch:cn': {'triad': (78046.0, -0.05, None, 'MB/s')}, + 'kesch:pn': {'triad': (43803.0, -0.1, None, 'MB/s')}, + 'leone:normal': {'triad': (44767.0, -0.05, None, 'MB/s')}, + 'monch:compute': {'triad': (31011.0, -0.05, None, 'MB/s')}, + '*': {'triad': (0.0, None, None, 'MB/s')}, }, 'PrgEnv-intel': { - 'daint:gpu': {'triad': (50223.0, -0.15, None)}, - 'daint:mc': {'triad': (56643.0, -0.25, None)}, - 'dom:gpu': {'triad': (50440.0, -0.15, None)}, - 'dom:mc': {'triad': (56711.0, -0.25, None)}, + 'daint:gpu': {'triad': (50223.0, -0.15, None, 'MB/s')}, + 'daint:mc': {'triad': (56643.0, -0.25, None, 'MB/s')}, + 'dom:gpu': {'triad': (50440.0, -0.15, None, 'MB/s')}, + 'dom:mc': {'triad': (56711.0, -0.25, None, 'MB/s')}, + '*': {'triad': (0.0, None, None, 'MB/s')}, }, 'PrgEnv-pgi': { - 'daint:gpu': {'triad': (50223.0, -0.15, None)}, - 'daint:mc': {'triad': (56643.0, -0.25, None)}, - 'dom:gpu': {'triad': (50440.0, -0.15, None)}, - 'dom:mc': {'triad': (56711.0, -0.25, None)}, - 'kesch:cn': {'triad': (78637.0, -0.1, None)}, - 'kesch:pn': {'triad': (86022.0, -0.1, None)}, + 'daint:gpu': {'triad': (50223.0, -0.15, None, 'MB/s')}, + 'daint:mc': {'triad': (56643.0, -0.25, None, 'MB/s')}, + 'dom:gpu': {'triad': (50440.0, -0.15, None, 'MB/s')}, + 'dom:mc': {'triad': (56711.0, -0.25, None, 'MB/s')}, + 'kesch:cn': {'triad': (78637.0, -0.1, None, 'MB/s')}, + 'kesch:pn': {'triad': (86022.0, -0.1, None, 'MB/s')}, + '*': {'triad': (0.0, None, None, 'MB/s')}, } } - self.perf_patterns = { - 'triad': sn.extractsingle(r'Triad:\s+(?P\S+)\s+\S+', - self.stdout, 'triad', float) - } - self.tags = {'production', 'monch_acceptance'} self.maintainers = ['RS', 'VK'] def setup(self, partition, environ, **job_opts): - self.num_cpus_per_task = self.stream_cpus_per_task[partition.fullname] + if self.current_system.name in {'dom', 'daint', 'kesch', 'leone'}: + self.num_cpus_per_task = self.stream_cpus_per_task[ + partition.fullname] + else: + self.num_cpus_per_task = 1 + if self.current_system.name == 'kesch': envname = environ.name.replace('-nompi', '') else: From 363d48da773e19d561dbf09696de756ab0bb1221 Mon Sep 17 00:00:00 2001 From: jg Date: Thu, 23 May 2019 20:22:45 +0200 Subject: [PATCH 2/5] fixes for review --- cscs-checks/microbenchmarks/stream/stream.py | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/cscs-checks/microbenchmarks/stream/stream.py b/cscs-checks/microbenchmarks/stream/stream.py index f28283a8e5..fe58462092 100644 --- a/cscs-checks/microbenchmarks/stream/stream.py +++ b/cscs-checks/microbenchmarks/stream/stream.py @@ -15,12 +15,8 @@ def __init__(self): self.exclusive_access = True self.valid_systems = ['daint:gpu', 'daint:mc', 'dom:gpu', 'dom:mc', 'kesch:cn', 'kesch:pn', 'leone:normal'] - if self.current_system.name in {'dom', 'daint', 'kesch', 'leone'}: - self.valid_prog_environs = ['PrgEnv-cray', 'PrgEnv-gnu', - 'PrgEnv-intel', 'PrgEnv-pgi'] - else: - self.valid_prog_environs = ['*'] - + self.valid_prog_environs = ['PrgEnv-cray', 'PrgEnv-gnu', + 'PrgEnv-intel', 'PrgEnv-pgi'] if self.current_system.name == 'kesch': self.exclusive_access = True self.valid_prog_environs += ['PrgEnv-cray-nompi', @@ -31,11 +27,11 @@ def __init__(self): 'PrgEnv-cray': ['-homp'], 'PrgEnv-gnu': ['-fopenmp', '-O3'], 'PrgEnv-intel': ['-qopenmp', '-O3'], - 'PrgEnv-pgi': ['-mp', '-O3'] + 'PrgEnv-pgi': ['-mp', '-O3'], + '*': ['-O3'] } self.sourcepath = 'stream.c' self.build_system = 'SingleSource' - self.prebuild_cmd = ['module list'] self.num_tasks = 1 self.num_tasks_per_node = 1 self.stream_cpus_per_task = { @@ -100,12 +96,8 @@ def __init__(self): self.maintainers = ['RS', 'VK'] def setup(self, partition, environ, **job_opts): - if self.current_system.name in {'dom', 'daint', 'kesch', 'leone'}: - self.num_cpus_per_task = self.stream_cpus_per_task[ - partition.fullname] - else: - self.num_cpus_per_task = 1 - + self.num_cpus_per_task = self.stream_cpus_per_task.get( + partition.fullname, 1) if self.current_system.name == 'kesch': envname = environ.name.replace('-nompi', '') else: From 22cc5ce17ed7d5b4faee10ca2856e839d6309f8c Mon Sep 17 00:00:00 2001 From: jg Date: Thu, 23 May 2019 20:41:24 +0200 Subject: [PATCH 3/5] fixes for pep8 --- cscs-checks/microbenchmarks/stream/stream.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cscs-checks/microbenchmarks/stream/stream.py b/cscs-checks/microbenchmarks/stream/stream.py index fe58462092..2737572148 100644 --- a/cscs-checks/microbenchmarks/stream/stream.py +++ b/cscs-checks/microbenchmarks/stream/stream.py @@ -9,6 +9,7 @@ class StreamTest(rfm.RegressionTest): Function Best Rate MB/s Avg time Min time Max time Triad: 13991.7 0.017174 0.017153 0.017192 """ + def __init__(self): super().__init__() self.descr = 'STREAM Benchmark' @@ -97,7 +98,7 @@ def __init__(self): def setup(self, partition, environ, **job_opts): self.num_cpus_per_task = self.stream_cpus_per_task.get( - partition.fullname, 1) + partition.fullname, 1) if self.current_system.name == 'kesch': envname = environ.name.replace('-nompi', '') else: From 4e6454f8d613a96aff4690f48236bb13402f9dd2 Mon Sep 17 00:00:00 2001 From: jg Date: Fri, 24 May 2019 12:00:45 +0200 Subject: [PATCH 4/5] fix for review --- cscs-checks/microbenchmarks/stream/stream.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cscs-checks/microbenchmarks/stream/stream.py b/cscs-checks/microbenchmarks/stream/stream.py index 2737572148..3b06cdf0f2 100644 --- a/cscs-checks/microbenchmarks/stream/stream.py +++ b/cscs-checks/microbenchmarks/stream/stream.py @@ -28,8 +28,7 @@ def __init__(self): 'PrgEnv-cray': ['-homp'], 'PrgEnv-gnu': ['-fopenmp', '-O3'], 'PrgEnv-intel': ['-qopenmp', '-O3'], - 'PrgEnv-pgi': ['-mp', '-O3'], - '*': ['-O3'] + 'PrgEnv-pgi': ['-mp', '-O3'] } self.sourcepath = 'stream.c' self.build_system = 'SingleSource' @@ -99,17 +98,18 @@ def __init__(self): def setup(self, partition, environ, **job_opts): self.num_cpus_per_task = self.stream_cpus_per_task.get( partition.fullname, 1) + self.variables['OMP_NUM_THREADS'] = str(self.num_cpus_per_task) if self.current_system.name == 'kesch': envname = environ.name.replace('-nompi', '') else: envname = environ.name - self.reference = self.stream_bw_reference[envname] - # On SLURM there is no need to set OMP_NUM_THREADS if one defines - # num_cpus_per_task, but adding for completeness and portability - self.variables['OMP_NUM_THREADS'] = str(self.num_cpus_per_task) + self.build_system.cflags = self.prgenv_flags.get(envname, ['-O3']) if envname == 'PrgEnv-pgi': self.variables['OMP_PROC_BIND'] = 'true' - self.build_system.cflags = self.prgenv_flags[envname] + try: + self.reference = self.stream_bw_reference[envname] + except KeyError: + self.reference = {'*': {'triad': (0.0, None, None, 'MB/s')}} super().setup(partition, environ, **job_opts) From 26be0f923614531ca1c28bfa463f8c607dc64afe Mon Sep 17 00:00:00 2001 From: Vasileios Karakasis Date: Fri, 24 May 2019 13:14:00 +0200 Subject: [PATCH 5/5] Fix code styling issue --- cscs-checks/microbenchmarks/stream/stream.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cscs-checks/microbenchmarks/stream/stream.py b/cscs-checks/microbenchmarks/stream/stream.py index 3b06cdf0f2..75b77d8d93 100644 --- a/cscs-checks/microbenchmarks/stream/stream.py +++ b/cscs-checks/microbenchmarks/stream/stream.py @@ -112,4 +112,5 @@ def setup(self, partition, environ, **job_opts): self.reference = self.stream_bw_reference[envname] except KeyError: self.reference = {'*': {'triad': (0.0, None, None, 'MB/s')}} + super().setup(partition, environ, **job_opts)