From ba8c7ee2418ce4c2a20fa17ef9c1a3368c0eab26 Mon Sep 17 00:00:00 2001 From: Marcel Koch <marcel.koch@uni-muenster.de> Date: Wed, 9 Jan 2019 17:30:11 +0100 Subject: [PATCH] add instrumentation level 3 --- python/dune/codegen/generation/__init__.py | 1 + python/dune/codegen/generation/cpp.py | 5 ++ python/dune/codegen/pdelab/driver/timings.py | 10 +++- python/dune/codegen/pdelab/localoperator.py | 60 ++++++++++++++++---- 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/python/dune/codegen/generation/__init__.py b/python/dune/codegen/generation/__init__.py index d0cf1d4d..bed02564 100644 --- a/python/dune/codegen/generation/__init__.py +++ b/python/dune/codegen/generation/__init__.py @@ -16,6 +16,7 @@ from dune.codegen.generation.cpp import (base_class, class_member, constructor_parameter, dump_accumulate_timer, + register_liwkid_timer, end_of_file, include_file, initializer_list, diff --git a/python/dune/codegen/generation/cpp.py b/python/dune/codegen/generation/cpp.py index 29384f98..b9182910 100644 --- a/python/dune/codegen/generation/cpp.py +++ b/python/dune/codegen/generation/cpp.py @@ -50,3 +50,8 @@ def dump_accumulate_timer(name): code = "DUMP_TIMER({},{},{},{});".format(get_option("instrumentation_level"), name, os, reset) return code + + +@generator_factory(item_tags=("register_likwid_timers",)) +def register_liwkid_timer(name): + return "LIKWID_MARKER_REGISTER(\"{}\");".format(name) diff --git a/python/dune/codegen/pdelab/driver/timings.py b/python/dune/codegen/pdelab/driver/timings.py index dd879cc4..4dbc29b3 100644 --- a/python/dune/codegen/pdelab/driver/timings.py +++ b/python/dune/codegen/pdelab/driver/timings.py @@ -133,6 +133,12 @@ def driver_likwid(): stop_driver_likwid() +@preamble(section="timings") +def local_operator_likwid(): + lop_name = name_localoperator(get_form_ident()) + return "{}.register_likwid_timers();".format(lop_name) + + @cached def setup_timer(): # TODO check that we are using YASP? @@ -141,6 +147,8 @@ def setup_timer(): include_file("likwid.h", filetag="driver") init_likwid() driver_likwid() + if get_option('instrumentation_level') >= 3: + local_operator_likwid() finalize_likwid() else: from dune.codegen.loopy.target import type_floatingpoint @@ -194,7 +202,7 @@ def timed_region(region, actions): init_region_timer(region) - if get_option('instrumentation_level') >= 3: + if get_option('instrumentation_level') >= 3 and not get_option('use_likwid'): timestream = name_timing_stream() lop_name = name_localoperator(get_form_ident()) print_times.append("{}.dump_timers({}, {}, true);".format(lop_name, timestream, name_timing_identifier())) diff --git a/python/dune/codegen/pdelab/localoperator.py b/python/dune/codegen/pdelab/localoperator.py index 70ab9f47..eb7e1d3a 100644 --- a/python/dune/codegen/pdelab/localoperator.py +++ b/python/dune/codegen/pdelab/localoperator.py @@ -17,6 +17,7 @@ from dune.codegen.generation import (accumulation_mixin, constructor_parameter, domain, dump_accumulate_timer, + register_liwkid_timer, end_of_file, function_mangler, generator_factory, @@ -673,6 +674,19 @@ class TimerMethod(ClassMember): ClassMember.__init__(self, content) +class RegisterLikwidMethod(ClassMember): + def __init__(self): + knl = name_example_kernel() + assert(knl is not None) + + content = ["void register_likwid_timers()" + "{"] + register_liwkid_timers = [i for i in retrieve_cache_items(condition='register_likwid_timers')] + content.extend(map(lambda x: ' ' + x, register_liwkid_timers)) + content += ["}"] + ClassMember.__init__(self, content) + + class LoopyKernelMethod(ClassMember): def __init__(self, signature, kernel, add_timings=True, initializer_list=[]): from loopy import generate_body @@ -693,26 +707,49 @@ class LoopyKernelMethod(ClassMember): from dune.codegen.pdelab.signatures import assembler_routine_name timer_name = assembler_routine_name() + '_kernel' name_example_kernel(name=timer_name) - post_include('HP_DECLARE_TIMER({});'.format(timer_name), filetag='operatorfile') - content.append(' ' + 'HP_TIMER_START({});'.format(timer_name)) - dump_accumulate_timer(timer_name) - if add_timings and get_option("instrumentation_level") >= 4: - setuptimer = '{}_kernel_setup'.format(assembler_routine_name()) - post_include('HP_DECLARE_TIMER({});'.format(setuptimer), filetag='operatorfile') - content.append(' HP_TIMER_START({});'.format(setuptimer)) - dump_accumulate_timer(setuptimer) + if get_option('use_likwid'): + from dune.codegen.pdelab.driver.timings import init_likwid_timer + include_file("likwid.h", filetag="operatorfile") + init_likwid_timer(timer_name) + content.append(' ' + 'LIKWID_MARKER_START(\"{}\");'.format(timer_name)) + register_liwkid_timer(timer_name) + else: + post_include('HP_DECLARE_TIMER({});'.format(timer_name), filetag='operatorfile') + content.append(' ' + 'HP_TIMER_START({});'.format(timer_name)) + dump_accumulate_timer(timer_name) + + if add_timings and get_option("instrumentation_level") >= 4: + setuptimer = '{}_kernel_setup'.format(assembler_routine_name()) + if get_option('use_likwid'): + from dune.codegen.pdelab.driver.timings import init_likwid_timer + init_likwid_timer(setuptimer) + content.append(' ' + 'LIKWID_MARKER_START(\"{}\");'.format(setuptimer)) + register_liwkid_timer(setuptimer) + else: + post_include('HP_DECLARE_TIMER({});'.format(setuptimer), filetag='operatorfile') + content.append(' HP_TIMER_START({});'.format(setuptimer)) + dump_accumulate_timer(setuptimer) # Add kernel preamble for i, p in kernel.preambles: content.append(' ' + p) + if add_timings and get_option('instrumentation_level') >= 4: + if get_option('use_likwid'): + content.append(' ' + 'LIKWID_MARKER_STOP(\"{}\");'.format(setuptimer)) + else: + content.append(' ' + 'HP_TIMER_STOP({});'.format(setuptimer)) + # Add kernel body content.extend(l for l in generate_body(kernel).split('\n')[1:-1]) # Stop timer if add_timings and get_option('instrumentation_level') >= 3: - content.append(' ' + 'HP_TIMER_STOP({});'.format(timer_name)) + if get_option('use_likwid'): + content.append(' ' + 'LIKWID_MARKER_STOP(\"{}\");'.format(timer_name)) + else: + content.append(' ' + 'HP_TIMER_STOP({});'.format(timer_name)) content.append('}') ClassMember.__init__(self, content, name=kernel.name if kernel is not None else "") @@ -1141,7 +1178,10 @@ def generate_localoperator_file(kernels, filename): if get_option('instrumentation_level') >= 3: include_file('dune/codegen/common/timer.hh', filetag='operatorfile') - operator_methods.append(TimerMethod()) + if get_option('use_likwid'): + operator_methods.append(RegisterLikwidMethod()) + else: + operator_methods.append(TimerMethod()) elif get_option('opcounter'): include_file('dune/codegen/common/timer.hh', filetag='operatorfile') -- GitLab