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..889ecae955 100644 --- a/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py +++ b/cscs-checks/tools/profiling_and_debugging/gperftools_mpi_omp.py @@ -10,13 +10,17 @@ 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', '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'] @@ -72,14 +76,14 @@ 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.maintainers = ['JG'] - self.tags = {'production'} + self.tags = {'performance-tools'} def setup(self, environ, partition, **job_opts): super().setup(environ, partition, **job_opts) @@ -88,3 +92,21 @@ 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): + ''' + 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 +# }}}