From 31e3f1218fc45216da8957c9140502890d0832d3 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Thu, 23 Sep 2021 10:41:53 +0200 Subject: [PATCH] Add nos-v scheduler subsystem events --- Makefile | 2 +- cfg/thread.cfg | 52 +++++++++++++--- emu.h | 28 +++++++++ emu_nosv.c | 5 ++ emu_nosv_ss.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ pcf.c | 14 +++++ prv.h | 1 + 7 files changed, 256 insertions(+), 8 deletions(-) create mode 100644 emu_nosv_ss.c diff --git a/Makefile b/Makefile index 16e01d0..6a601ee 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ dump: ovni.o dump.o parson.o test_speed: test_speed.c ovni.o parson.o -emu: emu.o emu_ovni.o emu_nosv.o ovni.o prv.o pcf.o parson.o +emu: emu.o emu_ovni.o emu_nosv.o emu_nosv_ss.o ovni.o prv.o pcf.o parson.o libovni.so: ovni.o parson.o $(LINK.c) -shared $^ -o $@ diff --git a/cfg/thread.cfg b/cfg/thread.cfg index 1b408b0..88cd0ef 100644 --- a/cfg/thread.cfg +++ b/cfg/thread.cfg @@ -1,6 +1,6 @@ #ParaverCFG ConfigFile.Version: 3.4 -ConfigFile.NumWindows: 2 +ConfigFile.NumWindows: 3 ################################################################################ @@ -12,7 +12,7 @@ window_id 1 window_position_x 960 window_position_y 24 window_width 954 -window_height 499 +window_height 323 window_comm_lines_enabled true window_flags_enabled true window_noncolor_mode true @@ -38,7 +38,7 @@ window_labels_to_draw 1 window_selected_functions { 14, { {cpu, Active Thd}, {appl, Adding}, {task, Adding}, {thread, Last Evt Val}, {node, Adding}, {system, Adding}, {workload, Adding}, {from_obj, All}, {to_obj, All}, {tag_msg, All}, {size_msg, All}, {bw_msg, All}, {evt_type, =}, {evt_value, All} } } window_compose_functions { 9, { {compose_cpu, As Is}, {compose_appl, As Is}, {compose_task, As Is}, {compose_thread, As Is}, {compose_node, As Is}, {compose_system, As Is}, {compose_workload, As Is}, {topcompose1, As Is}, {topcompose2, As Is} } } window_filter_module evt_type 1 60 -window_filter_module evt_type_label 1 "Unknown" +window_filter_module evt_type_label 1 "Thread: State" window_synchronize 1 ################################################################################ @@ -48,9 +48,9 @@ window_name Thread: TID window_type single window_id 2 window_position_x 960 -window_position_y 550 +window_position_y 374 window_width 954 -window_height 499 +window_height 324 window_comm_lines_enabled true window_flags_enabled true window_noncolor_mode true @@ -60,8 +60,8 @@ window_comm_fromto true window_comm_tagsize true window_comm_typeval true window_units Microseconds -window_maximum_y 426239.000000000000 -window_minimum_y 426112.000000000000 +window_maximum_y 638614.000000000000 +window_minimum_y 638608.000000000000 window_compute_y_max false window_level thread window_scale_relative 1.000000000000 @@ -79,3 +79,41 @@ window_filter_module evt_type 1 61 window_filter_module evt_type_label 1 "Unknown" window_synchronize 1 +################################################################################ +< NEW DISPLAYING WINDOW Thread: Subsystem > +################################################################################ +window_name Thread: Subsystem +window_type single +window_id 3 +window_position_x 960 +window_position_y 725 +window_width 954 +window_height 324 +window_comm_lines_enabled true +window_flags_enabled true +window_noncolor_mode true +window_logical_filtered true +window_physical_filtered false +window_comm_fromto true +window_comm_tagsize true +window_comm_typeval true +window_units Microseconds +window_maximum_y 3.000000000000 +window_minimum_y 1.000000000000 +window_compute_y_max false +window_level thread +window_scale_relative 1.000000000000 +window_end_time_relative 1.000000000000 +window_object appl { 1, { All } } +window_begin_time_relative 0.000000000000 +window_open true +window_drawmode draw_maximum +window_drawmode_rows draw_maximum +window_pixel_size 1 +window_labels_to_draw 1 +window_selected_functions { 14, { {cpu, Active Thd}, {appl, Adding}, {task, Adding}, {thread, Last Evt Val}, {node, Adding}, {system, Adding}, {workload, Adding}, {from_obj, All}, {to_obj, All}, {tag_msg, All}, {size_msg, All}, {bw_msg, All}, {evt_type, =}, {evt_value, All} } } +window_compose_functions { 9, { {compose_cpu, As Is}, {compose_appl, As Is}, {compose_task, As Is}, {compose_thread, As Is}, {compose_node, As Is}, {compose_system, As Is}, {compose_workload, As Is}, {topcompose1, As Is}, {topcompose2, As Is} } } +window_filter_module evt_type 1 62 +window_filter_module evt_type_label 1 "Unknown" +window_synchronize 1 + diff --git a/emu.h b/emu.h index a22f688..5362f28 100644 --- a/emu.h +++ b/emu.h @@ -31,6 +31,20 @@ enum nosv_task_state { TASK_ST_DEAD, }; +enum nosv_thread_ss_state { + ST_NULL = 0, + ST_SCHED_HUNGRY = 6, + ST_SCHED_SERVING = 7, + ST_SCHED_SUBMITTING = 8, +}; + +enum nosv_thread_ss_event { + EV_NULL = 0, + EV_SCHED_RECV = 11, + EV_SCHED_SEND = 12, + EV_SCHED_SELF = 13, +}; + struct ovni_ethread; struct ovni_eproc; @@ -48,6 +62,8 @@ struct nosv_task_type { UT_hash_handle hh; }; +#define MAX_SS_STACK 128 + /* State of each emulated thread */ struct ovni_ethread { /* Emulated thread tid */ @@ -70,6 +86,14 @@ struct ovni_ethread { /* Current cpu */ struct ovni_cpu *cpu; + /* Number of subsystem states in the stack */ + int nss; + + /* Stack of subsystem states */ + int ss[MAX_SS_STACK]; + + int ss_event; + /* FIXME: Use a table with registrable pointers to custom data * structures */ @@ -219,6 +243,10 @@ void hook_pre_nosv(struct ovni_emu *emu); void hook_emit_nosv(struct ovni_emu *emu); void hook_post_nosv(struct ovni_emu *emu); +void hook_pre_nosv_ss(struct ovni_emu *emu); +void hook_emit_nosv_ss(struct ovni_emu *emu); +void hook_post_nosv_ss(struct ovni_emu *emu); + struct ovni_cpu *emu_get_cpu(struct ovni_loom *loom, int cpuid); struct ovni_ethread *emu_get_thread(struct ovni_eproc *proc, int tid); diff --git a/emu_nosv.c b/emu_nosv.c index 8bb6815..13a7fd2 100644 --- a/emu_nosv.c +++ b/emu_nosv.c @@ -221,6 +221,7 @@ pre_type(struct ovni_emu *emu) } } + void hook_pre_nosv(struct ovni_emu *emu) { @@ -231,6 +232,8 @@ hook_pre_nosv(struct ovni_emu *emu) default: break; } + + hook_pre_nosv_ss(emu); } /* --------------------------- emit ------------------------------- */ @@ -283,6 +286,8 @@ hook_emit_nosv(struct ovni_emu *emu) default: break; } + + hook_emit_nosv_ss(emu); } struct hook_entry pre_hooks[] = { diff --git a/emu_nosv_ss.c b/emu_nosv_ss.c new file mode 100644 index 0000000..e91256c --- /dev/null +++ b/emu_nosv_ss.c @@ -0,0 +1,162 @@ +#include +#include "uthash.h" + +#include "ovni.h" +#include "ovni_trace.h" +#include "emu.h" +#include "prv.h" + +/* This module manages the nos-v subsystem (ss) events, to track which + * actions are being performed by each thread at a given time. A stack + * of states is stored in each thread, so we remember the path of + * execution. Events such as task received by a thread are emitted as + * fake events with very short period. */ + + +/* --------------------------- ss helpers ------------------------------- */ + +static void +ss_init(struct ovni_ethread *t) +{ + t->nss = 0; +} + +static void +ss_push(struct ovni_ethread *t, int st) +{ + if(t->nss >= MAX_SS_STACK) + { + err("thread %d subsystem stack full\n", t->tid); + exit(EXIT_FAILURE); + } + + t->ss[t->nss] = st; + t->nss++; +} + +static int +ss_pop(struct ovni_ethread *t) +{ + int st; + + if(t->nss <= 0) + { + err("thread %d subsystem stack empty\n", t->tid); + exit(EXIT_FAILURE); + } + + st = t->ss[t->nss - 1]; + t->nss--; + + return st; +} + +static void +ss_ev(struct ovni_ethread *th, int ev) +{ + th->ss_event = ev; +} + +/* --------------------------- pre ------------------------------- */ + +static void +pre_sched(struct ovni_emu *emu) +{ + struct ovni_ethread *th; + + th = emu->cur_thread; + switch(emu->cur_ev->header.value) + { + case 'h': + ss_push(th, ST_SCHED_HUNGRY); + break; + case 'f': /* Fill: no longer hungry */ + ss_pop(th); + break; + case '[': /* Server enter */ + ss_push(th, ST_SCHED_SERVING); + break; + case ']': /* Server exit */ + ss_pop(th); + break; + case '@': ss_ev(th, EV_SCHED_SELF); break; + case 'r': ss_ev(th, EV_SCHED_RECV); break; + case 's': ss_ev(th, EV_SCHED_SEND); break; + default: + break; + } +} + +static void +pre_submit(struct ovni_emu *emu) +{ + struct ovni_ethread *th; + + th = emu->cur_thread; + switch(emu->cur_ev->header.value) + { + case '[': ss_push(th, ST_SCHED_SUBMITTING); break; + case ']': ss_pop(th); break; + default: + break; + } +} + +void +hook_pre_nosv_ss(struct ovni_emu *emu) +{ + switch(emu->cur_ev->header.class) + { + case 'S': pre_sched(emu); break; + case 'U': pre_submit(emu); break; + default: + break; + } +} + +/* --------------------------- emit ------------------------------- */ + +static void +emit_thread_state(struct ovni_emu *emu, struct ovni_ethread *th, + int type, int st) +{ + int row; + + row = th->gindex + 1; + + prv_ev_thread(emu, row, type, st); +} + +void +hook_emit_nosv_ss(struct ovni_emu *emu) +{ + struct ovni_ethread *th; + + th = emu->cur_thread; + +// /* Only emit a state if needed */ +// if(th->ss_event != EV_NULL) +// { +// emit_thread_state(emu, th, PTT_SUBSYSTEM, +// th->ss_event); +// } +// else + + if(th->nss > 0) + { + emit_thread_state(emu, th, PTT_SUBSYSTEM, + th->ss[th->nss - 1]); + } + else + { + emit_thread_state(emu, th, PTT_SUBSYSTEM, ST_NULL); + } +} + +/* --------------------------- post ------------------------------- */ + +void +hook_post_nosv_ss(struct ovni_emu *emu) +{ + emu->cur_thread->ss_event = EV_NULL; +} diff --git a/pcf.c b/pcf.c index 02774a5..21d0512 100644 --- a/pcf.c +++ b/pcf.c @@ -114,6 +114,19 @@ struct event_type thread_tid = { thread_tid_values }; +struct event_value thread_ss_values[] = { + { ST_NULL, "NULL" }, + { ST_SCHED_HUNGRY, "Scheduler: Hungry" }, + { ST_SCHED_SERVING, "Scheduler: Serving" }, + { ST_SCHED_SUBMITTING, "Scheduler: Submitting" }, + { -1, NULL }, +}; + +struct event_type thread_ss = { + 0, PTT_SUBSYSTEM, "Thread: Subsystem", + thread_ss_values +}; + static void decompose_rgb(uint32_t col, uint8_t *r, uint8_t *g, uint8_t *b) { @@ -176,6 +189,7 @@ write_events(FILE *f) { write_event_type(f, &thread_state); write_event_type(f, &thread_tid); + write_event_type(f, &thread_ss); } int diff --git a/prv.h b/prv.h index 16e622e..a64ae26 100644 --- a/prv.h +++ b/prv.h @@ -18,6 +18,7 @@ enum prv_type { /* Rows are threads */ PTT_THREAD_STATE = 60, PTT_THREAD_TID = 61, + PTT_SUBSYSTEM = 62, };