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
};