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, | ||||
| }; | ||||
| 
 | ||||
| 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 { | ||||
|  | ||||
							
								
								
									
										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 "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; | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										26
									
								
								pcf.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								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 | ||||
| }; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Antoni Navarro
						Antoni Navarro