def set_tool_sanity(self): self.sanity_patterns = sn.all([ # check the job output: sn.assert_found(r'Total time for iteration\(0\)', self.stdout), sn.assert_true(sphsscorep.scorep_info_papi_support(self)), sn.assert_true(sphsscorep.scorep_info_perf_support(self)), sn.assert_true(sphsscorep.scorep_info_unwinding_support(self)), # check the report: sn.assert_eq( sphsscorep.program_begin_count(self), self.num_tasks, msg='sphsscorep.program_begin_count failed: {0} != {1}'), sn.assert_eq( sphsscorep.program_end_count(self), self.num_tasks, msg='sphsscorep.program_end_count failed: {0} != {1}'), # TODO: create derived metric (ipc) in cube ])
def __init__(self, mpi_task): # {{{ pe self.descr = 'Tool validation' self.valid_prog_environs = ['PrgEnv-gnu', 'PrgEnv-intel', 'PrgEnv-pgi', 'PrgEnv-cray'] # self.valid_systems = ['daint:gpu', 'dom:gpu'] self.valid_systems = ['*'] self.maintainers = ['JG'] self.tags = {'sph', 'hpctools', 'cpu'} # }}} # {{{ compile self.testname = 'sqpatch' self.tool = 'scorep' self.prebuild_cmds = ['module rm xalt', 'module list -t'] tool_ver = '6.0' tc_ver = '20.08' self.tool_modules = { 'PrgEnv-gnu': [f'Score-P/{tool_ver}-CrayGNU-{tc_ver}'], 'PrgEnv-intel': [f'Score-P/{tool_ver}-CrayIntel-{tc_ver}'], 'PrgEnv-cray': [f'Score-P/{tool_ver}-CrayCCE-{tc_ver}'], 'PrgEnv-pgi': [f'Score-P/{tool_ver}-CrayPGI-{tc_ver}'], } self.prgenv_flags = { 'PrgEnv-gnu': ['-I.', '-I./include', '-std=c++14', '-g', '-O3', '-DUSE_MPI', '-DNDEBUG'], 'PrgEnv-intel': ['-I.', '-I./include', '-std=c++14', '-g', '-O3', '-DUSE_MPI', '-DNDEBUG'], 'PrgEnv-cray': ['-I.', '-I./include', '-std=c++17', '-g', '-Ofast', '-DUSE_MPI', '-DNDEBUG'], 'PrgEnv-pgi': ['-I.', '-I./include', '-std=c++14', '-g', '-O3', '-DUSE_MPI', '-DNDEBUG'], } self.build_system = 'SingleSource' self.build_system.cxx = 'scorep --mpp=mpi --nocompiler CC' self.sourcepath = f'{self.testname}.cpp' self.executable = f'./{self.testname}.exe' # }}} # {{{ run ompthread = 1 self.num_tasks = mpi_task self.cubeside = cubeside_dict[mpi_task] self.steps = steps_dict[mpi_task] cycles = cycles_dict[mpi_task] self.name = \ 'sphexa_scorepS+P_{}_{:03d}mpi_{:03d}omp_{}n_{}steps_{}cycles'. \ format(self.testname, mpi_task, ompthread, self.cubeside, self.steps, cycles) self.num_tasks_per_node = 24 # {{{ ht: # self.num_tasks_per_node = mpitask if mpitask < 36 else 36 # noht # self.use_multithreading = False # noht # self.num_tasks_per_core = 1 # noht # self.num_tasks_per_node = mpitask if mpitask < 72 else 72 # self.use_multithreading = True # ht # self.num_tasks_per_core = 2 # ht # }}} self.num_cpus_per_task = ompthread self.num_tasks_per_core = 2 self.use_multithreading = True self.exclusive = True self.time_limit = '10m' self.variables = { 'CRAYPE_LINK_TYPE': 'dynamic', 'OMP_NUM_THREADS': str(self.num_cpus_per_task), 'SCOREP_ENABLE_PROFILING': 'true', 'SCOREP_ENABLE_TRACING': 'false', 'SCOREP_ENABLE_UNWINDING': 'true', 'SCOREP_SAMPLING_EVENTS': 'perf_cycles@%s' % cycles, # 'SCOREP_SAMPLING_EVENTS': 'PAPI_TOT_CYC@1000000', # 'SCOREP_SAMPLING_EVENTS': 'PAPI_TOT_CYC@%s' % cycles, # export SCOREP_SAMPLING_EVENTS=PAPI_TOT_CYC@1000000 # empty SCOREP_SAMPLING_EVENTS will profile mpi calls only: # ok: 'SCOREP_SAMPLING_EVENTS': '', # 'SCOREP_METRIC_PAPI': 'PAPI_TOT_INS,PAPI_TOT_CYC', # 'SCOREP_METRIC_RUSAGE': 'ru_maxrss', # 'SCOREP_TIMER': 'clock_gettime', # 'SCOREP_PROFILING_MAX_CALLPATH_DEPTH': '1', # 'SCOREP_VERBOSE': 'true', # 'SCOREP_TOTAL_MEMORY': '1G', } self.version_rpt = 'version.rpt' self.which_rpt = 'which.rpt' self.info_rpt = 'info.rpt' self.rpt = 'rpt' self.rpt_inclusive = '%s.inclusive' % self.rpt self.rpt_exclusive = '%s.exclusive' % self.rpt self.executable_opts = [ f'-n {self.cubeside}', f'-s {self.steps}', '2>&1'] self.prerun_cmds = [ 'module rm xalt', f'{self.tool} --version &> {self.version_rpt}', f'which {self.tool} &> {self.which_rpt}', 'scorep-info config-summary &> %s' % self.info_rpt, ] cubetree = 'cube_calltree -m time -p -t 1' # -m metricname -- print out values for the metric <metricname> # -i -- calculate inclusive values instead of exclusive # -t treshold -- print out only call path with a value larger # than <treshold>% # -p -- diplay percent value self.postrun_cmds = [ # working around memory crash in scorep-score: '(scorep-score -r scorep-*/profile.cubex ;rm -f core*) > %s' \ % self.rpt, '(%s scorep-*/profile.cubex ;rm -f core*) >> %s' \ % (cubetree, self.rpt_exclusive), '(%s -i scorep-*/profile.cubex ;rm -f core*) >> %s' \ % (cubetree, self.rpt_inclusive), ] # }}} # {{{ sanity self.sanity_patterns = sn.all([ # check the job output: sn.assert_found(r'Total time for iteration\(0\)', self.stdout), # check the tool's version and configuration: sn.assert_true(sphsscorep.scorep_version(self)), sn.assert_true(sphsscorep.scorep_info_papi_support(self)), sn.assert_true(sphsscorep.scorep_info_perf_support(self)), sn.assert_true(sphsscorep.scorep_info_unwinding_support(self)), # check the summary report: sn.assert_found(r'Estimated aggregate size of event trace', self.rpt) ]) # }}} # {{{ performance # {{{ internal timers self.prerun_cmds += ['echo starttime=`date +%s`'] self.postrun_cmds += ['echo stoptime=`date +%s`'] # }}} # {{{ perf_patterns: self.perf_patterns = sn.evaluate(sphs.basic_perf_patterns(self)) # tool self.perf_patterns.update({ 'scorep_elapsed': sphsscorep.scorep_elapsed(self), '%scorep_USR': sphsscorep.scorep_usr_pct(self), '%scorep_MPI': sphsscorep.scorep_mpi_pct(self), 'scorep_top1': sphsscorep.scorep_top1_pct(self), '%scorep_Energy_exclusive': sphsscorep.scorep_exclusivepct_energy(self), '%scorep_Energy_inclusive': sphsscorep.scorep_inclusivepct_energy(self), }) # }}} # {{{ reference: self.reference = sn.evaluate(sphs.basic_reference_scoped_d(self)) # tool: self.reference['*:scorep_elapsed'] = (0, None, None, 's') self.reference['*:%scorep_USR'] = (0, None, None, '%') self.reference['*:%scorep_MPI'] = (0, None, None, '%') top1_name = sphsscorep.scorep_top1_name(self) # TODO: self.reference['*:scorep_top1'] = (0, None, None, top1_name) self.reference['*:scorep_top1'] = (0, None, None, '') self.reference['*:%scorep_Energy_exclusive'] = (0, None, None, '%') self.reference['*:%scorep_Energy_inclusive'] = (0, None, None, '%')
def __init__(self, mpi_task): # {{{ pe self.descr = 'Tool validation' self.valid_prog_environs = [ 'PrgEnv-gnu', 'PrgEnv-intel', 'PrgEnv-pgi', 'PrgEnv-cray' ] # self.valid_systems = ['daint:gpu', 'dom:gpu'] self.valid_systems = ['*'] self.maintainers = ['JG'] self.tags = {'sph', 'hpctools', 'cpu'} # }}} # {{{ compile self.testname = 'sqpatch' self.tool = 'scorep' self.prebuild_cmds = ['module rm xalt', 'module list -t'] tool_ver = '6.0' tc_ver = '20.08' self.tool_modules = { 'PrgEnv-gnu': [f'Score-P/{tool_ver}-CrayGNU-{tc_ver}'], 'PrgEnv-intel': [f'Score-P/{tool_ver}-CrayIntel-{tc_ver}'], 'PrgEnv-cray': [f'Score-P/{tool_ver}-CrayCCE-{tc_ver}'], 'PrgEnv-pgi': [f'Score-P/{tool_ver}-CrayPGI-{tc_ver}'], } self.prgenv_flags = { 'PrgEnv-gnu': [ '-I.', '-I./include', '-std=c++14', '-g', '-O3', '-DUSE_MPI', '-DNDEBUG' ], 'PrgEnv-intel': [ '-I.', '-I./include', '-std=c++14', '-g', '-O3', '-DUSE_MPI', '-DNDEBUG' ], 'PrgEnv-cray': [ '-I.', '-I./include', '-std=c++17', '-g', '-Ofast', '-DUSE_MPI', '-DNDEBUG' ], 'PrgEnv-pgi': [ '-I.', '-I./include', '-std=c++14', '-g', '-O3', '-DUSE_MPI', '-DNDEBUG' ], } self.build_system = 'SingleSource' self.build_system.cxx = 'scorep --mpp=mpi --nocompiler CC' self.sourcepath = f'{self.testname}.cpp' self.executable = f'./{self.testname}.exe' # }}} # {{{ run ompthread = 1 self.num_tasks = mpi_task self.cubeside = cubeside_dict[mpi_task] self.steps = steps_dict[mpi_task] cycles = cycles_dict[mpi_task] self.name = \ 'sphexa_scorepS+T_{}_{:03d}mpi_{:03d}omp_{}n_{}steps_{}cycles'. \ format(self.testname, mpi_task, ompthread, self.cubeside, self.steps, cycles) self.num_tasks_per_node = 24 # {{{ ht: # self.num_tasks_per_node = mpitask if mpitask < 36 else 36 # noht # self.use_multithreading = False # noht # self.num_tasks_per_core = 1 # noht # self.num_tasks_per_node = mpitask if mpitask < 72 else 72 # self.use_multithreading = True # ht # self.num_tasks_per_core = 2 # ht # }}} self.num_cpus_per_task = ompthread self.num_tasks_per_core = 2 self.use_multithreading = True self.exclusive = True self.time_limit = '10m' self.variables = { 'CRAYPE_LINK_TYPE': 'dynamic', 'OMP_NUM_THREADS': str(self.num_cpus_per_task), 'SCOREP_ENABLE_PROFILING': 'false', 'SCOREP_ENABLE_TRACING': 'true', 'SCOREP_ENABLE_UNWINDING': 'true', 'SCOREP_SAMPLING_EVENTS': 'perf_cycles@%s' % cycles, # 'SCOREP_SAMPLING_EVENTS': 'PAPI_TOT_CYC@1000000', # 'SCOREP_SAMPLING_EVENTS': 'PAPI_TOT_CYC@%s' % cycles, # export SCOREP_SAMPLING_EVENTS=PAPI_TOT_CYC@1000000 # empty SCOREP_SAMPLING_EVENTS will profile mpi calls only: # ok: 'SCOREP_SAMPLING_EVENTS': '', # 'SCOREP_METRIC_PAPI': 'PAPI_TOT_INS,PAPI_TOT_CYC', # 'SCOREP_METRIC_RUSAGE': 'ru_maxrss', # 'SCOREP_TIMER': 'clock_gettime', # 'SCOREP_PROFILING_MAX_CALLPATH_DEPTH': '1', # 'SCOREP_VERBOSE': 'true', # --- # Needed to avoid "No free memory page available" # (SCOREP_TOTAL_MEMORY=16384000 bytes) 'SCOREP_TOTAL_MEMORY': '1G', # --- # adding some metrics to test my sanity_functions: 'SCOREP_METRIC_RUSAGE': 'ru_maxrss', 'SCOREP_METRIC_PAPI': 'PAPI_TOT_INS,PAPI_TOT_CYC', } self.version_rpt = 'version.rpt' self.which_rpt = 'which.rpt' self.info_rpt = 'scorep-info.rpt' self.rpt = 'rpt' self.rpt_inclusive = '%s.inclusive' % self.rpt self.rpt_exclusive = '%s.exclusive' % self.rpt self.executable_opts = [ f'-n {self.cubeside}', f'-s {self.steps}', '2>&1' ] self.prerun_cmds = [ 'module rm xalt', f'{self.tool} --version &> {self.version_rpt}', f'which {self.tool} &> {self.which_rpt}', 'scorep-info config-summary &> %s' % self.info_rpt, ] self.postrun_cmds = [ # can't test directly from vampir gui: 'otf2-print scorep-*/traces.otf2 > %s' % self.rpt ] # }}} # {{{ sanity self.sanity_patterns = sn.all([ # check the job output: sn.assert_found(r'Total time for iteration\(0\)', self.stdout), # check the tool's version and configuration: sn.assert_true(sphsscorep.scorep_version(self)), sn.assert_true(sphsscorep.scorep_info_papi_support(self)), sn.assert_true(sphsscorep.scorep_info_perf_support(self)), sn.assert_true(sphsscorep.scorep_info_unwinding_support(self)), # check the report: sn.assert_eq(sphsscorep.program_begin_count(self), self.num_tasks), sn.assert_eq(sphsscorep.program_end_count(self), self.num_tasks), # TODO: create derived metric (ipc) in cube ]) # }}} # {{{ performance # {{{ internal timers self.prerun_cmds += ['echo starttime=`date +%s`'] self.postrun_cmds += ['echo stoptime=`date +%s`'] # }}} # {{{ perf_patterns: self.perf_patterns = sn.evaluate(sphs.basic_perf_patterns(self)) # tool self.perf_patterns.update({ 'max_ipc_rk0': sphsscorep.ipc_rk0(self), 'max_rumaxrss_rk0': sphsscorep.ru_maxrss_rk0(self), }) # }}} # {{{ reference: self.reference = sn.evaluate(sphs.basic_reference_scoped_d(self)) # tool: self.reference['*:max_ipc_rk0'] = (0, None, None, 'ins/cyc') self.reference['*:max_rumaxrss_rk0'] = (0, None, None, 'kilobytes')