Print emulation progress
This commit is contained in:
		
							parent
							
								
									0a9530dc6d
								
							
						
					
					
						commit
						f2b6db6a08
					
				| @ -17,6 +17,7 @@ add_library(emu STATIC | ||||
|   emu.c | ||||
|   emu_args.c | ||||
|   emu_ev.c | ||||
|   emu_stat.c | ||||
|   model.c | ||||
|   model_cpu.c | ||||
|   model_thread.c | ||||
|  | ||||
| @ -51,6 +51,8 @@ emu_init(struct emu *emu, int argc, char *argv[]) | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	emu_stat_init(&emu->stat, 0.5); | ||||
| 
 | ||||
| 	model_init(&emu->model); | ||||
| 
 | ||||
| 	/* Register all the models */ | ||||
| @ -138,6 +140,8 @@ emu_step(struct emu *emu) | ||||
| 
 | ||||
| 	dbg("----- mvc=%s dclock=%ld -----", emu->ev->mcv, emu->ev->dclock); | ||||
| 
 | ||||
| 	emu_stat_update(&emu->stat, &emu->player); | ||||
| 
 | ||||
| 	/* Advance recorder clock */ | ||||
| 	if (recorder_advance(&emu->recorder, emu->ev->dclock) != 0) { | ||||
| 		err("recorder_advance failed"); | ||||
| @ -163,6 +167,8 @@ emu_step(struct emu *emu) | ||||
| int | ||||
| emu_finish(struct emu *emu) | ||||
| { | ||||
| 	emu_stat_report(&emu->stat, &emu->player); | ||||
| 
 | ||||
| 	if (model_finish(&emu->model, emu) != 0) { | ||||
| 		err("model_finish failed"); | ||||
| 		return -1; | ||||
|  | ||||
| @ -12,6 +12,7 @@ | ||||
| #include "model.h" | ||||
| #include "emu_ev.h" | ||||
| #include "recorder.h" | ||||
| #include "emu_stat.h" | ||||
| 
 | ||||
| enum error_values { | ||||
| 	ST_BAD = 666, | ||||
| @ -27,6 +28,7 @@ struct emu { | ||||
| 	struct player player; | ||||
| 	struct model model; | ||||
| 	struct recorder recorder; | ||||
| 	struct emu_stat stat; | ||||
| 
 | ||||
| 	/* Quick access */ | ||||
| 	struct stream *stream; | ||||
|  | ||||
							
								
								
									
										51
									
								
								src/emu/emu_stat.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/emu/emu_stat.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| /* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
 | ||||
|  * SPDX-License-Identifier: GPL-3.0-or-later */ | ||||
| 
 | ||||
| #define _POSIX_C_SOURCE 200112L | ||||
| 
 | ||||
| #include "emu_stat.h" | ||||
| 
 | ||||
| #include <time.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| static double | ||||
| get_time(void) | ||||
| { | ||||
| 	struct timespec ts; | ||||
| 	clock_gettime(CLOCK_MONOTONIC, &ts); | ||||
| 	return (double) ts.tv_sec + (double) ts.tv_nsec * 1.0e-9; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| emu_stat_init(struct emu_stat *stat, double period_seconds) | ||||
| { | ||||
| 	memset(stat, 0, sizeof(struct emu_stat)); | ||||
| 
 | ||||
| 	stat->period = period_seconds; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| emu_stat_report(struct emu_stat *stat, struct player *player) | ||||
| { | ||||
| 	double t = get_time(); | ||||
| 
 | ||||
| 	stat->in_progress = player_progress(player); | ||||
| 
 | ||||
| 	double iprog = stat->in_progress * 100.0; | ||||
| 
 | ||||
| 	err("%.1f%% done", iprog); | ||||
| 
 | ||||
| 	stat->last_time = t; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| emu_stat_update(struct emu_stat *stat, struct player *player) | ||||
| { | ||||
| 	double t = get_time(); | ||||
| 
 | ||||
| 	/* Not yet */ | ||||
| 	if (t - stat->last_time < stat->period) | ||||
| 		return; | ||||
| 
 | ||||
| 	emu_stat_report(stat, player); | ||||
| } | ||||
							
								
								
									
										20
									
								
								src/emu/emu_stat.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/emu/emu_stat.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| /* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
 | ||||
|  * SPDX-License-Identifier: GPL-3.0-or-later */ | ||||
| 
 | ||||
| #ifndef EMU_STAT_H | ||||
| #define EMU_STAT_H | ||||
| 
 | ||||
| #include "player.h" | ||||
| 
 | ||||
| /* Easier to parse emulation event */ | ||||
| struct emu_stat { | ||||
| 	double in_progress; | ||||
| 	double period; | ||||
| 	double last_time; | ||||
| }; | ||||
| 
 | ||||
| void emu_stat_init(struct emu_stat *stat, double period_seconds); | ||||
| void emu_stat_update(struct emu_stat *stat, struct player *player); | ||||
| void emu_stat_report(struct emu_stat *stat, struct player *player); | ||||
| 
 | ||||
| #endif /* EMU_STAT_H */ | ||||
| @ -41,8 +41,7 @@ step_stream(struct player *player, struct stream *stream) | ||||
| 	int ret = stream_step(stream); | ||||
| 
 | ||||
| 	if (ret < 0) { | ||||
| 		err("step_stream: cannot step stream '%s'\n", | ||||
| 				stream->relpath); | ||||
| 		err("cannot step stream '%s'", stream->relpath); | ||||
| 		return -1; | ||||
| 	} else if (ret > 0) { | ||||
| 		return ret; | ||||
| @ -98,6 +97,7 @@ player_init(struct player *player, struct trace *trace) | ||||
| 
 | ||||
| 	player->first_event = 1; | ||||
| 	player->stream = NULL; | ||||
| 	player->trace = trace; | ||||
| 
 | ||||
| 	/* Load initial streams and events */ | ||||
| 	struct stream *stream; | ||||
| @ -107,7 +107,7 @@ player_init(struct player *player, struct trace *trace) | ||||
| 			/* No more events */ | ||||
| 			continue; | ||||
| 		} else if (ret < 0) { | ||||
| 			err("player_init: step_stream failed\n"); | ||||
| 			err("step_stream failed"); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| @ -165,7 +165,7 @@ player_step(struct player *player) | ||||
| { | ||||
| 	/* Add the stream back if still active */ | ||||
| 	if (player->stream != NULL && step_stream(player, player->stream) < 0) { | ||||
| 		err("player_step: step_stream() failed\n"); | ||||
| 		err("step_stream() failed"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -179,12 +179,12 @@ player_step(struct player *player) | ||||
| 	struct stream *stream = heap_elem(node, struct stream, hh); | ||||
| 
 | ||||
| 	if (stream == NULL) { | ||||
| 		err("player_step: heap_elem() returned NULL\n"); | ||||
| 		err("heap_elem() returned NULL"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (update_clocks(player, stream) != 0) { | ||||
| 		err("player_step: update_clocks() failed\n"); | ||||
| 		err("update_clocks() failed"); | ||||
| 		return -1; | ||||
| 	} | ||||
| 
 | ||||
| @ -208,3 +208,23 @@ player_stream(struct player *player) | ||||
| { | ||||
| 	return player->stream; | ||||
| } | ||||
| 
 | ||||
| double | ||||
| player_progress(struct player *player) | ||||
| { | ||||
| 	int64_t n = 0; | ||||
| 	double done = 0.0; | ||||
| 	struct trace *trace = player->trace; | ||||
| 	struct stream *stream; | ||||
| 	DL_FOREACH(trace->streams, stream) { | ||||
| 		done += stream_progress(stream); | ||||
| 		n++; | ||||
| 	} | ||||
| 
 | ||||
| 	if (n == 0) | ||||
| 		return 1.0; | ||||
| 
 | ||||
| 	done /= (double) n; | ||||
| 
 | ||||
| 	return done; | ||||
| } | ||||
|  | ||||
| @ -10,6 +10,7 @@ | ||||
| #include <linux/limits.h> | ||||
| 
 | ||||
| struct player { | ||||
| 	struct trace *trace; | ||||
| 	heap_head_t heap; | ||||
| 	int64_t firstclock; | ||||
| 	int64_t lastclock; | ||||
| @ -23,5 +24,6 @@ int player_init(struct player *player, struct trace *trace); | ||||
| int player_step(struct player *player); | ||||
| struct emu_ev *player_ev(struct player *player); | ||||
| struct stream *player_stream(struct player *player); | ||||
| double player_progress(struct player *player); | ||||
| 
 | ||||
| #endif /* EMU_PLAYER_H */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user