Skip to content

Commit 2c6f1a2

Browse files
author
Juri Lelli
committed
rt-app, rt-app_parse_config: add task pipeline latency metric
End-to-end latency of a pipeline of tasks is a useful metric to evaluate synthetic mobile-like workloads (e.g., audio/video decoding pipeline). Add such feature by piggybacking barrier_like events. Signed-off-by: Juri Lelli <[email protected]>
1 parent a9a0c6c commit 2c6f1a2

File tree

4 files changed

+54
-16
lines changed

4 files changed

+54
-16
lines changed

src/rt-app.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -286,18 +286,29 @@ static int run_event(event_data_t *event, int dry_run,
286286
pthread_cond_signal(&(rdata->res.cond.obj));
287287
break;
288288
case rtapp_barrier:
289-
log_debug("barrier %s ", rdata->name);
290-
pthread_mutex_lock(&(rdata->res.barrier.m_obj));
291-
if (rdata->res.barrier.waiting == 0) {
292-
/* everyone is already waiting, signal */
293-
pthread_cond_broadcast(&(rdata->res.barrier.c_obj));
294-
} else {
295-
/* not everyone is waiting, mark then wait */
296-
rdata->res.barrier.waiting -= 1;
297-
pthread_cond_wait(&(rdata->res.barrier.c_obj), &(rdata->res.barrier.m_obj));
298-
rdata->res.barrier.waiting += 1;
289+
{
290+
struct timespec t_delta;
291+
log_debug("barrier %s ", rdata->name);
292+
pthread_mutex_lock(&(rdata->res.barrier.m_obj));
293+
if (rdata->res.barrier.waiting == 0) {
294+
/* everyone is already waiting, signal */
295+
pthread_cond_broadcast(&(rdata->res.barrier.c_obj));
296+
clock_gettime(CLOCK_MONOTONIC, &t_delta);
297+
t_delta = timespec_sub(&t_delta, &rdata->res.barrier.t_ref);
298+
ldata->pipe_latency = timespec_to_usec(&t_delta);
299+
log_debug("pipeline duration %lu ", ldata->pipe_latency);
300+
} else {
301+
/* not everyone is waiting, mark then wait */
302+
rdata->res.barrier.waiting -= 1;
303+
pthread_cond_wait(&(rdata->res.barrier.c_obj), &(rdata->res.barrier.m_obj));
304+
rdata->res.barrier.waiting += 1;
305+
}
306+
pthread_mutex_unlock(&(rdata->res.barrier.m_obj));
299307
}
300-
pthread_mutex_unlock(&(rdata->res.barrier.m_obj));
308+
break;
309+
case rtapp_bref:
310+
log_debug("bref %s ", rdata->name);
311+
clock_gettime(CLOCK_MONOTONIC, &rdata->res.barrier.t_ref);
301312
break;
302313
case rtapp_sig_and_wait:
303314
log_debug("signal and wait %s", rdata->name);
@@ -762,10 +773,11 @@ void *thread_body(void *arg)
762773

763774
log_notice("[%d] starting thread ...\n", data->ind);
764775

765-
fprintf(data->log_handler, "%s %8s %8s %8s %15s %15s %15s %10s %10s %10s %10s\n",
776+
fprintf(data->log_handler, "%s %8s %8s %8s %15s %15s %15s %10s %10s %10s %10s %10s\n",
766777
"#idx", "perf", "run", "period",
767778
"start", "end", "rel_st", "slack",
768-
"c_duration", "c_period", "wu_lat");
779+
"c_duration", "c_period", "wu_lat",
780+
"pipe_lat");
769781

770782
if (opts.ftrace)
771783
log_ftrace(ft_data.marker_fd, "[%d] starts", data->ind);
@@ -836,6 +848,7 @@ void *thread_body(void *arg)
836848
curr_timing->duration = ldata.duration;
837849
curr_timing->perf = ldata.perf;
838850
curr_timing->wu_latency = ldata.wu_latency;
851+
curr_timing->pipe_latency = ldata.pipe_latency;
839852
curr_timing->slack = ldata.slack;
840853
curr_timing->c_period = ldata.c_period;
841854
curr_timing->c_duration = ldata.c_duration;

src/rt-app_parse_config.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ static void init_barrier_resource(rtapp_resource_t *data, const rtapp_options_t
236236
&data->res.barrier.m_attr);
237237

238238
pthread_cond_init(&data->res.barrier.c_obj, NULL);
239+
data->res.barrier.t_ref = usec_to_timespec(0UL);
239240
}
240241

241242
static void
@@ -517,6 +518,23 @@ parse_thread_event_data(char *name, struct json_object *obj,
517518
return;
518519
}
519520

521+
if (!strncmp(name, "bref", strlen("bref"))) {
522+
523+
if (!json_object_is_type(obj, json_type_string))
524+
goto unknown_event;
525+
526+
data->type = rtapp_bref;
527+
528+
ref = json_object_get_string(obj);
529+
i = get_resource_index(ref, rtapp_barrier, opts);
530+
531+
data->res = i;
532+
rdata = &(opts->resources[data->res]);
533+
534+
log_info(PIN2 "type %d target %s [%d]", data->type, rdata->name, rdata->index);
535+
return;
536+
}
537+
520538
if (!strncmp(name, "timer", strlen("timer"))) {
521539

522540
tmp = get_string_value_from(obj, "ref", TRUE, "unknown");
@@ -631,6 +649,7 @@ static char *events[] = {
631649
"iorun",
632650
"yield",
633651
"barrier",
652+
"bref",
634653
NULL
635654
};
636655

src/rt-app_types.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ typedef enum resource_t
7272
rtapp_iorun,
7373
rtapp_runtime,
7474
rtapp_yield,
75-
rtapp_barrier
75+
rtapp_barrier,
76+
rtapp_bref
7677
} resource_t;
7778

7879
struct _rtapp_mutex {
@@ -97,6 +98,8 @@ struct _rtapp_barrier_like {
9798
int waiting;
9899
/* condvar to wait/signal on */
99100
pthread_cond_t c_obj;
101+
/* time reference for tasks pipeline */
102+
struct timespec t_ref;
100103
};
101104

102105
struct _rtapp_signal {
@@ -200,6 +203,7 @@ typedef struct _log_data_t {
200203
unsigned long perf;
201204
unsigned long duration;
202205
unsigned long wu_latency;
206+
unsigned long pipe_latency;
203207
unsigned long c_duration;
204208
unsigned long c_period;
205209
long slack;
@@ -241,6 +245,7 @@ typedef struct _timing_point_t {
241245
unsigned long c_duration;
242246
unsigned long c_period;
243247
unsigned long wu_latency;
248+
unsigned long pipe_latency;
244249
long slack;
245250
__u64 start_time;
246251
__u64 end_time;

src/rt-app_utils.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ void
145145
log_timing(FILE *handler, timing_point_t *t)
146146
{
147147
fprintf(handler,
148-
"%4d %8lu %8lu %8lu %15llu %15llu %15llu %10ld %10lu %10lu %10lu",
148+
"%4d %8lu %8lu %8lu %15llu %15llu %15llu %10ld %10lu %10lu %10lu %10lu",
149149
t->ind,
150150
t->perf,
151151
t->duration,
@@ -156,7 +156,8 @@ log_timing(FILE *handler, timing_point_t *t)
156156
t->slack,
157157
t->c_duration,
158158
t->c_period,
159-
t->wu_latency
159+
t->wu_latency,
160+
t->pipe_latency
160161
);
161162
fprintf(handler, "\n");
162163
}

0 commit comments

Comments
 (0)