Hi Javi,
On 13 July 2016 at 15:07, Javi Merino javi.merino@arm.com wrote:
The runtime event emulates the execution of a load for a specific amount of time irrespective of the compute capacity of the CPU it is run on or the frequency.
Thanks for adding this kind of event. It was on the TODO list
doc/tutorial.txt | 5 +++++ src/rt-app.c | 20 ++++++++++++++++++++ src/rt-app_parse_config.c | 3 +++ src/rt-app_types.h | 1 + 4 files changed, 29 insertions(+)
diff --git a/doc/tutorial.txt b/doc/tutorial.txt index 6dc9a44..100a2df 100644 --- a/doc/tutorial.txt +++ b/doc/tutorial.txt @@ -217,6 +217,11 @@ number of loop thanks to the ns per loop value (see calibration). This way of working enables to emulate a load with a duration that will vary with the frequency or the compute capacity of the CPU.
+* runtime : Integer. The duration is define in usec. Similar to the +run event, it emulates the execution of a load. Unlike run, runtime +runs for a specific amount of time irrespective of the compute +capacity of the CPU or the frequency.
- sleep : Integer. Emulate the sleep of a task. The duration is defined in
usec.
diff --git a/src/rt-app.c b/src/rt-app.c index 679d39a..5283ac7 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -274,6 +274,26 @@ static int run_event(event_data_t *event, int dry_run, *duration += timespec_to_usec(&t_end); } break;
case rtapp_runtime:
{
struct timespec t_start, t_end;
int64_t diff_ns;
log_debug("runtime %d ", event->duration);
clock_gettime(CLOCK_MONOTONIC, &t_start);
do {
/* Do work for 32usec */
I'm curious to know why you choose the value 32usec ? This value seems to be a bit long for me. 10usec should be enough
*perf += loadwait(32);
clock_gettime(CLOCK_MONOTONIC, &t_end);
diff_ns = timespec_sub_to_ns(&t_end, &t_start);
} while ((diff_ns / 1000) < event->duration);
t_end = timespec_sub(&t_end, &t_start);
*duration += timespec_to_usec(&t_end);
}
break; case rtapp_timer: { struct timespec t_period, t_now;
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 99b0e5e..c59b562 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -348,6 +348,8 @@ parse_thread_event_data(char *name, struct json_object *obj,
if (!strncmp(name, "sleep", strlen("sleep"))) data->type = rtapp_sleep;
else if (!strncmp(name, "runtime", strlen("runtime")))
data->type = rtapp_runtime; else data->type = rtapp_run;
@@ -558,6 +560,7 @@ static char *events[] = { "broad", "sync", "sleep",
"runtime",
Please move it after "run" to keep the same order as in run_event function
"run", "timer", "suspend",
diff --git a/src/rt-app_types.h b/src/rt-app_types.h index 2ce9c9d..57fb80d 100644 --- a/src/rt-app_types.h +++ b/src/rt-app_types.h @@ -67,6 +67,7 @@ typedef enum resource_t rtapp_resume, rtapp_mem, rtapp_iorun,
rtapp_runtime,
} resource_t;
struct _rtapp_mutex {
1.9.1
On Mon, Aug 01, 2016 at 03:40:36PM +0200, Vincent Guittot wrote:
Hi Javi,
On 13 July 2016 at 15:07, Javi Merino javi.merino@arm.com wrote:
The runtime event emulates the execution of a load for a specific amount of time irrespective of the compute capacity of the CPU it is run on or the frequency.
Thanks for adding this kind of event. It was on the TODO list
doc/tutorial.txt | 5 +++++ src/rt-app.c | 20 ++++++++++++++++++++ src/rt-app_parse_config.c | 3 +++ src/rt-app_types.h | 1 + 4 files changed, 29 insertions(+)
diff --git a/doc/tutorial.txt b/doc/tutorial.txt index 6dc9a44..100a2df 100644 --- a/doc/tutorial.txt +++ b/doc/tutorial.txt @@ -217,6 +217,11 @@ number of loop thanks to the ns per loop value (see calibration). This way of working enables to emulate a load with a duration that will vary with the frequency or the compute capacity of the CPU.
+* runtime : Integer. The duration is define in usec. Similar to the +run event, it emulates the execution of a load. Unlike run, runtime +runs for a specific amount of time irrespective of the compute +capacity of the CPU or the frequency.
- sleep : Integer. Emulate the sleep of a task. The duration is defined in
usec.
diff --git a/src/rt-app.c b/src/rt-app.c index 679d39a..5283ac7 100644 --- a/src/rt-app.c +++ b/src/rt-app.c @@ -274,6 +274,26 @@ static int run_event(event_data_t *event, int dry_run, *duration += timespec_to_usec(&t_end); } break;
case rtapp_runtime:
{
struct timespec t_start, t_end;
int64_t diff_ns;
log_debug("runtime %d ", event->duration);
clock_gettime(CLOCK_MONOTONIC, &t_start);
do {
/* Do work for 32usec */
I'm curious to know why you choose the value 32usec ? This value seems to be a bit long for me. 10usec should be enough
I don't remember to be honest, but I don't have a strong preference. 10 usec should be good as well.
*perf += loadwait(32);
clock_gettime(CLOCK_MONOTONIC, &t_end);
diff_ns = timespec_sub_to_ns(&t_end, &t_start);
} while ((diff_ns / 1000) < event->duration);
t_end = timespec_sub(&t_end, &t_start);
*duration += timespec_to_usec(&t_end);
}
break; case rtapp_timer: { struct timespec t_period, t_now;
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c index 99b0e5e..c59b562 100644 --- a/src/rt-app_parse_config.c +++ b/src/rt-app_parse_config.c @@ -348,6 +348,8 @@ parse_thread_event_data(char *name, struct json_object *obj,
if (!strncmp(name, "sleep", strlen("sleep"))) data->type = rtapp_sleep;
else if (!strncmp(name, "runtime", strlen("runtime")))
data->type = rtapp_runtime; else data->type = rtapp_run;
@@ -558,6 +560,7 @@ static char *events[] = { "broad", "sync", "sleep",
"runtime",
Please move it after "run" to keep the same order as in run_event function
I can't, because otherwise you can't tell apart "runtime" events from "run" events in obj_is_event:
for (pos = events; *pos; pos++) { char *event = *pos; if (!strncmp(name, event, strlen(event))) return 1; }
I can move runtime before run in run_event() and in the documentation instead.
"run", "timer", "suspend",
diff --git a/src/rt-app_types.h b/src/rt-app_types.h index 2ce9c9d..57fb80d 100644 --- a/src/rt-app_types.h +++ b/src/rt-app_types.h @@ -67,6 +67,7 @@ typedef enum resource_t rtapp_resume, rtapp_mem, rtapp_iorun,
rtapp_runtime,
} resource_t;
struct _rtapp_mutex {
1.9.1