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