diff --git a/dashboards/dashboard_fe2ti.py b/dashboards/dashboard_fe2ti.py index a53f9edd894565ab74b467ef4fdc5d3b379ffca0..577ca307be2aca21cb2c23a273bbbd0a0baf9168 100644 --- a/dashboards/dashboard_fe2ti.py +++ b/dashboards/dashboard_fe2ti.py @@ -13,6 +13,7 @@ from dashboards.influx_queries import (Query, join_variable_and, show_tag_values) from dashboards.legends import Units +from collections import namedtuple description_markdown = r""" @@ -31,76 +32,84 @@ description_markdown = r""" - Information about the different Hosts on the NHR@FAU [Testcluster](https://hpc.fau.de/systems-services/documentation-instructions/clusters/test-cluster/) """ +Filter = namedtuple("Filter", ("name", "multi", "default_value"), defaults=('', True, '')) +PanelInfos = namedtuple("PanelInfos", ("name", "unit")) + + +def get_dashboard_variable(filter: Filter, measurment_name: str, data_source: str): + query = show_tag_values(measurment_name, filter.name) + kwargs = {} + if filter.multi: + kwargs.update({'includeAll': True, 'multi': True, }) + if filter.default_value: + kwargs.update({'default': filter.default_value}) + return get_dashboard_variable_query(filter.name, query, data_source, **kwargs) + + +def get_time_series_panel(field: PanelInfos, + data_source: str, + measurment_name: str, + *, + where=None, + group_by=None, + overrides=None): + query = Query(select_=field.name, + from_=measurment_name, + where_=where, + group_by=group_by) + + return TimeSeries( + title=field.name, + dataSource=data_source, + targets=[get_influx_target(str(query))], + unit=field.unit, + pointSize=9, + overrides=overrides, + ) def dashboard_fe2ti(): data_source = "fe2ti" measurment_name = "fe2ti" row_repeat = "micro_problem_size" - other_filters = ["branch", - "benchmark_name", - "compiler", - "solver", - "mpi_ranks", - "omp_threads", - "ksp_tol"] - row_repeat_var = get_dashboard_variable_query( - row_repeat, show_tag_values(measurment_name, row_repeat), data_source, default='8') - - host_var = get_dashboard_variable_query( - 'host', show_tag_values(measurment_name, 'host'), - data_source, includeAll=False, multi=False, default='skylakesp2') - - other_vars = [get_dashboard_variable_query( - filter, show_tag_values(measurment_name, filter), data_source) - for filter in other_filters + other_filters = [ + Filter("micro_problem_size", True, '8'), + Filter("host", False, 'skylakesp2'), + Filter("branch"), + Filter("benchmark_name"), + Filter("compiler"), + Filter("solver"), + Filter("mpi_ranks"), + Filter("omp_threads"), + Filter("ksp_tol") ] - other_filters.append('host') - other_vars = [host_var, *other_vars] - - where = join_variable_and([row_repeat, *other_filters]) - fields = ["Time to solution", - "DP [MFLOP/s] STAT Sum", - "Operational intensity STAT Sum", - 'AVX DP [MFLOP/s] STAT Sum" / "DP [MFLOP/s] STAT Sum', - 'Memory bandwidth [MBytes/s] STAT Sum', - 'Memory write bandwidth [MBytes/s] STAT Sum', - 'Memory read bandwidth [MBytes/s] STAT Sum', - 'Memory data volume [GBytes] STAT Sum', - 'Memory read data volume [GBytes] STAT Sum', - 'Memory write data volume [GBytes] STAT Sum', - 'Energy [J] STAT Sum', - 'Power [W] STAT Sum', - 'Clock [MHz] STAT Avg',] - units = [Units.seconds, - Units.mflop_sec, - Units.flop_per_byte, - Units.percent, - Units.mbytes_per_second, - Units.mbytes_per_second, - Units.mbytes_per_second, - Units.gigabyte, - Units.gigabyte, - Units.gigabyte, - Units.joule, - Units.watt, - Units.megahertz, - ] - queries = [Query(select_=field, - from_=measurment_name, - where_=where, - group_by=[row_repeat, *other_filters] - ) - for field in fields - ] + + other_vars = [get_dashboard_variable(filter, measurment_name, data_source) for filter in other_filters] + row_repeat_var = other_vars[0] + + where = join_variable_and([f.name for f in other_filters]) + fields = [PanelInfos("Time to solution", Units.seconds), + PanelInfos("DP [MFLOP/s] STAT Sum", Units.mflop_sec), + PanelInfos("Operational intensity STAT Sum", Units.flop_per_byte), + PanelInfos('AVX DP [MFLOP/s] STAT Sum" / "DP [MFLOP/s] STAT Sum', Units.percent), + PanelInfos('Memory bandwidth [MBytes/s] STAT Sum', Units.mbytes_per_second), + PanelInfos('Memory write bandwidth [MBytes/s] STAT Sum', Units.mbytes_per_second), + PanelInfos('Memory read bandwidth [MBytes/s] STAT Sum', Units.mbytes_per_second), + PanelInfos('Memory data volume [GBytes] STAT Sum', Units.gigabyte), + PanelInfos('Memory read data volume [GBytes] STAT Sum', Units.gigabyte), + PanelInfos('Memory write data volume [GBytes] STAT Sum', Units.gigabyte), + PanelInfos('Energy [J] STAT Sum', Units.joule), + PanelInfos('Power [W] STAT Sum', Units.watt), + PanelInfos('Clock [MHz] STAT Avg', Units.megahertz), ] + options = DashboardOptions( title="FE2ti Benchmarks", description="Benchmarks for fe2ti", tags=['benchmark', 'fe2ti'], timezone="browser", ) - annotations = get_commit_annotation(data_source, "red", "commits", - measurment_name) + annotations = get_commit_annotation(data_source, "red", "commits", measurment_name) + overrides = [*[ get_color_regex_override(f".*[Ss]olver.*: {solver}.*", color) for solver, color in [("pardiso", "#56A64B"), ("umfpack", "#F2CC0C"), ("ilu", "#3274D9")] @@ -111,23 +120,22 @@ def dashboard_fe2ti(): description_panel = pack_in_row("Legend", get_text_panel(description_markdown, title="FE2TI benchmarks")) panels = [ - TimeSeries( - title=field, - dataSource=data_source, - targets=[get_influx_target(str(query))], - unit=unit, - pointSize=9, + get_time_series_panel( + field, + data_source, + measurment_name, + where=where, + group_by=[f.name for f in other_filters], overrides=overrides, ) - for field, query, unit in zip(fields, queries, units) - ] + for field in fields] + row = pack_in_row( title=f"{row_repeat}: ${row_repeat_var.name}", panels=[*panels], repeat=Repeat('v', row_repeat_var.name), - ) return build_dashboard(options, rows=[description_panel, row], - templating=[row_repeat_var, *other_vars], + templating=[*other_vars], annotations=annotations)