From fcbb6353a047d8400b4abf130a9b33e341817dd5 Mon Sep 17 00:00:00 2001 From: jgp Date: Fri, 22 Mar 2019 15:33:57 +0100 Subject: [PATCH 1/7] mpip --- .../tools/profiling_and_debugging/mpip.py | 90 +++++++++++++++++++ .../profiling_and_debugging/src/C++/Makefile | 2 +- 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 cscs-checks/tools/profiling_and_debugging/mpip.py diff --git a/cscs-checks/tools/profiling_and_debugging/mpip.py b/cscs-checks/tools/profiling_and_debugging/mpip.py new file mode 100644 index 0000000000..3ff308c557 --- /dev/null +++ b/cscs-checks/tools/profiling_and_debugging/mpip.py @@ -0,0 +1,90 @@ +import os + +import reframe as rfm +import reframe.utility.sanity as sn + + +@rfm.required_version('>=2.14') +@rfm.parameterized_test(['Cpp'], ['F90']) +class MpipCheck(rfm.RegressionTest): + '''This test checks mpiP, the light-weight MPI profiler: + http://llnl.github.io/mpiP + ''' + def __init__(self, lang): + super().__init__() + self.valid_systems = ['daint:gpu', 'daint:mc', + 'dom:gpu', 'dom:mc'] + self.valid_prog_environs = ['PrgEnv-gnu'] + # -g compilation flag is needed to report source code filename and line + self.prgenv_flags = { + 'PrgEnv-cray': ['-g', '-h nomessage=3140', '-homp', '-O2'], + 'PrgEnv-gnu': ['-g', '-fopenmp', '-O2'], + 'PrgEnv-intel': ['-g', '-qopenmp', '-O2'], + 'PrgEnv-pgi': ['-g', '-mp', '-O2'] + } + self.modules = ['mpiP'] + self.build_system = 'Make' + self.iterations = 500 + self.build_system.cppflags = [ + '-DUSE_MPI', + '-D_CSCS_ITMAX=%s' % self.iterations, + ] + if lang == 'Cpp': + self.sourcesdir = os.path.join('src', 'C++') + else: + self.sourcesdir = os.path.join('src', lang) + + if lang == 'F90': + self.build_system.max_concurrency = 1 + + self.num_tasks = 96 + self.num_tasks_per_node = 24 + self.num_cpus_per_task = 1 + self.num_tasks_per_core = 2 + self.num_iterations = self.iterations + self.executable = './jacobi' + self.rpt_file = self.rpt_file_txt + self.variables = { + 'OMP_NUM_THREADS': str(self.num_cpus_per_task), + 'ITERATIONS': str(self.num_iterations), + 'OMP_PROC_BIND': 'true', + 'CRAYPE_LINK_TYPE': 'dynamic', + } + if lang == 'Cpp': + mpi_isendline = '140' + elif lang == 'F90': + mpi_isendline = '146' + + self.sanity_patterns = sn.all([ + # check job status: + sn.assert_found('SUCCESS', self.stdout), + # check performance report: + sn.assert_found('Single collector task', self.rpt_file), + sn.assert_eq(sn.extractsingle( + r'^.*_jacobi.*\s+(?P\d+)\s.*Isend', + self.rpt_file, 'mpi_isendline'), mpi_isendline), + ]) + self.maintainers = ['JG'] + self.tags = {'production'} + + def setup(self, environ, partition, **job_opts): + super().setup(environ, partition, **job_opts) + flags = self.prgenv_flags[self.current_environ.name] + self.build_system.cxxflags = flags + self.build_system.fflags = flags + self.build_system.ldflags = flags + [ + '-L$(EBROOTMPIP)/lib', + '-Wl,--whole-archive -lmpiP -Wl,--no-whole-archive', + '-lunwind -lbfd -liberty -ldl -lz' + ] + + @property + @sn.sanity_function + def rpt_file_txt(self): + # As the report output file is hardcoded ( using getpid: + # https://github.com/LLNL/mpiP/blob/master/mpiPi.c#L935 ), i.e changing + # at every job, it's needed to extract the filename from stdout: + rpt = sn.extractsingle( + r'^mpiP: Storing mpiP output in \[(?P.*)\]', + self.stdout, 'rpt', str) + return rpt diff --git a/cscs-checks/tools/profiling_and_debugging/src/C++/Makefile b/cscs-checks/tools/profiling_and_debugging/src/C++/Makefile index af833afb2d..b8441dd726 100644 --- a/cscs-checks/tools/profiling_and_debugging/src/C++/Makefile +++ b/cscs-checks/tools/profiling_and_debugging/src/C++/Makefile @@ -9,7 +9,7 @@ $(OBJS): $(PREP) $(CXX) $(CXXFLAGS) -c -o $(@) $(@:.o=.cc) $(EXECUTABLE): $(OBJS) - $(PREP) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(@) $(OBJS) + $(PREP) $(CXX) $(CXXFLAGS) -o $(@) $(OBJS) $(LDFLAGS) clean: -$(RM) $(OBJS) From 81e9dbadfe4dc727aa67557c25955561089f1071 Mon Sep 17 00:00:00 2001 From: jgp Date: Fri, 22 Mar 2019 15:42:42 +0100 Subject: [PATCH 2/7] issuecomment-475645320 --- cscs-checks/tools/profiling_and_debugging/mpip.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/mpip.py b/cscs-checks/tools/profiling_and_debugging/mpip.py index 3ff308c557..5e600347c0 100644 --- a/cscs-checks/tools/profiling_and_debugging/mpip.py +++ b/cscs-checks/tools/profiling_and_debugging/mpip.py @@ -73,9 +73,9 @@ def setup(self, environ, partition, **job_opts): self.build_system.cxxflags = flags self.build_system.fflags = flags self.build_system.ldflags = flags + [ - '-L$(EBROOTMPIP)/lib', - '-Wl,--whole-archive -lmpiP -Wl,--no-whole-archive', - '-lunwind -lbfd -liberty -ldl -lz' + '-L$(EBROOTMPIP)/lib', + '-Wl,--whole-archive -lmpiP -Wl,--no-whole-archive', + '-lunwind -lbfd -liberty -ldl -lz' ] @property From 226cce3725791bfe197ed499eb1284f916fa9355 Mon Sep 17 00:00:00 2001 From: jgp Date: Fri, 22 Mar 2019 15:45:50 +0100 Subject: [PATCH 3/7] issuecomment-475645320 --- cscs-checks/tools/profiling_and_debugging/mpip.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/mpip.py b/cscs-checks/tools/profiling_and_debugging/mpip.py index 5e600347c0..b73b9418b8 100644 --- a/cscs-checks/tools/profiling_and_debugging/mpip.py +++ b/cscs-checks/tools/profiling_and_debugging/mpip.py @@ -72,10 +72,10 @@ def setup(self, environ, partition, **job_opts): flags = self.prgenv_flags[self.current_environ.name] self.build_system.cxxflags = flags self.build_system.fflags = flags - self.build_system.ldflags = flags + [ - '-L$(EBROOTMPIP)/lib', - '-Wl,--whole-archive -lmpiP -Wl,--no-whole-archive', - '-lunwind -lbfd -liberty -ldl -lz' + self.build_system.ldflags = [ flags, + '-L$(EBROOTMPIP)/lib', + '-Wl,--whole-archive -lmpiP -Wl,--no-whole-archive', + '-lunwind -lbfd -liberty -ldl -lz' ] @property From 02da89c74123870e1e2f29c8976b0c454b63322f Mon Sep 17 00:00:00 2001 From: jgp Date: Fri, 22 Mar 2019 15:50:48 +0100 Subject: [PATCH 4/7] issuecomment-475645320 --- cscs-checks/tools/profiling_and_debugging/mpip.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/mpip.py b/cscs-checks/tools/profiling_and_debugging/mpip.py index b73b9418b8..4a9d7fd26f 100644 --- a/cscs-checks/tools/profiling_and_debugging/mpip.py +++ b/cscs-checks/tools/profiling_and_debugging/mpip.py @@ -72,11 +72,10 @@ def setup(self, environ, partition, **job_opts): flags = self.prgenv_flags[self.current_environ.name] self.build_system.cxxflags = flags self.build_system.fflags = flags - self.build_system.ldflags = [ flags, - '-L$(EBROOTMPIP)/lib', - '-Wl,--whole-archive -lmpiP -Wl,--no-whole-archive', - '-lunwind -lbfd -liberty -ldl -lz' - ] + self.build_system.ldflags = flags + ['-L$(EBROOTMPIP)/lib', + '-Wl,--whole-archive -lmpiP', + '-Wl,--no-whole-archive -lunwind', + '-lbfd -liberty -ldl -lz'] @property @sn.sanity_function From 98cbb53379b2bbaa65dcc1716a32b6d3e07947f6 Mon Sep 17 00:00:00 2001 From: jgp Date: Mon, 25 Mar 2019 11:56:28 +0100 Subject: [PATCH 5/7] gcc_versions --- .../profiling_and_debugging/{mpip.py => mpip_mpi_omp.py} | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) rename cscs-checks/tools/profiling_and_debugging/{mpip.py => mpip_mpi_omp.py} (88%) diff --git a/cscs-checks/tools/profiling_and_debugging/mpip.py b/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py similarity index 88% rename from cscs-checks/tools/profiling_and_debugging/mpip.py rename to cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py index 4a9d7fd26f..79e02f3250 100644 --- a/cscs-checks/tools/profiling_and_debugging/mpip.py +++ b/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py @@ -51,10 +51,17 @@ def __init__(self, lang): 'CRAYPE_LINK_TYPE': 'dynamic', } if lang == 'Cpp': - mpi_isendline = '140' + # PrgEnv-gnu toolchain on daint currently sets gcc/6 as default, + # PrgEnv-gnu toolchain on dom currently sets gcc/7 as default, + # hence mpip will report different line numbers: + if self.current_system.name == 'daint': + mpi_isendline = '142' + elif self.current_system.name == 'dom': + mpi_isendline = '140' elif lang == 'F90': mpi_isendline = '146' + self.post_run = ['ls -lrta', 'pwd'] self.sanity_patterns = sn.all([ # check job status: sn.assert_found('SUCCESS', self.stdout), From 1ad460f581465922ae4d99540c3ff8ad399efd27 Mon Sep 17 00:00:00 2001 From: jgp Date: Mon, 25 Mar 2019 11:59:21 +0100 Subject: [PATCH 6/7] typo --- cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py b/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py index 79e02f3250..65ffc649cd 100644 --- a/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py @@ -61,7 +61,6 @@ def __init__(self, lang): elif lang == 'F90': mpi_isendline = '146' - self.post_run = ['ls -lrta', 'pwd'] self.sanity_patterns = sn.all([ # check job status: sn.assert_found('SUCCESS', self.stdout), From 2949937e57e18cc0f5226509924c577faa0f96a0 Mon Sep 17 00:00:00 2001 From: jgp Date: Wed, 27 Mar 2019 19:41:50 +0100 Subject: [PATCH 7/7] pullrequestreview-219557782 --- cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py b/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py index 65ffc649cd..e4e61c8e33 100644 --- a/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/mpip_mpi_omp.py @@ -24,10 +24,10 @@ def __init__(self, lang): } self.modules = ['mpiP'] self.build_system = 'Make' - self.iterations = 500 + self.num_iterations = 500 self.build_system.cppflags = [ '-DUSE_MPI', - '-D_CSCS_ITMAX=%s' % self.iterations, + '-D_CSCS_ITMAX=%s' % self.num_iterations, ] if lang == 'Cpp': self.sourcesdir = os.path.join('src', 'C++') @@ -41,7 +41,6 @@ def __init__(self, lang): self.num_tasks_per_node = 24 self.num_cpus_per_task = 1 self.num_tasks_per_core = 2 - self.num_iterations = self.iterations self.executable = './jacobi' self.rpt_file = self.rpt_file_txt self.variables = {