diff --git a/emu.h b/emu.h index 0ce258b..ebff90f 100644 --- a/emu.h +++ b/emu.h @@ -86,7 +86,7 @@ enum nosv_ss_values { EV_NOSV_SCHED_SELF, }; -enum nosv_tampi_state { +enum tampi_state { ST_TAMPI_SEND = 1, ST_TAMPI_RECV = 2, ST_TAMPI_ISEND = 3, @@ -95,19 +95,19 @@ enum nosv_tampi_state { ST_TAMPI_WAITALL = 6, }; -enum nosv_openmp_state { +enum openmp_state { ST_OPENMP_TASK = 1, ST_OPENMP_PARALLEL = 2, }; -enum nosv_nanos6_state { - ST_NANOS6_REGISTER = 1, - ST_NANOS6_UNREGISTER = 2, +enum nanos6_state { + ST_NANOS6_REGISTERING = 1, + ST_NANOS6_UNREGISTERING = 2, ST_NANOS6_IF0_WAIT = 3, ST_NANOS6_IF0_INLINE = 4, ST_NANOS6_TASKWAIT = 5, - ST_NANOS6_CREATE = 6, - ST_NANOS6_SUBMIT = 7, + ST_NANOS6_CREATING = 6, + ST_NANOS6_SUBMITTING = 7, ST_NANOS6_SPAWN = 8, }; @@ -159,7 +159,7 @@ enum chan { CHAN_TAMPI_MODE, CHAN_OPENMP_MODE, - CHAN_NANOS6_MODE, + CHAN_NANOS6_SUBSYSTEM, CHAN_MAX }; @@ -190,7 +190,7 @@ static const int chan_to_prvtype[CHAN_MAX][3] = { { CHAN_OPENMP_MODE, 40, 90 }, - { CHAN_NANOS6_MODE, 50, 100 }, + { CHAN_NANOS6_SUBSYSTEM, 50, 100 }, }; struct ovni_chan { diff --git a/emu_nanos6.c b/emu_nanos6.c index 46b6136..0b7bee5 100644 --- a/emu_nanos6.c +++ b/emu_nanos6.c @@ -1,3 +1,20 @@ +/* + * Copyright (c) 2021 Barcelona Supercomputing Center (BSC) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include "uthash.h" @@ -31,7 +48,7 @@ hook_init_nanos6(struct ovni_emu *emu) row = th->gindex + 1; uth = &emu->th_chan; - chan_th_init(th, uth, CHAN_NANOS6_MODE, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_th, clock); + chan_th_init(th, uth, CHAN_NANOS6_SUBSYSTEM, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_th, clock); } /* Init the channels in all cpus */ @@ -41,160 +58,31 @@ hook_init_nanos6(struct ovni_emu *emu) row = cpu->gindex + 1; ucpu = &emu->cpu_chan; - chan_cpu_init(cpu, ucpu, CHAN_NANOS6_MODE, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_cpu, clock); + chan_cpu_init(cpu, ucpu, CHAN_NANOS6_SUBSYSTEM, CHAN_TRACK_TH_RUNNING, 0, 0, 1, row, prv_cpu, clock); } } /* --------------------------- pre ------------------------------- */ static void -pre_register(struct ovni_emu *emu) +pre_subsystem(struct ovni_emu *emu, int st) { struct ovni_ethread *th; + struct ovni_chan *chan; + th = emu->cur_thread; + chan = &th->chan[CHAN_NANOS6_SUBSYSTEM]; switch(emu->cur_ev->header.value) { case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_REGISTER); + chan_push(chan, st); break; case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_REGISTER); - break; - default: - abort(); - } -} - -static void -pre_unregister(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_UNREGISTER); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_UNREGISTER); - break; - default: - abort(); - } -} - -static void -pre_wait(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_IF0_WAIT); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_IF0_WAIT); - break; - default: - abort(); - } -} - -static void -pre_inline(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_IF0_INLINE); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_IF0_INLINE); - break; - default: - abort(); - } -} - -static void -pre_taskwait(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_TASKWAIT); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_TASKWAIT); - break; - default: - abort(); - } -} - -static void -pre_create(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_CREATE); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_CREATE); - break; - default: - abort(); - } -} - -static void -pre_submit(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_SUBMIT); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_SUBMIT); - break; - default: - abort(); - } -} - -static void -pre_spawn(struct ovni_emu *emu) -{ - struct ovni_ethread *th; - th = emu->cur_thread; - - switch(emu->cur_ev->header.value) - { - case '[': - chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_SPAWN); - break; - case ']': - chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_SPAWN); + chan_pop(chan, st); break; default: + err("unexpected value '%c' (expecting '[' or ']')\n", emu->cur_ev->header.value); abort(); } } @@ -202,18 +90,20 @@ pre_spawn(struct ovni_emu *emu) void hook_pre_nanos6(struct ovni_emu *emu) { + // Ensure that the thread is running + assert(emu->cur_thread->is_running != 0); assert(emu->cur_ev->header.model == 'L'); switch(emu->cur_ev->header.category) { - case 'R': pre_register(emu); break; - case 'U': pre_unregister(emu); break; - case 'W': pre_wait(emu); break; - case 'I': pre_inline(emu); break; - case 'T': pre_taskwait(emu); break; - case 'C': pre_create(emu); break; - case 'S': pre_submit(emu); break; - case 'P': pre_spawn(emu); break; + case 'R': pre_subsystem(emu, ST_NANOS6_REGISTERING); break; + case 'U': pre_subsystem(emu, ST_NANOS6_UNREGISTERING); break; + case 'W': pre_subsystem(emu, ST_NANOS6_IF0_WAIT); break; + case 'I': pre_subsystem(emu, ST_NANOS6_IF0_INLINE); break; + case 'T': pre_subsystem(emu, ST_NANOS6_TASKWAIT); break; + case 'C': pre_subsystem(emu, ST_NANOS6_CREATING); break; + case 'S': pre_subsystem(emu, ST_NANOS6_SUBMITTING); break; + case 'P': pre_subsystem(emu, ST_NANOS6_SPAWN); break; default: break; } diff --git a/pcf.c b/pcf.c index b280641..ccf74e5 100644 --- a/pcf.c +++ b/pcf.c @@ -362,30 +362,30 @@ struct event_type thread_openmp_mode = { openmp_mode_values }; -/* ---------------- CHAN_NANOS6_MODE ---------------- */ +/* ---------------- CHAN_NANOS6_SUBSYSTEM ---------------- */ struct event_value nanos6_mode_values[] = { - { ST_NULL, "NULL" }, - { ST_TOO_MANY_TH, "Nanos6: Multiple threads running" }, - { ST_NANOS6_REGISTER, "Dependencies: Register task accesses" }, - { ST_NANOS6_UNREGISTER, "Dependencies: Unregister task accesses" }, - { ST_NANOS6_IF0_WAIT, "If0: Wait for If0 task" }, - { ST_NANOS6_IF0_INLINE, "If0: Execute If0 task inline" }, - { ST_NANOS6_TASKWAIT, "Taskwait: Taskwait" }, - { ST_NANOS6_CREATE, "Add Task: Create a task" }, - { ST_NANOS6_SUBMIT, "Add Task: Submit a task" }, - { ST_NANOS6_SPAWN, "Spawn Function: Spawn a function" }, + { ST_NULL, "NULL" }, + { ST_TOO_MANY_TH, "Nanos6: Multiple threads running" }, + { ST_NANOS6_REGISTERING, "Dependencies: Register task accesses" }, + { ST_NANOS6_UNREGISTERING, "Dependencies: Unregister task accesses" }, + { ST_NANOS6_IF0_WAIT, "If0: Wait for If0 task" }, + { ST_NANOS6_IF0_INLINE, "If0: Execute If0 task inline" }, + { ST_NANOS6_TASKWAIT, "Taskwait: Taskwait" }, + { ST_NANOS6_CREATING, "Add Task: Create a task" }, + { ST_NANOS6_SUBMITTING, "Add Task: Submit a task" }, + { ST_NANOS6_SPAWN, "Spawn Function: Spawn a function" }, { -1, NULL }, }; struct event_type cpu_nanos6_mode = { - 0, chan_to_prvtype[CHAN_NANOS6_MODE][CHAN_CPU], + 0, chan_to_prvtype[CHAN_NANOS6_SUBSYSTEM][CHAN_CPU], "CPU: Nanos6 mode of the RUNNING thread", nanos6_mode_values }; struct event_type thread_nanos6_mode = { - 0, chan_to_prvtype[CHAN_NANOS6_MODE][CHAN_TH], + 0, chan_to_prvtype[CHAN_NANOS6_SUBSYSTEM][CHAN_TH], "Thread: Nanos6 mode of the RUNNING thread", nanos6_mode_values };