From 0904e6929e44a24fb5f211f5daa75cefd2609f54 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Thu, 2 Aug 2018 14:17:46 +0200 Subject: [PATCH 1/5] Adapt helloworld tests to build systems * Adapt to new test syntax. * Reformat to be consistent with the coding style of ReFrame. --- cscs-checks/prgenv/helloworld.py | 130 +++++++++++++++---------------- 1 file changed, 64 insertions(+), 66 deletions(-) diff --git a/cscs-checks/prgenv/helloworld.py b/cscs-checks/prgenv/helloworld.py index dddedadbd9..e92a81bf70 100644 --- a/cscs-checks/prgenv/helloworld.py +++ b/cscs-checks/prgenv/helloworld.py @@ -1,15 +1,13 @@ -import os from datetime import datetime +import reframe as rfm import reframe.utility.sanity as sn -from reframe.core.pipeline import RegressionTest -class HelloWorldBaseTest(RegressionTest): +class HelloWorldBaseTest(rfm.RegressionTest): def __init__(self, name, lang, linkage, **kwargs): - super().__init__('hello_world_%s_%s_%s' % (name, linkage, lang), - os.path.dirname(__file__), **kwargs) - + super().__init__() + self.name = 'hello_world_%s_%s_%s' % (name, linkage, lang) if self.current_system.name in ['dom', 'daint']: self.modules += ['gcc/6.1.0'] @@ -20,10 +18,9 @@ def __init__(self, name, lang, linkage, **kwargs): 'cpp': 'C++', 'f90': 'Fortran 90' } - self.descr = self.lang_names[lang] + ' Hello World' self.sourcepath = 'hello_world' - + self.build_system = 'SingleSource' self.valid_systems = ['daint:gpu', 'daint:mc', 'dom:gpu', 'dom:mc', 'kesch:cn', 'kesch:pn', 'leone:normal', 'monch:compute'] @@ -42,6 +39,7 @@ def __init__(self, name, lang, linkage, **kwargs): self.tags = {'production', 'monch_acceptance'} def setup(self, partition, environ, **job_opts): + result = sn.findall(r'Hello World from thread \s*(\d+) out ' r'of \s*(\d+) from process \s*(\d+) out of ' r'\s*(\d+)', self.stdout) @@ -49,18 +47,30 @@ def setup(self, partition, environ, **job_opts): self.sanity_patterns = sn.all( sn.chain([sn.assert_eq(sn.count(result), self.num_tasks * self.num_cpus_per_task)], - sn.map(lambda x: sn.assert_lt(int(x.group(1)), int(x.group(2))), - result), - sn.map(lambda x: sn.assert_lt(int(x.group(3)), int(x.group(4))), - result), - sn.map(lambda x: sn.assert_lt(int(x.group(1)), - self.num_cpus_per_task), result), - sn.map(lambda x: sn.assert_eq(int(x.group(2)), - self.num_cpus_per_task), result), - sn.map(lambda x: sn.assert_lt(int(x.group(3)), - self.num_tasks), result), - sn.map(lambda x: sn.assert_eq(int(x.group(4)), self.num_tasks), - result), + sn.map( + lambda x: sn.assert_lt(int(x.group(1)), + int(x.group(2))), + result), + sn.map( + lambda x: sn.assert_lt(int(x.group(3)), + int(x.group(4))), + result), + sn.map( + lambda x: sn.assert_lt(int(x.group(1)), + self.num_cpus_per_task), + result), + sn.map( + lambda x: sn.assert_eq(int(x.group(2)), + self.num_cpus_per_task), + result), + sn.map( + lambda x: sn.assert_lt(int(x.group(3)), + self.num_tasks), + result), + sn.map( + lambda x: sn.assert_eq(int(x.group(4)), + self.num_tasks), + result), ) ) @@ -73,19 +83,20 @@ def setup(self, partition, environ, **job_opts): } } super().setup(partition, environ, **job_opts) - - def compile(self): prgenv_flags = self.prgenv_flags[self.current_environ.name] - self.current_environ.cflags = prgenv_flags - self.current_environ.cxxflags = prgenv_flags - self.current_environ.fflags = prgenv_flags + self.build_system.cflags = prgenv_flags + self.build_system.cxxflags = prgenv_flags + self.build_system.fflags = prgenv_flags + def compile(self): self.compilation_time_seconds = datetime.now() super().compile() self.compilation_time_seconds = ( datetime.now() - self.compilation_time_seconds).total_seconds() +@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static']]) class HelloWorldTestSerial(HelloWorldBaseTest): def __init__(self, lang, linkage, **kwargs): super().__init__('serial', lang, linkage, **kwargs) @@ -93,26 +104,28 @@ def __init__(self, lang, linkage, **kwargs): self.sourcepath += '_serial.' + lang self.descr += ' Serial ' + linkage.capitalize() self.prgenv_flags = { - 'PrgEnv-cray': '', - 'PrgEnv-gnu': '', - 'PrgEnv-intel': '', - 'PrgEnv-pgi': '' + 'PrgEnv-cray': [''], + 'PrgEnv-gnu': [''], + 'PrgEnv-intel': [''], + 'PrgEnv-pgi': [''] } self.num_tasks = 1 self.num_tasks_per_node = 1 self.num_cpus_per_task = 1 +@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static']]) class HelloWorldTestOpenMP(HelloWorldBaseTest): - def __init__(self, lang, linkage, **kwargs): - super().__init__('openmp', lang, linkage, **kwargs) + def __init__(self, lang, linkage): + super().__init__('openmp', lang, linkage) self.sourcepath += '_openmp.' + lang self.descr += ' OpenMP ' + str.capitalize(linkage) self.prgenv_flags = { - 'PrgEnv-cray': ' -homp ', - 'PrgEnv-gnu': ' -fopenmp ', - 'PrgEnv-intel': ' -qopenmp ', - 'PrgEnv-pgi': ' -mp ' + 'PrgEnv-cray': ['-homp'], + 'PrgEnv-gnu': ['-fopenmp'], + 'PrgEnv-intel': ['-qopenmp'], + 'PrgEnv-pgi': ['-mp'] } self.num_tasks = 1 self.num_tasks_per_node = 1 @@ -125,16 +138,18 @@ def __init__(self, lang, linkage, **kwargs): } +@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static']]) class HelloWorldTestMPI(HelloWorldBaseTest): - def __init__(self, lang, linkage, **kwargs): - super().__init__('mpi', lang, linkage, **kwargs) + def __init__(self, lang, linkage): + super().__init__('mpi', lang, linkage) self.sourcepath += '_mpi.' + lang self.descr += ' MPI ' + linkage.capitalize() self.prgenv_flags = { - 'PrgEnv-cray': '', - 'PrgEnv-gnu': '', - 'PrgEnv-intel': '', - 'PrgEnv-pgi': '' + 'PrgEnv-cray': [''], + 'PrgEnv-gnu': [''], + 'PrgEnv-intel': [''], + 'PrgEnv-pgi': [''] } # for the MPI test the self.num_tasks_per_node should always be one. If @@ -145,16 +160,18 @@ def __init__(self, lang, linkage, **kwargs): self.num_cpus_per_task = 1 +@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static']]) class HelloWorldTestMPIOpenMP(HelloWorldBaseTest): - def __init__(self, lang, linkage, **kwargs): - super().__init__('mpi_openmp', lang, linkage, **kwargs) + def __init__(self, lang, linkage): + super().__init__('mpi_openmp', lang, linkage) self.sourcepath += '_mpi_openmp.' + lang self.descr += ' MPI + OpenMP ' + linkage.capitalize() self.prgenv_flags = { - 'PrgEnv-cray': ' -homp ', - 'PrgEnv-gnu': ' -fopenmp ', - 'PrgEnv-intel': ' -qopenmp ', - 'PrgEnv-pgi': ' -mp ' + 'PrgEnv-cray': ['-homp'], + 'PrgEnv-gnu': ['-fopenmp'], + 'PrgEnv-intel': ['-qopenmp'], + 'PrgEnv-pgi': ['-mp'] } self.num_tasks = 6 self.num_tasks_per_node = 3 @@ -165,22 +182,3 @@ def __init__(self, lang, linkage, **kwargs): self.variables = { 'OMP_NUM_THREADS': str(self.num_cpus_per_task) } - - -class HelloWorldTestFactory(): - def create(lang, variant, linkage, **kwargs): - if variant == 'serial': - return HelloWorldTestSerial(lang, linkage, **kwargs) - elif variant == 'openmp': - return HelloWorldTestOpenMP(lang, linkage, **kwargs) - elif variant == 'mpi': - return HelloWorldTestMPI(lang, linkage, **kwargs) - elif variant == 'mpi_openmp': - return HelloWorldTestMPIOpenMP(lang, linkage, **kwargs) - - -def _get_checks(**kwargs): - return [HelloWorldTestFactory.create(lang, variant, linkage, **kwargs) - for lang in ['cpp', 'c', 'f90'] - for variant in ['serial', 'openmp', 'mpi', 'mpi_openmp'] - for linkage in ['dynamic', 'static']] From 03337ef4eb31c6b043b4c0a2f1e726dba1ba27ce Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Tue, 21 Aug 2018 13:55:39 +0200 Subject: [PATCH 2/5] Replace lists with generators --- cscs-checks/prgenv/helloworld.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cscs-checks/prgenv/helloworld.py b/cscs-checks/prgenv/helloworld.py index e92a81bf70..6f86e4f9ca 100644 --- a/cscs-checks/prgenv/helloworld.py +++ b/cscs-checks/prgenv/helloworld.py @@ -95,8 +95,8 @@ def compile(self): datetime.now() - self.compilation_time_seconds).total_seconds() -@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] - for linkage in ['dynamic', 'static']]) +@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static'])) class HelloWorldTestSerial(HelloWorldBaseTest): def __init__(self, lang, linkage, **kwargs): super().__init__('serial', lang, linkage, **kwargs) @@ -114,8 +114,8 @@ def __init__(self, lang, linkage, **kwargs): self.num_cpus_per_task = 1 -@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] - for linkage in ['dynamic', 'static']]) +@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static'])) class HelloWorldTestOpenMP(HelloWorldBaseTest): def __init__(self, lang, linkage): super().__init__('openmp', lang, linkage) @@ -138,8 +138,8 @@ def __init__(self, lang, linkage): } -@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] - for linkage in ['dynamic', 'static']]) +@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static'])) class HelloWorldTestMPI(HelloWorldBaseTest): def __init__(self, lang, linkage): super().__init__('mpi', lang, linkage) @@ -160,8 +160,8 @@ def __init__(self, lang, linkage): self.num_cpus_per_task = 1 -@rfm.parameterized_test(*[[lang, linkage] for lang in ['cpp', 'c', 'f90'] - for linkage in ['dynamic', 'static']]) +@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] + for linkage in ['dynamic', 'static'])) class HelloWorldTestMPIOpenMP(HelloWorldBaseTest): def __init__(self, lang, linkage): super().__init__('mpi_openmp', lang, linkage) From 1fc5623f6bd99aaa17a0e4569b79d02019a9c8bb Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Fri, 24 Aug 2018 08:54:20 +0200 Subject: [PATCH 3/5] Address PR comments --- cscs-checks/prgenv/helloworld.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/cscs-checks/prgenv/helloworld.py b/cscs-checks/prgenv/helloworld.py index 6f86e4f9ca..c1b25e8b98 100644 --- a/cscs-checks/prgenv/helloworld.py +++ b/cscs-checks/prgenv/helloworld.py @@ -5,9 +5,8 @@ class HelloWorldBaseTest(rfm.RegressionTest): - def __init__(self, name, lang, linkage, **kwargs): + def __init__(self, name, lang, linkage): super().__init__() - self.name = 'hello_world_%s_%s_%s' % (name, linkage, lang) if self.current_system.name in ['dom', 'daint']: self.modules += ['gcc/6.1.0'] @@ -95,7 +94,8 @@ def compile(self): datetime.now() - self.compilation_time_seconds).total_seconds() -@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] +@rfm.parameterized_test(*([lang, linkage] + for lang in ['cpp', 'c', 'f90'] for linkage in ['dynamic', 'static'])) class HelloWorldTestSerial(HelloWorldBaseTest): def __init__(self, lang, linkage, **kwargs): @@ -104,17 +104,18 @@ def __init__(self, lang, linkage, **kwargs): self.sourcepath += '_serial.' + lang self.descr += ' Serial ' + linkage.capitalize() self.prgenv_flags = { - 'PrgEnv-cray': [''], - 'PrgEnv-gnu': [''], - 'PrgEnv-intel': [''], - 'PrgEnv-pgi': [''] + 'PrgEnv-cray': [], + 'PrgEnv-gnu': [], + 'PrgEnv-intel': [], + 'PrgEnv-pgi': [] } self.num_tasks = 1 self.num_tasks_per_node = 1 self.num_cpus_per_task = 1 -@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] +@rfm.parameterized_test(*([lang, linkage] + for lang in ['cpp', 'c', 'f90'] for linkage in ['dynamic', 'static'])) class HelloWorldTestOpenMP(HelloWorldBaseTest): def __init__(self, lang, linkage): @@ -138,7 +139,8 @@ def __init__(self, lang, linkage): } -@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] +@rfm.parameterized_test(*([lang, linkage] + for lang in ['cpp', 'c', 'f90'] for linkage in ['dynamic', 'static'])) class HelloWorldTestMPI(HelloWorldBaseTest): def __init__(self, lang, linkage): @@ -146,10 +148,10 @@ def __init__(self, lang, linkage): self.sourcepath += '_mpi.' + lang self.descr += ' MPI ' + linkage.capitalize() self.prgenv_flags = { - 'PrgEnv-cray': [''], - 'PrgEnv-gnu': [''], - 'PrgEnv-intel': [''], - 'PrgEnv-pgi': [''] + 'PrgEnv-cray': [], + 'PrgEnv-gnu': [], + 'PrgEnv-intel': [], + 'PrgEnv-pgi': [] } # for the MPI test the self.num_tasks_per_node should always be one. If @@ -160,7 +162,8 @@ def __init__(self, lang, linkage): self.num_cpus_per_task = 1 -@rfm.parameterized_test(*([lang, linkage] for lang in ['cpp', 'c', 'f90'] +@rfm.parameterized_test(*([lang, linkage] + for lang in ['cpp', 'c', 'f90'] for linkage in ['dynamic', 'static'])) class HelloWorldTestMPIOpenMP(HelloWorldBaseTest): def __init__(self, lang, linkage): From f58804833b0e75ccbb2885800ed3cfc6e7bac98b Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Fri, 24 Aug 2018 08:56:24 +0200 Subject: [PATCH 4/5] Empty line removal --- cscs-checks/prgenv/helloworld.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cscs-checks/prgenv/helloworld.py b/cscs-checks/prgenv/helloworld.py index c1b25e8b98..028b021a9d 100644 --- a/cscs-checks/prgenv/helloworld.py +++ b/cscs-checks/prgenv/helloworld.py @@ -38,7 +38,6 @@ def __init__(self, name, lang, linkage): self.tags = {'production', 'monch_acceptance'} def setup(self, partition, environ, **job_opts): - result = sn.findall(r'Hello World from thread \s*(\d+) out ' r'of \s*(\d+) from process \s*(\d+) out of ' r'\s*(\d+)', self.stdout) From f745d40d0a4e83e835953a2ae10c5509d36ade32 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Fri, 31 Aug 2018 10:54:20 +0200 Subject: [PATCH 5/5] Address PR comments (version 2) --- cscs-checks/prgenv/helloworld.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cscs-checks/prgenv/helloworld.py b/cscs-checks/prgenv/helloworld.py index 028b021a9d..13171000e4 100644 --- a/cscs-checks/prgenv/helloworld.py +++ b/cscs-checks/prgenv/helloworld.py @@ -5,7 +5,7 @@ class HelloWorldBaseTest(rfm.RegressionTest): - def __init__(self, name, lang, linkage): + def __init__(self, variant, lang, linkage): super().__init__() if self.current_system.name in ['dom', 'daint']: self.modules += ['gcc/6.1.0']