Skip to content
Snippets Groups Projects
Commit fbb1a298 authored by Marcel Koch's avatar Marcel Koch
Browse files

enable sde for instrumentation level >= 3

parent 1858ff16
No related branches found
No related tags found
No related merge requests found
...@@ -24,6 +24,7 @@ from dune.codegen.generation.cpp import (base_class, ...@@ -24,6 +24,7 @@ from dune.codegen.generation.cpp import (base_class,
preamble, preamble,
post_include, post_include,
template_parameter, template_parameter,
dump_ssc_marks
) )
from dune.codegen.generation.hooks import (hook, from dune.codegen.generation.hooks import (hook,
......
...@@ -55,3 +55,10 @@ def dump_accumulate_timer(name): ...@@ -55,3 +55,10 @@ def dump_accumulate_timer(name):
@generator_factory(item_tags=("register_likwid_timers",)) @generator_factory(item_tags=("register_likwid_timers",))
def register_liwkid_timer(name): def register_liwkid_timer(name):
return "LIKWID_MARKER_REGISTER(\"{}\");".format(name) return "LIKWID_MARKER_REGISTER(\"{}\");".format(name)
@generator_factory(item_tags=("register_ssc_marks",))
def dump_ssc_marks(name):
from dune.codegen.pdelab.driver.timings import get_region_marks
return 'std::cout << "{}: " << {} << " <--> " << {} << std::endl;'.format(name,
*get_region_marks(name, driver=False))
...@@ -128,6 +128,12 @@ def local_operator_likwid(): ...@@ -128,6 +128,12 @@ def local_operator_likwid():
return "{}.register_likwid_timers();".format(lop_name) return "{}.register_likwid_timers();".format(lop_name)
@preamble(section="timings")
def local_operator_ssc_marks():
lop_name = name_localoperator(get_form_ident())
return "{}.dump_ssc_marks();".format(lop_name)
@cached @cached
def setup_timer(): def setup_timer():
# TODO check that we are using YASP? # TODO check that we are using YASP?
...@@ -145,6 +151,8 @@ def setup_timer(): ...@@ -145,6 +151,8 @@ def setup_timer():
post_include('#define __SSC_MARK(x) do{ __asm__ volatile' + post_include('#define __SSC_MARK(x) do{ __asm__ volatile' +
'("movl $" #x ", %%ebx\\n\\t.byte 100\\n\\t.byte 103\\n\\t.byte 144" : : : "%ebx"); } while(0)', '("movl $" #x ", %%ebx\\n\\t.byte 100\\n\\t.byte 103\\n\\t.byte 144" : : : "%ebx"); } while(0)',
filetag='driver') filetag='driver')
if get_option('instrumentation_level') >= 3:
local_operator_ssc_marks()
else: else:
from dune.codegen.loopy.target import type_floatingpoint from dune.codegen.loopy.target import type_floatingpoint
pre_include("#define HP_TIMER_OPCOUNTER {}".format(type_floatingpoint()), filetag="driver") pre_include("#define HP_TIMER_OPCOUNTER {}".format(type_floatingpoint()), filetag="driver")
...@@ -170,15 +178,18 @@ def init_region_timer(region): ...@@ -170,15 +178,18 @@ def init_region_timer(region):
post_include("HP_DECLARE_TIMER({});".format(region), filetag="driver") post_include("HP_DECLARE_TIMER({});".format(region), filetag="driver")
def get_region_marks(region): def get_region_marks(region, driver):
return _sde_marks.setdefault(region, (2 * (len(_sde_marks) + 1), 2 * (len(_sde_marks) + 1) + 1)) if driver:
return _sde_marks.setdefault(region, (2 * (len(_sde_marks) + 1) * 11, (2 * (len(_sde_marks) + 1) + 1) * 11))
else:
return _sde_marks.setdefault(region, (2 * (len(_sde_marks) + 1) * 1, (2 * (len(_sde_marks) + 1) + 1) * 1))
def start_region_timer(region): def start_region_timer(region):
if get_option("use_likwid"): if get_option("use_likwid"):
return ["LIKWID_MARKER_START(\"{}\");".format(region)] return ["LIKWID_MARKER_START(\"{}\");".format(region)]
elif get_option("use_sde"): elif get_option("use_sde"):
marks = get_region_marks(region) marks = get_region_marks(region, driver=True)
return ["__SSC_MARK(0x{});".format(marks[0])] return ["__SSC_MARK(0x{});".format(marks[0])]
else: else:
return ["HP_TIMER_START({});".format(region)] return ["HP_TIMER_START({});".format(region)]
...@@ -188,7 +199,7 @@ def stop_region_timer(region): ...@@ -188,7 +199,7 @@ def stop_region_timer(region):
if get_option("use_likwid"): if get_option("use_likwid"):
return ["LIKWID_MARKER_STOP(\"{}\");".format(region)] return ["LIKWID_MARKER_STOP(\"{}\");".format(region)]
elif get_option("use_sde"): elif get_option("use_sde"):
marks = get_region_marks(region) marks = get_region_marks(region, driver=True)
return ["__SSC_MARK(0x{});".format(marks[1]), return ["__SSC_MARK(0x{});".format(marks[1]),
"std::cout << \"Timed region {}: {} <--> {}\" << std::endl;".format(region, *marks)] "std::cout << \"Timed region {}: {} <--> {}\" << std::endl;".format(region, *marks)]
else: else:
......
...@@ -32,6 +32,7 @@ from dune.codegen.generation import (accumulation_mixin, ...@@ -32,6 +32,7 @@ from dune.codegen.generation import (accumulation_mixin,
ReturnArg, ReturnArg,
run_hook, run_hook,
template_parameter, template_parameter,
dump_ssc_marks
) )
from dune.codegen.cgen.clazz import (AccessModifier, from dune.codegen.cgen.clazz import (AccessModifier,
BaseClass, BaseClass,
...@@ -687,6 +688,19 @@ class RegisterLikwidMethod(ClassMember): ...@@ -687,6 +688,19 @@ class RegisterLikwidMethod(ClassMember):
ClassMember.__init__(self, content) ClassMember.__init__(self, content)
class RegisterSSCMarksMethod(ClassMember):
def __init__(self):
knl = name_example_kernel()
assert(knl is not None)
content = ["void dump_ssc_marks()"
"{"]
register_liwkid_timers = [i for i in retrieve_cache_items(condition='register_ssc_marks')]
content.extend(map(lambda x: ' ' + x, register_liwkid_timers))
content += ["}"]
ClassMember.__init__(self, content)
class LoopyKernelMethod(ClassMember): class LoopyKernelMethod(ClassMember):
def __init__(self, signature, kernel, add_timings=True, initializer_list=[]): def __init__(self, signature, kernel, add_timings=True, initializer_list=[]):
from loopy import generate_body from loopy import generate_body
...@@ -714,6 +728,14 @@ class LoopyKernelMethod(ClassMember): ...@@ -714,6 +728,14 @@ class LoopyKernelMethod(ClassMember):
init_likwid_timer(timer_name) init_likwid_timer(timer_name)
content.append(' ' + 'LIKWID_MARKER_START(\"{}\");'.format(timer_name)) content.append(' ' + 'LIKWID_MARKER_START(\"{}\");'.format(timer_name))
register_liwkid_timer(timer_name) register_liwkid_timer(timer_name)
elif get_option('use_sde'):
post_include('#define __SSC_MARK(x) do{ __asm__ volatile' +
'("movl $" #x ", %%ebx\\n\\t.byte 100\\n\\t.byte 103\\n\\t.byte 144" : : : "%ebx"); } while(0)',
filetag='operatorfile')
from dune.codegen.pdelab.driver.timings import get_region_marks
marks = get_region_marks(timer_name, driver=False)
content.append(' ' + '__SSC_MARK(0x{});'.format(marks[0]))
dump_ssc_marks(timer_name)
else: else:
post_include('HP_DECLARE_TIMER({});'.format(timer_name), filetag='operatorfile') post_include('HP_DECLARE_TIMER({});'.format(timer_name), filetag='operatorfile')
content.append(' ' + 'HP_TIMER_START({});'.format(timer_name)) content.append(' ' + 'HP_TIMER_START({});'.format(timer_name))
...@@ -726,6 +748,11 @@ class LoopyKernelMethod(ClassMember): ...@@ -726,6 +748,11 @@ class LoopyKernelMethod(ClassMember):
init_likwid_timer(setuptimer) init_likwid_timer(setuptimer)
content.append(' ' + 'LIKWID_MARKER_START(\"{}\");'.format(setuptimer)) content.append(' ' + 'LIKWID_MARKER_START(\"{}\");'.format(setuptimer))
register_liwkid_timer(setuptimer) register_liwkid_timer(setuptimer)
elif get_option('use_sde'):
from dune.codegen.pdelab.driver.timings import get_region_marks
setup_marks = get_region_marks(setuptimer, driver=False)
content.append(' ' + '__SSC_MARK(0x{});'.format(setup_marks[0]))
dump_ssc_marks(setuptimer)
else: else:
post_include('HP_DECLARE_TIMER({});'.format(setuptimer), filetag='operatorfile') post_include('HP_DECLARE_TIMER({});'.format(setuptimer), filetag='operatorfile')
content.append(' HP_TIMER_START({});'.format(setuptimer)) content.append(' HP_TIMER_START({});'.format(setuptimer))
...@@ -738,6 +765,8 @@ class LoopyKernelMethod(ClassMember): ...@@ -738,6 +765,8 @@ class LoopyKernelMethod(ClassMember):
if add_timings and get_option('instrumentation_level') >= 4: if add_timings and get_option('instrumentation_level') >= 4:
if get_option('use_likwid'): if get_option('use_likwid'):
content.append(' ' + 'LIKWID_MARKER_STOP(\"{}\");'.format(setuptimer)) content.append(' ' + 'LIKWID_MARKER_STOP(\"{}\");'.format(setuptimer))
elif get_option('use_sde'):
content.append(' ' + '__SSC_MARK(0x{});'.format(setup_marks[1]))
else: else:
content.append(' ' + 'HP_TIMER_STOP({});'.format(setuptimer)) content.append(' ' + 'HP_TIMER_STOP({});'.format(setuptimer))
...@@ -748,6 +777,8 @@ class LoopyKernelMethod(ClassMember): ...@@ -748,6 +777,8 @@ class LoopyKernelMethod(ClassMember):
if add_timings and get_option('instrumentation_level') >= 3: if add_timings and get_option('instrumentation_level') >= 3:
if get_option('use_likwid'): if get_option('use_likwid'):
content.append(' ' + 'LIKWID_MARKER_STOP(\"{}\");'.format(timer_name)) content.append(' ' + 'LIKWID_MARKER_STOP(\"{}\");'.format(timer_name))
elif get_option('use_sde'):
content.append(' ' + '__SSC_MARK(0x{});'.format(marks[1]))
else: else:
content.append(' ' + 'HP_TIMER_STOP({});'.format(timer_name)) content.append(' ' + 'HP_TIMER_STOP({});'.format(timer_name))
...@@ -1180,6 +1211,8 @@ def generate_localoperator_file(kernels, filename): ...@@ -1180,6 +1211,8 @@ def generate_localoperator_file(kernels, filename):
include_file('dune/codegen/common/timer.hh', filetag='operatorfile') include_file('dune/codegen/common/timer.hh', filetag='operatorfile')
if get_option('use_likwid'): if get_option('use_likwid'):
operator_methods.append(RegisterLikwidMethod()) operator_methods.append(RegisterLikwidMethod())
elif get_option('use_sde'):
operator_methods.append(RegisterSSCMarksMethod())
else: else:
operator_methods.append(TimerMethod()) operator_methods.append(TimerMethod())
elif get_option('opcounter'): elif get_option('opcounter'):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment