Refactor emu_nanos6 into a simpler function
This commit is contained in:
parent
04895a7aea
commit
c9b189feb8
18
emu.h
18
emu.h
@ -86,7 +86,7 @@ enum nosv_ss_values {
|
|||||||
EV_NOSV_SCHED_SELF,
|
EV_NOSV_SCHED_SELF,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nosv_tampi_state {
|
enum tampi_state {
|
||||||
ST_TAMPI_SEND = 1,
|
ST_TAMPI_SEND = 1,
|
||||||
ST_TAMPI_RECV = 2,
|
ST_TAMPI_RECV = 2,
|
||||||
ST_TAMPI_ISEND = 3,
|
ST_TAMPI_ISEND = 3,
|
||||||
@ -95,19 +95,19 @@ enum nosv_tampi_state {
|
|||||||
ST_TAMPI_WAITALL = 6,
|
ST_TAMPI_WAITALL = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nosv_openmp_state {
|
enum openmp_state {
|
||||||
ST_OPENMP_TASK = 1,
|
ST_OPENMP_TASK = 1,
|
||||||
ST_OPENMP_PARALLEL = 2,
|
ST_OPENMP_PARALLEL = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum nosv_nanos6_state {
|
enum nanos6_state {
|
||||||
ST_NANOS6_REGISTER = 1,
|
ST_NANOS6_REGISTERING = 1,
|
||||||
ST_NANOS6_UNREGISTER = 2,
|
ST_NANOS6_UNREGISTERING = 2,
|
||||||
ST_NANOS6_IF0_WAIT = 3,
|
ST_NANOS6_IF0_WAIT = 3,
|
||||||
ST_NANOS6_IF0_INLINE = 4,
|
ST_NANOS6_IF0_INLINE = 4,
|
||||||
ST_NANOS6_TASKWAIT = 5,
|
ST_NANOS6_TASKWAIT = 5,
|
||||||
ST_NANOS6_CREATE = 6,
|
ST_NANOS6_CREATING = 6,
|
||||||
ST_NANOS6_SUBMIT = 7,
|
ST_NANOS6_SUBMITTING = 7,
|
||||||
ST_NANOS6_SPAWN = 8,
|
ST_NANOS6_SPAWN = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -159,7 +159,7 @@ enum chan {
|
|||||||
|
|
||||||
CHAN_TAMPI_MODE,
|
CHAN_TAMPI_MODE,
|
||||||
CHAN_OPENMP_MODE,
|
CHAN_OPENMP_MODE,
|
||||||
CHAN_NANOS6_MODE,
|
CHAN_NANOS6_SUBSYSTEM,
|
||||||
|
|
||||||
CHAN_MAX
|
CHAN_MAX
|
||||||
};
|
};
|
||||||
@ -190,7 +190,7 @@ static const int chan_to_prvtype[CHAN_MAX][3] = {
|
|||||||
|
|
||||||
{ CHAN_OPENMP_MODE, 40, 90 },
|
{ CHAN_OPENMP_MODE, 40, 90 },
|
||||||
|
|
||||||
{ CHAN_NANOS6_MODE, 50, 100 },
|
{ CHAN_NANOS6_SUBSYSTEM, 50, 100 },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ovni_chan {
|
struct ovni_chan {
|
||||||
|
182
emu_nanos6.c
182
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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "uthash.h"
|
#include "uthash.h"
|
||||||
|
|
||||||
@ -31,7 +48,7 @@ hook_init_nanos6(struct ovni_emu *emu)
|
|||||||
row = th->gindex + 1;
|
row = th->gindex + 1;
|
||||||
uth = &emu->th_chan;
|
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 */
|
/* Init the channels in all cpus */
|
||||||
@ -41,160 +58,31 @@ hook_init_nanos6(struct ovni_emu *emu)
|
|||||||
row = cpu->gindex + 1;
|
row = cpu->gindex + 1;
|
||||||
ucpu = &emu->cpu_chan;
|
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 ------------------------------- */
|
/* --------------------------- pre ------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pre_register(struct ovni_emu *emu)
|
pre_subsystem(struct ovni_emu *emu, int st)
|
||||||
{
|
{
|
||||||
struct ovni_ethread *th;
|
struct ovni_ethread *th;
|
||||||
|
struct ovni_chan *chan;
|
||||||
|
|
||||||
th = emu->cur_thread;
|
th = emu->cur_thread;
|
||||||
|
chan = &th->chan[CHAN_NANOS6_SUBSYSTEM];
|
||||||
|
|
||||||
switch(emu->cur_ev->header.value)
|
switch(emu->cur_ev->header.value)
|
||||||
{
|
{
|
||||||
case '[':
|
case '[':
|
||||||
chan_push(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_REGISTER);
|
chan_push(chan, st);
|
||||||
break;
|
break;
|
||||||
case ']':
|
case ']':
|
||||||
chan_pop(&th->chan[CHAN_NANOS6_MODE], ST_NANOS6_REGISTER);
|
chan_pop(chan, st);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
err("unexpected value '%c' (expecting '[' or ']')\n", emu->cur_ev->header.value);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,18 +90,20 @@ pre_spawn(struct ovni_emu *emu)
|
|||||||
void
|
void
|
||||||
hook_pre_nanos6(struct ovni_emu *emu)
|
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');
|
assert(emu->cur_ev->header.model == 'L');
|
||||||
|
|
||||||
switch(emu->cur_ev->header.category)
|
switch(emu->cur_ev->header.category)
|
||||||
{
|
{
|
||||||
case 'R': pre_register(emu); break;
|
case 'R': pre_subsystem(emu, ST_NANOS6_REGISTERING); break;
|
||||||
case 'U': pre_unregister(emu); break;
|
case 'U': pre_subsystem(emu, ST_NANOS6_UNREGISTERING); break;
|
||||||
case 'W': pre_wait(emu); break;
|
case 'W': pre_subsystem(emu, ST_NANOS6_IF0_WAIT); break;
|
||||||
case 'I': pre_inline(emu); break;
|
case 'I': pre_subsystem(emu, ST_NANOS6_IF0_INLINE); break;
|
||||||
case 'T': pre_taskwait(emu); break;
|
case 'T': pre_subsystem(emu, ST_NANOS6_TASKWAIT); break;
|
||||||
case 'C': pre_create(emu); break;
|
case 'C': pre_subsystem(emu, ST_NANOS6_CREATING); break;
|
||||||
case 'S': pre_submit(emu); break;
|
case 'S': pre_subsystem(emu, ST_NANOS6_SUBMITTING); break;
|
||||||
case 'P': pre_spawn(emu); break;
|
case 'P': pre_subsystem(emu, ST_NANOS6_SPAWN); break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
26
pcf.c
26
pcf.c
@ -362,30 +362,30 @@ struct event_type thread_openmp_mode = {
|
|||||||
openmp_mode_values
|
openmp_mode_values
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ---------------- CHAN_NANOS6_MODE ---------------- */
|
/* ---------------- CHAN_NANOS6_SUBSYSTEM ---------------- */
|
||||||
|
|
||||||
struct event_value nanos6_mode_values[] = {
|
struct event_value nanos6_mode_values[] = {
|
||||||
{ ST_NULL, "NULL" },
|
{ ST_NULL, "NULL" },
|
||||||
{ ST_TOO_MANY_TH, "Nanos6: Multiple threads running" },
|
{ ST_TOO_MANY_TH, "Nanos6: Multiple threads running" },
|
||||||
{ ST_NANOS6_REGISTER, "Dependencies: Register task accesses" },
|
{ ST_NANOS6_REGISTERING, "Dependencies: Register task accesses" },
|
||||||
{ ST_NANOS6_UNREGISTER, "Dependencies: Unregister task accesses" },
|
{ ST_NANOS6_UNREGISTERING, "Dependencies: Unregister task accesses" },
|
||||||
{ ST_NANOS6_IF0_WAIT, "If0: Wait for If0 task" },
|
{ ST_NANOS6_IF0_WAIT, "If0: Wait for If0 task" },
|
||||||
{ ST_NANOS6_IF0_INLINE, "If0: Execute If0 task inline" },
|
{ ST_NANOS6_IF0_INLINE, "If0: Execute If0 task inline" },
|
||||||
{ ST_NANOS6_TASKWAIT, "Taskwait: Taskwait" },
|
{ ST_NANOS6_TASKWAIT, "Taskwait: Taskwait" },
|
||||||
{ ST_NANOS6_CREATE, "Add Task: Create a task" },
|
{ ST_NANOS6_CREATING, "Add Task: Create a task" },
|
||||||
{ ST_NANOS6_SUBMIT, "Add Task: Submit a task" },
|
{ ST_NANOS6_SUBMITTING, "Add Task: Submit a task" },
|
||||||
{ ST_NANOS6_SPAWN, "Spawn Function: Spawn a function" },
|
{ ST_NANOS6_SPAWN, "Spawn Function: Spawn a function" },
|
||||||
{ -1, NULL },
|
{ -1, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct event_type cpu_nanos6_mode = {
|
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",
|
"CPU: Nanos6 mode of the RUNNING thread",
|
||||||
nanos6_mode_values
|
nanos6_mode_values
|
||||||
};
|
};
|
||||||
|
|
||||||
struct event_type thread_nanos6_mode = {
|
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",
|
"Thread: Nanos6 mode of the RUNNING thread",
|
||||||
nanos6_mode_values
|
nanos6_mode_values
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user