diff --git a/emu.h b/emu.h index 1bb6779..0ba55b8 100644 --- a/emu.h +++ b/emu.h @@ -103,31 +103,32 @@ enum nodes_state { /* The values of nanos6_ss_state are synced to the previous * CTF implementation. */ enum nanos6_ss_state { - ST_NANOS6_NULL = 0, /* IDLE */ - ST_NANOS6_TASK_BODY = 3, /* TASK */ - ST_NANOS6_TASK_CREATING = 8, /* TASK_CREATE */ - ST_NANOS6_TASK_SUBMIT = 10, /* TASK_SUBMIT */ - ST_NANOS6_TASK_SPAWNING = 18, /* SPAWN_FUNCTION */ - ST_NANOS6_SCHED_HUNGRY = 2, /* BUSY_WAIT */ - ST_NANOS6_SCHED_ADDING = 6, /* SCHEDULER_ADD_TASK */ - ST_NANOS6_SCHED_SERVING = 20, /* SCHEDULER_LOCK_SERVING */ - ST_NANOS6_DEP_REG = 4, /* DEPENDENCY_REGISTER */ - ST_NANOS6_DEP_UNREG = 5, /* DEPENDENCY_UNREGISTER */ - ST_NANOS6_BLK_TASKWAIT = 12, /* TASK_WAIT */ - ST_NANOS6_BLK_WAITFOR = 13, /* WAIT_FOR */ - ST_NANOS6_BLK_BLOCKING = 16, /* BLOCKING_API_BLOCK */ - ST_NANOS6_BLK_UNBLOCKING = 17, /* BLOCKING_API_UNBLOCK */ + ST_NANOS6_TASK_BODY = 1, + ST_NANOS6_TASK_CREATING, + ST_NANOS6_TASK_SUBMIT, + ST_NANOS6_TASK_SPAWNING, + ST_NANOS6_SCHED_ADDING, + ST_NANOS6_SCHED_SERVING, + ST_NANOS6_DEP_REG, + ST_NANOS6_DEP_UNREG, + ST_NANOS6_BLK_TASKWAIT, + ST_NANOS6_BLK_WAITFOR, + ST_NANOS6_BLK_BLOCKING, + ST_NANOS6_BLK_UNBLOCKING, + ST_NANOS6_HANDLING_TASK, + ST_NANOS6_WORKER_LOOP, - EV_NANOS6_SCHED_RECV = 50, - EV_NANOS6_SCHED_SEND = 51, - EV_NANOS6_SCHED_SELF = 52, + /* Value 51 is broken in old Paraver */ + EV_NANOS6_SCHED_RECV = 60, + EV_NANOS6_SCHED_SEND = 61, + EV_NANOS6_SCHED_SELF = 62, }; -enum nanos6_thread_state { - ST_NANOS6_TH_EXTERNAL = 1, - ST_NANOS6_TH_WORKER, - ST_NANOS6_TH_LEADER, - ST_NANOS6_TH_MAIN +enum nanos6_thread_type { + ST_NANOS6_TH_LEADER = 1, + ST_NANOS6_TH_MAIN = 2, + ST_NANOS6_TH_WORKER = 3, + ST_NANOS6_TH_EXTERNAL = 4, }; enum kernel_cs_state { diff --git a/emu_nanos6.c b/emu_nanos6.c index 31931b7..4375040 100644 --- a/emu_nanos6.c +++ b/emu_nanos6.c @@ -50,7 +50,7 @@ hook_init_nanos6(struct ovni_emu *emu) chan_th_init(th, uth, CHAN_NANOS6_TYPE, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_th, clock); chan_th_init(th, uth, CHAN_NANOS6_SUBSYSTEM, CHAN_TRACK_TH_ACTIVE, 0, 0, 1, row, prv_th, clock); chan_th_init(th, uth, CHAN_NANOS6_RANK, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_th, clock); - chan_th_init(th, uth, CHAN_NANOS6_THREAD, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_th, clock); + chan_th_init(th, uth, CHAN_NANOS6_THREAD, CHAN_TRACK_NONE, 0, 1, 1, row, prv_th, clock); } /* Init the Nanos6 channels in all cpus */ @@ -292,7 +292,7 @@ pre_task(struct ovni_emu *emu) update_task(emu); break; default: - die("unexpected event value %c\n", + die("unexpected Nanos6 task event value %c\n", emu->cur_ev->header.value); } } @@ -360,6 +360,26 @@ pre_blocking(struct ovni_emu *emu) } } +static void +pre_worker(struct ovni_emu *emu) +{ + struct ovni_ethread *th; + struct ovni_chan *chan_th; + + th = emu->cur_thread; + chan_th = &th->chan[CHAN_NANOS6_SUBSYSTEM]; + + switch(emu->cur_ev->header.value) + { + case '[': chan_push(chan_th, ST_NANOS6_WORKER_LOOP); break; + case ']': chan_pop (chan_th, ST_NANOS6_WORKER_LOOP); break; + case 't': chan_push(chan_th, ST_NANOS6_HANDLING_TASK); break; + case 'T': chan_pop (chan_th, ST_NANOS6_HANDLING_TASK); break; + default: break; + } +} + + static void pre_sched(struct ovni_emu *emu) { @@ -371,14 +391,16 @@ pre_sched(struct ovni_emu *emu) switch(emu->cur_ev->header.value) { - case 'h': chan_push(chan_th, ST_NANOS6_SCHED_HUNGRY); break; - case 'f': chan_pop(chan_th, ST_NANOS6_SCHED_HUNGRY); break; case '[': chan_push(chan_th, ST_NANOS6_SCHED_SERVING); break; - case ']': chan_pop(chan_th, ST_NANOS6_SCHED_SERVING); break; - case '@': chan_ev(chan_th, EV_NANOS6_SCHED_SELF); break; - case 'r': chan_ev(chan_th, EV_NANOS6_SCHED_RECV); break; - case 's': chan_ev(chan_th, EV_NANOS6_SCHED_SEND); break; - default: break; + case ']': chan_pop (chan_th, ST_NANOS6_SCHED_SERVING); break; + case 'a': chan_push(chan_th, ST_NANOS6_SCHED_ADDING); break; + case 'A': chan_pop (chan_th, ST_NANOS6_SCHED_ADDING); break; + case '@': chan_ev (chan_th, EV_NANOS6_SCHED_SELF); break; + case 'r': chan_ev (chan_th, EV_NANOS6_SCHED_RECV); break; + case 's': chan_ev (chan_th, EV_NANOS6_SCHED_SEND); break; + default: + die("unknown Nanos6 scheduler event %c\n", + emu->cur_ev->header.value); } } @@ -421,9 +443,8 @@ pre_ss(struct ovni_emu *emu, int st) case '[': chan_push(chan_th, st); break; case ']': chan_pop(chan_th, st); break; default: - err("unexpected value '%c' (expecting '[' or ']')\n", + die("unexpected value '%c' (expecting '[' or ']')\n", emu->cur_ev->header.value); - abort(); } } @@ -438,8 +459,9 @@ check_affinity(struct ovni_emu *emu) if(cpu->nrunning_threads > 1) { - die("cpu %s has more than one thread running\n", - cpu->name); + err("cpu %s has more than one thread running\n", cpu->name); + if(emu->enable_linter) + abort(); } } @@ -460,11 +482,14 @@ hook_pre_nanos6(struct ovni_emu *emu) case 'Y': pre_type(emu); break; case 'S': pre_sched(emu); break; case 'U': pre_ss(emu, ST_NANOS6_TASK_SUBMIT); break; + case 'F': pre_ss(emu, ST_NANOS6_TASK_SPAWNING); break; case 'H': pre_thread(emu); break; case 'D': pre_deps(emu); break; case 'B': pre_blocking(emu); break; + case 'W': pre_worker(emu); break; default: - break; + die("unknown Nanos6 event category %c\n", + emu->cur_ev->header.category); } check_affinity(emu); diff --git a/pcf.c b/pcf.c index 5ed71da..b7bd996 100644 --- a/pcf.c +++ b/pcf.c @@ -179,7 +179,6 @@ struct pcf_value_label nanos6_ss_values[] = { { ST_NANOS6_TASK_CREATING, "Task: Creating" }, { ST_NANOS6_TASK_SUBMIT, "Task: Submitting" }, { ST_NANOS6_TASK_SPAWNING, "Task: Spawning function" }, - { ST_NANOS6_SCHED_HUNGRY, "Scheduler: Waiting for ready tasks" }, { ST_NANOS6_SCHED_SERVING, "Scheduler: Serving tasks" }, { ST_NANOS6_SCHED_ADDING, "Scheduler: Adding ready tasks" }, { ST_NANOS6_DEP_REG, "Dependency: Registering" }, @@ -188,12 +187,24 @@ struct pcf_value_label nanos6_ss_values[] = { { ST_NANOS6_BLK_BLOCKING, "Blocking: Blocking current task" }, { ST_NANOS6_BLK_UNBLOCKING, "Blocking: Unblocking remote task" }, { ST_NANOS6_BLK_WAITFOR, "Blocking: Wait For" }, + { ST_NANOS6_HANDLING_TASK, "Worker: Handling task" }, + { ST_NANOS6_WORKER_LOOP, "Worker: Looking for work" }, { EV_NANOS6_SCHED_SEND, "EV Scheduler: Send task" }, { EV_NANOS6_SCHED_RECV, "EV Scheduler: Recv task" }, { EV_NANOS6_SCHED_SELF, "EV Scheduler: Self-assign task" }, { -1, NULL }, }; +struct pcf_value_label nanos6_thread_type[] = { + { ST_NULL, "No type" }, + { ST_TOO_MANY_TH, "Unknown: multiple threads running" }, + { ST_NANOS6_TH_EXTERNAL, "External" }, + { ST_NANOS6_TH_WORKER, "Worker" }, + { ST_NANOS6_TH_LEADER, "Leader" }, + { ST_NANOS6_TH_MAIN, "Main" }, + { -1, NULL }, +}; + struct pcf_value_label (*pcf_chan_value_labels[CHAN_MAX])[] = { [CHAN_OVNI_PID] = &default_values, [CHAN_OVNI_TID] = &default_values, @@ -217,6 +228,7 @@ struct pcf_value_label (*pcf_chan_value_labels[CHAN_MAX])[] = { [CHAN_NANOS6_TYPE] = &default_values, [CHAN_NANOS6_SUBSYSTEM] = &nanos6_ss_values, [CHAN_NANOS6_RANK] = &default_values, + [CHAN_NANOS6_THREAD] = &nanos6_thread_type, [CHAN_KERNEL_CS] = &kernel_cs_values, }; @@ -246,6 +258,7 @@ char *pcf_chan_name[CHAN_MAX] = { [CHAN_NANOS6_TYPE] = "Nanos6 task type", [CHAN_NANOS6_SUBSYSTEM] = "Nanos6 subsystem", [CHAN_NANOS6_RANK] = "Nanos6 task MPI rank", + [CHAN_NANOS6_THREAD] = "Nanos6 thread type", [CHAN_KERNEL_CS] = "Context switches", }; @@ -283,8 +296,9 @@ int pcf_chan_suffix[CHAN_MAX][CHAN_MAXTYPE] = { [CHAN_NANOS6_TYPE] = { RUN_TH, RUN_TH }, [CHAN_NANOS6_SUBSYSTEM] = { ACT_TH, RUN_TH }, [CHAN_NANOS6_RANK] = { RUN_TH, RUN_TH }, + [CHAN_NANOS6_THREAD] = { ACT_TH, NONE }, - [CHAN_KERNEL_CS] = { CUR_TH, ACT_TH }, + [CHAN_KERNEL_CS] = { RUN_TH, ACT_TH }, }; /* ----------------------------------------------- */ diff --git a/test/emu/instr.h b/test/emu/instr.h index 6bf1d2a..ea4bb75 100644 --- a/test/emu/instr.h +++ b/test/emu/instr.h @@ -21,6 +21,7 @@ #define _GNU_SOURCE /* For gethostname() */ #include "common.h" +#include "compat.h" #include "ovni.h" #include