Print emulation progress

This commit is contained in:
Rodrigo Arias 2023-02-16 15:54:25 +01:00 committed by Rodrigo Arias Mallo
parent 0a9530dc6d
commit f2b6db6a08
7 changed files with 108 additions and 6 deletions

View File

@ -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

View File

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

View File

@ -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
View 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
View 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 */

View File

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

View File

@ -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 */