diff --git a/dashboards/dashboard_walberla.py b/dashboards/dashboard_walberla.py
index cc9b19bc4be7d988354e3638fa07f426a1bdc3aa..fe2f3aead01d039173b5c86ca39eeebeb6b2f6a2 100644
--- a/dashboards/dashboard_walberla.py
+++ b/dashboards/dashboard_walberla.py
@@ -11,6 +11,19 @@ from dashboards.variables import get_dashboard_variable, Filter
 from dashboards.influx_queries import join_variable_and
 from dashboards.legends import Units
 
+from cbutil.ncu_keys import (
+    memory_write_data_key,
+    memory_read_data_key,
+    memory_data_key,
+    memory_write_bandwidth_key,
+    memory_read_bandwidth_key,
+    memory_bandwidth_key,
+    runtime_key,
+    operational_intensity_key,
+    p_max_key,
+    dp_key,
+)
+
 
 def dashboard_uniformgridcpu():
     data_source = 'InfluxDB-1'
@@ -153,3 +166,84 @@ def dashboard_uniformgridgpu():
                            rows=[row],
                            templating=[*filter_vars],
                            annotations=annotations)
+
+
+def dashboard_uniformgridgpu_profile():
+    data_source = 'InfluxDB-1'
+    arch = 'GPU'
+    measurment_name = f'UniformGrid{arch}_profile'
+    row_repeat = "host"
+
+    options = DashboardOptions(
+        title=f'Uniform Grid {arch} GPU Profiling',
+        description=f"Benchmark dashboard for the Uniform Grid {arch} Benchmark from walberla",
+        tags=[arch, 'benchmark', 'walberla', 'Uniform Grid', 'profiling'],
+        timezone="browser",
+    )
+
+    filters = [
+        Filter("project_id", multi=True, default_value='walberla/walberla'),
+        Filter("branch", multi=True, default_value='master'),
+        Filter("host", multi=False, default_value='medusa'),
+        Filter("GPU"),
+        Filter("collisionSetup"),
+        Filter("mpi_num_processes"),
+        Filter("streamingPattern"),
+        Filter("timeStepStrategy"),
+        Filter("stencil"),
+        Filter("blocks_0"),
+        Filter("blocks_1"),
+        Filter("blocks_2"),
+        Filter("cellsPerBlock_0"),
+        Filter("cellsPerBlock_1"),
+        Filter("cellsPerBlock_2"),
+        Filter("gpuBlockSize_0"),
+        Filter("gpuBlockSize_1"),
+        Filter("gpuBlockSize_2"),
+        Filter("periodic_0"),
+        Filter("periodic_1"),
+        Filter("periodic_2"),
+    ]
+
+    fields = [
+        PanelInfos("mlupsPerProcess", Units.number),
+        PanelInfos("Runtime (RDTSC) [s]", Units.seconds),
+        PanelInfos("DP [MFLOP/s]", Units.mflop_sec),
+        PanelInfos("Operational intensity", Units.flop_per_byte),
+        PanelInfos('AVX DP [MFLOP/s]" / "DP [MFLOP/s]', Units.percent),
+        PanelInfos('Memory bandwidth [MBytes/s]', Units.mbytes_per_second),
+        PanelInfos('Memory write bandwidth [MBytes/s]', Units.mbytes_per_second),
+        PanelInfos('Memory read bandwidth [MBytes/s]', Units.mbytes_per_second),
+        PanelInfos('Memory data volume [GBytes]', Units.gigabyte),
+        PanelInfos('Memory read data volume [GBytes]', Units.gigabyte),
+        PanelInfos('Memory write data volume [GBytes]', Units.gigabyte),
+        PanelInfos('Energy [J]', Units.joule),
+        PanelInfos('Power [W]', Units.watt),
+        PanelInfos('Clock [MHz] STAT Avg', Units.megahertz), ]
+
+    filter_vars = [get_dashboard_variable(filter, measurment_name, data_source) for filter in filters]
+
+    row_repeat_var = [fv for fv in filter_vars if fv.name == row_repeat][0]
+
+    where = join_variable_and([f.name for f in filters])
+    annotations = get_commit_annotation(data_source, "red", "commits", measurment_name)
+
+    panels = [
+        get_time_series_panel(
+            field,
+            data_source,
+            measurment_name,
+            where=where,
+            group_by=[f.name for f in filters],
+        )
+        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=[row],
+                           templating=[*filter_vars],
+                           annotations=annotations)
diff --git a/dashboards/deploy.py b/dashboards/deploy.py
index ab55de7f8751dee5996db421321922c63591a738..3f48831047608bac9e319d605443112c1905548b 100644
--- a/dashboards/deploy.py
+++ b/dashboards/deploy.py
@@ -5,7 +5,7 @@ import dashboards.dashboard_list as boards
 from dashboards.upload import upload_dashboard
 from dashboards.dashboard_fe2ti import dashboard_fe2ti
 from dashboard_pystencils import dashboard_pystencils_cpu, dashboard_pystencils_gpu
-from dashboard_walberla import dashboard_uniformgridcpu, dashboard_uniformgridgpu
+from dashboard_walberla import dashboard_uniformgridcpu, dashboard_uniformgridgpu, dashboard_uniformgridgpu_profile
 
 logger = logging.getLogger(__file__)
 logger.setLevel(logging.INFO)
@@ -44,6 +44,7 @@ def main():
         elif "walberla" in board_name:
             upload_dashboard(dashboard_uniformgridcpu(), folder=walberla_folder)
             upload_dashboard(dashboard_uniformgridgpu(), folder=walberla_folder)
+            upload_dashboard(dashboard_uniformgridgpu_profile(), folder=walberla_folder)
         else:
             board = getattr(boards, board_name)
             upload_dashboard(board(), folder=walberla_folder)