From 11d132ed9277054dfcbb374ec00249409c0dadfc Mon Sep 17 00:00:00 2001 From: jgp Date: Fri, 8 Nov 2019 13:20:08 +0100 Subject: [PATCH 1/4] fix --- .../profiling_and_debugging/gperftools.py | 64 ------------------- .../gperftools_mpi_omp.py | 7 +- 2 files changed, 5 insertions(+), 66 deletions(-) delete mode 100644 cscs-checks/tools/profiling_and_debugging/gperftools.py diff --git a/cscs-checks/tools/profiling_and_debugging/gperftools.py b/cscs-checks/tools/profiling_and_debugging/gperftools.py deleted file mode 100644 index 7b331a0269..0000000000 --- a/cscs-checks/tools/profiling_and_debugging/gperftools.py +++ /dev/null @@ -1,64 +0,0 @@ -import os - -import reframe as rfm -import reframe.utility.sanity as sn - - -@rfm.required_version('>=2.14') -@rfm.parameterized_test(*([lang] for lang in ['C', 'Cpp', 'F90'])) -class GperftoolsCheck(rfm.RegressionTest): - def __init__(self, lang): - super().__init__() - self.valid_systems = ['daint:gpu', 'daint:mc'] - self.valid_prog_environs = ['PrgEnv-cray', 'PrgEnv-gnu', - 'PrgEnv-intel', 'PrgEnv-pgi'] - self.num_gpus_per_node = 1 - self.executable = 'perftools_check' - self.prgenv_flags = { - 'PrgEnv-cray': ['-g', '-h nomessage=3140', '-homp'], - 'PrgEnv-gnu': ['-g', '-fopenmp'], - 'PrgEnv-intel': ['-g', '-openmp'], - 'PrgEnv-pgi': ['-g', '-mp'] - } - - self.rpt_file = 'gperftools.rpt' - self.rpt_file_txt = '%s.txt' % self.rpt_file - self.sanity_patterns = sn.all([ - sn.assert_found('SUCCESS', self.stdout), - sn.assert_found(r'^Total:\s\d+\ssamples', self.rpt_file_txt), - ]) - - self.modules = ['gperftools'] - self.build_system = 'Make' - self.build_system.makefile = 'Makefile_perftools' - self.build_system.cppflags = ['-D_CSCS_ITMAX=1', '-DUSE_MPI'] - - if lang == 'Cpp': - self.sourcesdir = os.path.join('src', 'C++') - else: - self.sourcesdir = os.path.join('src', lang) - - # NOTE: Restrict concurrency to allow creation of Fortran modules - if lang == 'F90': - self.build_system.max_concurrency = 1 - - self.num_tasks_per_node = 2 - self.maintainers = ['MK', 'JG'] - self.tags = {'production'} - self.variables = { - 'OMP_NUM_THREADS': '2', - 'CPUPROFILE': self.rpt_file, - } - self.post_run = [ - 'pprof --text ./perftools_check $CPUPROFILE &> %s' - % self.rpt_file_txt - ] - - def setup(self, environ, partition, **job_opts): - super().setup(environ, partition, **job_opts) - flags = self.prgenv_flags[self.current_environ.name] - self.build_system.cflags = flags - self.build_system.cxxflags = flags - self.build_system.fflags = flags - self.build_system.ldflags = flags + ['-dynamic', - '`pkg-config --libs libprofiler`'] diff --git a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py index fcad7164f7..79be302165 100644 --- a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py @@ -14,9 +14,12 @@ def __init__(self, lang): super().__init__() self.valid_systems = ['daint:gpu', 'daint:mc', 'dom:gpu', 'dom:mc'] - self.valid_prog_environs = ['PrgEnv-gnu'] + self.valid_prog_environs = ['PrgEnv-cray', 'PrgEnv-gnu', + 'PrgEnv-intel', 'PrgEnv-pgi'] self.prgenv_flags = { - 'PrgEnv-cray': ['-g', '-h nomessage=3140', '-homp', '-O2'], + 'PrgEnv-cray': ['-O2', '-g', + '-homp' if lang == 'F90' else '-fopenmp'], + 'PrgEnv-cray_classic': ['-O2', '-g', '-homp'], 'PrgEnv-gnu': ['-g', '-fopenmp', '-O2'], 'PrgEnv-intel': ['-g', '-qopenmp', '-O2'], 'PrgEnv-pgi': ['-g', '-mp', '-O2'] From e3165598ce6ea70fe7c73ca121f063143a5ea939 Mon Sep 17 00:00:00 2001 From: jgp Date: Sat, 9 Nov 2019 14:58:37 +0100 Subject: [PATCH 2/4] fix --- .../gperftools_mpi_omp.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py index 79be302165..0a1d1e63ea 100644 --- a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py @@ -75,14 +75,24 @@ def __init__(self, lang): # check job status: sn.assert_found('SUCCESS', self.stdout), # check txt report: - sn.assert_found('MPI_Allreduce', self.rpt_file_txt), sn.assert_found( r'^\s+\d+ms\s+\d+.\d+%.*_jacobi.\w+:\d+', self.rpt_file_txt), # check pdf report: sn.assert_found('PDF document', self.rpt_file_doc), ]) + + self.perf_patterns = { + 'jacobi_elapsed': self.report_flat_pctg, + } + + self.reference = { + '*': { + 'jacobi_elapsed': (0, None, None, '%'), + } + } + self.maintainers = ['JG'] - self.tags = {'production'} + self.tags = {'performance'} def setup(self, environ, partition, **job_opts): super().setup(environ, partition, **job_opts) @@ -91,3 +101,12 @@ def setup(self, environ, partition, **job_opts): self.build_system.cxxflags = flags self.build_system.fflags = flags self.build_system.ldflags = flags + ['`pkg-config --libs libprofiler`'] + +# {{{ + @property + @sn.sanity_function + def report_flat_pctg(self): + regex = r'^\s+\d+ms\s+(?P\d+.\d+)%.*_jacobi.\w+:\d+' + result = sn.extractsingle(regex, self.rpt_file_txt, 'pctg', float) + return result +#}}} From 2408843053314845e6312cd5b2f371989a48524c Mon Sep 17 00:00:00 2001 From: jgp Date: Sat, 9 Nov 2019 15:11:52 +0100 Subject: [PATCH 3/4] pep8 --- .../profiling_and_debugging/gperftools_mpi_omp.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py index 0a1d1e63ea..1b6d8eaa1e 100644 --- a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py @@ -10,6 +10,7 @@ class GperftoolsMpiCheck(rfm.RegressionTest): '''This test checks gperftools: https://gperftools.github.io/gperftools/cpuprofile.html ''' + def __init__(self, lang): super().__init__() self.valid_systems = ['daint:gpu', 'daint:mc', @@ -80,17 +81,14 @@ def __init__(self, lang): # check pdf report: sn.assert_found('PDF document', self.rpt_file_doc), ]) - self.perf_patterns = { 'jacobi_elapsed': self.report_flat_pctg, } - self.reference = { '*': { 'jacobi_elapsed': (0, None, None, '%'), } - } - + } self.maintainers = ['JG'] self.tags = {'performance'} @@ -102,11 +100,11 @@ def setup(self, environ, partition, **job_opts): self.build_system.fflags = flags self.build_system.ldflags = flags + ['`pkg-config --libs libprofiler`'] -# {{{ +# {{{ @property @sn.sanity_function def report_flat_pctg(self): regex = r'^\s+\d+ms\s+(?P\d+.\d+)%.*_jacobi.\w+:\d+' result = sn.extractsingle(regex, self.rpt_file_txt, 'pctg', float) return result -#}}} +# }}} From c5aae8bad6d25fccdb1d1f016a0feda2b99a29f4 Mon Sep 17 00:00:00 2001 From: jgp Date: Mon, 11 Nov 2019 13:30:10 +0100 Subject: [PATCH 4/4] fix --- .../gperftools_mpi_omp.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py index 1b6d8eaa1e..889ecae955 100644 --- a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py @@ -81,16 +81,9 @@ def __init__(self, lang): # check pdf report: sn.assert_found('PDF document', self.rpt_file_doc), ]) - self.perf_patterns = { - 'jacobi_elapsed': self.report_flat_pctg, - } - self.reference = { - '*': { - 'jacobi_elapsed': (0, None, None, '%'), - } - } + self.perf_patterns = { 'jacobi_elapsed%': self.report_flat_pctg, } self.maintainers = ['JG'] - self.tags = {'performance'} + self.tags = {'performance-tools'} def setup(self, environ, partition, **job_opts): super().setup(environ, partition, **job_opts) @@ -104,6 +97,15 @@ def setup(self, environ, partition, **job_opts): @property @sn.sanity_function def report_flat_pctg(self): + ''' + A typical report looks like: + flat flat% sum% cum cum% + 50ms 15.62% 15.62% 50ms 15.62% GNII_DlaProgress ??:? + 30ms 9.38% 50.00% 30ms 9.38 + L__Z6JacobiR10JacobiData_67__par_region1_2_2 GperftoolsMpiCheck_Cpp/ + _jacobi.cc:82 + This functions extracts flat% of the first jacobi function call found. + ''' regex = r'^\s+\d+ms\s+(?P\d+.\d+)%.*_jacobi.\w+:\d+' result = sn.extractsingle(regex, self.rpt_file_txt, 'pctg', float) return result