Add Benchmark to App. TODO: Test Benchmark in other kernels.
This commit is contained in:
commit
1e9d974476
|
@ -31,8 +31,11 @@
|
|||
#define ARRAY_SIZE(ar) (int) (sizeof(ar) / sizeof((ar)[0]))
|
||||
#define FAIL_IF(condition, error_code) if (condition) return (error_code)
|
||||
|
||||
#ifdef DBG
|
||||
#undef DBG
|
||||
#endif
|
||||
#ifdef SLRE_DEBUG
|
||||
#define DBG(x) printf x
|
||||
#define DBG(x) printf x;
|
||||
#else
|
||||
#define DBG(x)
|
||||
#endif
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
* statemate.c
|
||||
*
|
||||
* This code was automatically generated by
|
||||
* the STAtechart Real-time-Code generator STARC
|
||||
* the STAtechart Real-bm_time-Code generator STARC
|
||||
* which was developed at C-LAB.
|
||||
*
|
||||
* The original StateChart specifies an experimental
|
||||
|
@ -170,7 +170,7 @@ char FH_DU__MFHA_old;
|
|||
#define FH_TUERMODUL_CTRL__END_REVERS_copy_IDX 23
|
||||
#define FH_TUERMODUL__EINKLEMMUNG_IDX 24
|
||||
|
||||
static unsigned long time;
|
||||
static unsigned long bm_time;
|
||||
char stable;
|
||||
char step;
|
||||
|
||||
|
@ -193,39 +193,39 @@ char BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state; /** 2 bits **/
|
|||
|
||||
void interface(void) {
|
||||
if (SYS_bit_get(Bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX))
|
||||
tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = time;
|
||||
tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = bm_time;
|
||||
if (SYS_bit_get(Bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX) ||
|
||||
SYS_bit_get(Bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX))
|
||||
tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL =
|
||||
time;
|
||||
bm_time;
|
||||
if ((sc_FH_TUERMODUL_CTRL_2375_2 != 0) &&
|
||||
(time - sc_FH_TUERMODUL_CTRL_2375_2 >= 0.5)) {
|
||||
(bm_time - sc_FH_TUERMODUL_CTRL_2375_2 >= 0.5)) {
|
||||
FH_TUERMODUL__MFHA_copy = 0;
|
||||
sc_FH_TUERMODUL_CTRL_2375_2 = 0;
|
||||
}
|
||||
if ((sc_FH_TUERMODUL_CTRL_2352_1 != 0) &&
|
||||
(time - sc_FH_TUERMODUL_CTRL_2352_1 >= 0.5)) {
|
||||
(bm_time - sc_FH_TUERMODUL_CTRL_2352_1 >= 0.5)) {
|
||||
FH_TUERMODUL__MFHZ_copy = 0;
|
||||
sc_FH_TUERMODUL_CTRL_2352_1 = 0;
|
||||
}
|
||||
if ((sc_FH_TUERMODUL_CTRL_2329_1 != 0) &&
|
||||
(time - sc_FH_TUERMODUL_CTRL_2329_1 >= 0.5)) {
|
||||
(bm_time - sc_FH_TUERMODUL_CTRL_2329_1 >= 0.5)) {
|
||||
FH_TUERMODUL__MFHZ_copy = 0;
|
||||
sc_FH_TUERMODUL_CTRL_2329_1 = 0;
|
||||
}
|
||||
if ((sc_FH_TUERMODUL_CTRL_1781_10 != 0) &&
|
||||
(time - sc_FH_TUERMODUL_CTRL_1781_10 >= 0.5)) {
|
||||
(bm_time - sc_FH_TUERMODUL_CTRL_1781_10 >= 0.5)) {
|
||||
sc_FH_TUERMODUL_CTRL_1781_10 = 0;
|
||||
}
|
||||
if ((sc_FH_TUERMODUL_CTRL_1739_10 != 0) &&
|
||||
(time - sc_FH_TUERMODUL_CTRL_1739_10 >= 0.5)) {
|
||||
(bm_time - sc_FH_TUERMODUL_CTRL_1739_10 >= 0.5)) {
|
||||
sc_FH_TUERMODUL_CTRL_1739_10 = 0;
|
||||
}
|
||||
if ((SYS_bit_get(Bitlist,
|
||||
entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX) ||
|
||||
BLOCK_ERKENNUNG_CTRL__N != BLOCK_ERKENNUNG_CTRL__N_old))
|
||||
tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy =
|
||||
time;
|
||||
bm_time;
|
||||
|
||||
} /** interface **/
|
||||
|
||||
|
@ -466,7 +466,7 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
((FH_TUERMODUL__MFHZ))) {
|
||||
stable = 0;
|
||||
FH_TUERMODUL__MFHZ_copy = 0;
|
||||
sc_FH_TUERMODUL_CTRL_2329_1 = time;
|
||||
sc_FH_TUERMODUL_CTRL_2329_1 = bm_time;
|
||||
|
||||
B_FH_TUERMODUL_CTRL_next_state = 3;
|
||||
INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3;
|
||||
|
@ -538,7 +538,7 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
((FH_TUERMODUL__MFHA))) {
|
||||
stable = 0;
|
||||
FH_TUERMODUL__MFHA_copy = 0;
|
||||
sc_FH_TUERMODUL_CTRL_2375_2 = time;
|
||||
sc_FH_TUERMODUL_CTRL_2375_2 = bm_time;
|
||||
|
||||
B_FH_TUERMODUL_CTRL_next_state = 2;
|
||||
NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3;
|
||||
|
@ -548,7 +548,7 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
((FH_TUERMODUL__MFHZ))) {
|
||||
stable = 0;
|
||||
FH_TUERMODUL__MFHZ_copy = 0;
|
||||
sc_FH_TUERMODUL_CTRL_2352_1 = time;
|
||||
sc_FH_TUERMODUL_CTRL_2352_1 = bm_time;
|
||||
|
||||
B_FH_TUERMODUL_CTRL_next_state = 2;
|
||||
NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3;
|
||||
|
@ -657,7 +657,7 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
SYS_bit_clr(Bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX);
|
||||
FH_TUERMODUL__MFHZ_copy = 0;
|
||||
|
||||
sc_FH_TUERMODUL_CTRL_1781_10 = time;
|
||||
sc_FH_TUERMODUL_CTRL_1781_10 = bm_time;
|
||||
FH_TUERMODUL__MFHA_copy = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -715,7 +715,7 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 1;
|
||||
SYS_bit_clr(Bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX);
|
||||
|
||||
sc_FH_TUERMODUL_CTRL_1739_10 = time;
|
||||
sc_FH_TUERMODUL_CTRL_1739_10 = bm_time;
|
||||
FH_TUERMODUL__MFHA_copy = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -799,7 +799,7 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
if ((step == 1 &&
|
||||
tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL !=
|
||||
0 &&
|
||||
(time -
|
||||
(bm_time -
|
||||
tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL ==
|
||||
1)) &&
|
||||
((FH_TUERMODUL__MFHZ || FH_TUERMODUL__MFHA))) {
|
||||
|
@ -817,7 +817,8 @@ void generic_FH_TUERMODUL_CTRL(void) {
|
|||
{
|
||||
if ((step == 1 &&
|
||||
tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL != 0 &&
|
||||
(time - tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL == 3)) &&
|
||||
(bm_time - tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL ==
|
||||
3)) &&
|
||||
(((!(FH_TUERMODUL__MFHZ || FH_TUERMODUL__MFHA)) &&
|
||||
FH_TUERMODUL_CTRL__N > 0))) {
|
||||
stable = 0;
|
||||
|
@ -965,7 +966,7 @@ void generic_BLOCK_ERKENNUNG_CTRL(void) {
|
|||
if (step == 1 &&
|
||||
tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy !=
|
||||
0 &&
|
||||
(time -
|
||||
(bm_time -
|
||||
tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy ==
|
||||
0.002)) {
|
||||
BLOCK_ERKENNUNG_CTRL__N = BLOCK_ERKENNUNG_CTRL__N + 1;
|
||||
|
@ -1001,7 +1002,7 @@ void generic_BLOCK_ERKENNUNG_CTRL(void) {
|
|||
}
|
||||
|
||||
void FH_DU(void) {
|
||||
time = 1; /**SYS_get_clock()**/
|
||||
bm_time = 1; /**SYS_get_clock()**/
|
||||
stable = 0;
|
||||
step = 0;
|
||||
while (!stable) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# SRC_FILES := beebsc.c benchmark.c
|
||||
SRC_FILES := $(wildcard src/*/*.c)
|
||||
SRC_FILES += $(wildcard *.c)
|
||||
|
||||
# include $(APPDIR)/Application.mk
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
|
@ -12,14 +12,16 @@
|
|||
#ifndef BEEBSC_H
|
||||
#define BEEBSC_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* BEEBS fixes RAND_MAX to its lowest permitted value, 2^15-1 */
|
||||
|
||||
#ifdef RAND_MAX
|
||||
#undef RAND_MAX
|
||||
#define RAND_MAX ((1U << 15) - 1)
|
||||
#endif
|
||||
#define RAND_MAX ((1U << 15) - 1)
|
||||
|
||||
/* Common understanding of a "small value" (epsilon) for floating point
|
||||
comparisons. */
|
||||
|
@ -36,10 +38,13 @@
|
|||
|
||||
This function just*/
|
||||
|
||||
// #define assert_beebs(expr) \
|
||||
// { \
|
||||
// if (!(expr)) exit(1); \
|
||||
// }
|
||||
|
||||
#define assert_beebs(expr) \
|
||||
{ \
|
||||
if (!(expr)) exit(1); \
|
||||
}
|
||||
{ assert(expr); }
|
||||
|
||||
#define float_eq_beebs(exp, actual) (fabsf(exp - actual) < VERIFY_FLOAT_EPS)
|
||||
#define float_neq_beebs(exp, actual) !float_eq_beebs(exp, actual)
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <stdio.h>
|
||||
#include <support.h>
|
||||
#include <time.h>
|
||||
#include <transform.h>
|
||||
|
||||
extern benchmark_handle mont64_handle;
|
||||
extern benchmark_handle crc32_handle;
|
||||
|
@ -31,6 +32,7 @@ extern benchmark_handle libwikisort_handle;
|
|||
typedef struct BenchmarkPair {
|
||||
benchmark_handle *handle;
|
||||
char name[15];
|
||||
pthread_t task_ptr;
|
||||
float time;
|
||||
} BenchmarkPair;
|
||||
|
||||
|
@ -43,7 +45,7 @@ BenchmarkPair bmh_list[] = {
|
|||
{.handle = &huffbench_handle, .name = "huffbench", .time = 0}, //
|
||||
{.handle = &matmult_int_handle, .name = "matmult-int", .time = 0}, //
|
||||
{.handle = &libminver_handle, .name = "libminver", .time = 0}, //
|
||||
{.handle = &nobody_handle, .name = "nobody", .time = 0}, //
|
||||
{.handle = &nobody_handle, .name = "nbody", .time = 0}, //
|
||||
{.handle = &nettle_aes_handle, .name = "nettle-aes", .time = 0}, //
|
||||
{.handle = &nettle_sha256_handle, .name = "nettle-sha256", .time = 0}, //
|
||||
{.handle = &libnsichneu_handle, .name = "libnsichneu", .time = 0}, //
|
||||
|
@ -63,24 +65,23 @@ BenchmarkPair bmh_list[] = {
|
|||
float benchmark_time[25];
|
||||
|
||||
extern benchmark_handle *get_benchmark_list();
|
||||
extern void add_benchmark_handle(benchmark_handle *);
|
||||
extern void add_benchmark_handle(benchmark_handle *head, benchmark_handle *);
|
||||
|
||||
int store_idx = 0;
|
||||
float tmp_diff = 0.0;
|
||||
|
||||
float global_diff = 0.0;
|
||||
clock_t start_time = 0, end_time = 0;
|
||||
void start_trigger(void) { start_time = clock(); }
|
||||
void stop_trigger(void) { end_time = clock(); }
|
||||
void start_trigger(clock_t *start_time) { *start_time = PrivGetTickTime(); }
|
||||
void stop_trigger(clock_t *end_time) { *end_time = PrivGetTickTime(); }
|
||||
|
||||
void init_benchmark_runset() {
|
||||
void init_benchmark_runset(benchmark_handle *head) {
|
||||
int i = 0;
|
||||
while (bmh_list[i].handle != NULL) {
|
||||
add_benchmark_handle(bmh_list[i++].handle);
|
||||
add_benchmark_handle(head, bmh_list[i++].handle);
|
||||
}
|
||||
global_diff = 0;
|
||||
}
|
||||
void organize_result(const benchmark_handle *handle) {
|
||||
tmp_diff = (float)(end_time - start_time) / CLOCKS_PER_SEC;
|
||||
void organize_result(const benchmark_handle *handle, clock_t start_time,
|
||||
clock_t end_time) {
|
||||
tmp_diff = (float)(end_time - start_time) / TICK_PER_SECOND;
|
||||
global_diff += tmp_diff;
|
||||
int i = 0;
|
||||
while (bmh_list[i].handle != NULL) {
|
||||
|
@ -101,42 +102,69 @@ void print_result() {
|
|||
}
|
||||
};
|
||||
|
||||
int run_benchmark() {
|
||||
int i = 0;
|
||||
int done_cnt = 0;
|
||||
pthread_mutex_t case_mu;
|
||||
sem_t syn_sem;
|
||||
void *run_one_example(void *arg) {
|
||||
const benchmark_handle *handle = arg;
|
||||
assert(handle != NULL);
|
||||
clock_t start_time = 0, end_time = 0;
|
||||
handle->handle.benchmark_func->initialise_benchmark();
|
||||
handle->handle.benchmark_func->warm_caches(WARMUP_HEAT);
|
||||
start_trigger(&start_time);
|
||||
volatile int result = handle->handle.benchmark_func->benchmark();
|
||||
stop_trigger(&end_time);
|
||||
|
||||
int correct = handle->handle.benchmark_func->verify_benchmark(result);
|
||||
if (!correct) {
|
||||
printf("[EmBench] Wrong result!.\n");
|
||||
}
|
||||
PrivMutexObtain(&case_mu);
|
||||
organize_result(handle, start_time, end_time);
|
||||
PrivMutexAbandon(&case_mu);
|
||||
PrivSemaphoreAbandon(&syn_sem);
|
||||
done_cnt++;
|
||||
}
|
||||
|
||||
pthread_attr_t case_attr;
|
||||
void *run_benchmark(void *args) {
|
||||
done_cnt = 0;
|
||||
volatile int result;
|
||||
int correct;
|
||||
|
||||
init_benchmark_runset();
|
||||
benchmark_handle head = {
|
||||
.handle.magic_number = MAGIC_NUMBER,
|
||||
.next = NULL,
|
||||
};
|
||||
init_benchmark_runset(&head);
|
||||
printf("[BENCHMARK] Start Benchmark running.\n");
|
||||
|
||||
benchmark_handle *cur_handle = get_benchmark_list()->next;
|
||||
case_attr.schedparam.sched_priority = 30;
|
||||
case_attr.stacksize = 16384;
|
||||
PrivSemaphoreCreate(&syn_sem, 0, -20);
|
||||
PrivMutexCreate(&case_mu, 0);
|
||||
|
||||
benchmark_handle *cur_handle = head.next;
|
||||
while (NULL != cur_handle) {
|
||||
assert(cur_handle->handle.magic_number != MAGIC_NUMBER);
|
||||
cur_handle->handle.benchmark_func->initialise_benchmark();
|
||||
cur_handle->handle.benchmark_func->warm_caches(WARMUP_HEAT);
|
||||
|
||||
start_trigger();
|
||||
result = cur_handle->handle.benchmark_func->benchmark();
|
||||
stop_trigger();
|
||||
|
||||
correct = cur_handle->handle.benchmark_func->verify_benchmark(result);
|
||||
if (!correct) {
|
||||
printf("[EmBench] Wrong result!.\n");
|
||||
break;
|
||||
}
|
||||
organize_result(cur_handle);
|
||||
PrivTaskCreate(&cur_handle->task_ptr, &case_attr, run_one_example,
|
||||
(void *)cur_handle);
|
||||
|
||||
cur_handle = cur_handle->next;
|
||||
}
|
||||
|
||||
struct timespec abstime;
|
||||
abstime.tv_sec = 10;
|
||||
PrivSemaphoreObtainWait(&syn_sem, &abstime);
|
||||
print_result();
|
||||
return (!correct);
|
||||
printf("[BENCHMARK] Global Time Diff: %f, Done: %d\n", global_diff, done_cnt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int embenchmark() {
|
||||
run_benchmark();
|
||||
printf("[BENCHMARK] Global Time Diff: %f\n", global_diff);
|
||||
static int embenchmark(void) {
|
||||
run_benchmark(NULL);
|
||||
return 0;
|
||||
}
|
||||
PRIV_SHELL_CMD_FUNCTION(embenchmark, run embenchmark, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
PRIV_SHELL_CMD_FUNCTION(embenchmark, benchmark, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,8 +27,9 @@
|
|||
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <transform.h>
|
||||
|
||||
#define CPU_MHZ 1000
|
||||
#define CPU_MHZ 5
|
||||
|
||||
/* Benchmarks must implement verify_benchmark, which must return -1 if no
|
||||
verification is done. */
|
||||
|
@ -38,8 +39,6 @@ static int verify_benchmark(int result);
|
|||
/* Standard functions implemented for each board */
|
||||
|
||||
void initialise_board(void);
|
||||
void start_trigger(void);
|
||||
void stop_trigger(void);
|
||||
|
||||
/* Every benchmark implements this for one-off data initialization. This is
|
||||
only used for initialization that is independent of how often benchmark ()
|
||||
|
@ -80,6 +79,7 @@ typedef struct benchmark_handle {
|
|||
benchmark_t *benchmark_func;
|
||||
} handle;
|
||||
struct benchmark_handle *next;
|
||||
pthread_t task_ptr;
|
||||
} benchmark_handle;
|
||||
|
||||
static benchmark_handle *get_benchmark_list() {
|
||||
|
@ -90,7 +90,7 @@ static benchmark_handle *get_benchmark_list() {
|
|||
return &head;
|
||||
}
|
||||
|
||||
static void add_benchmark_handle(benchmark_handle *bh) {
|
||||
static void add_benchmark_handle(benchmark_handle *head, benchmark_handle *bh) {
|
||||
if (NULL == bh) {
|
||||
return;
|
||||
}
|
||||
|
@ -102,8 +102,8 @@ static void add_benchmark_handle(benchmark_handle *bh) {
|
|||
NULL == bh->handle.benchmark_func->verify_benchmark) {
|
||||
return;
|
||||
}
|
||||
bh->next = get_benchmark_list()->next;
|
||||
get_benchmark_list()->next = bh;
|
||||
bh->next = head->next;
|
||||
head->next = bh;
|
||||
}
|
||||
|
||||
/* Local simplified versions of library functions */
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
__STACKSIZE__ = 4096;
|
||||
__STACKSIZE__ = 16384;
|
||||
OUTPUT_ARCH( "riscv" )
|
||||
MEMORY
|
||||
{
|
||||
|
|
|
@ -497,7 +497,7 @@ endif
|
|||
|
||||
endif
|
||||
|
||||
# ifeq ($(CONFIG_BENCHMARK), y)
|
||||
ifeq ($(CONFIG_APP_BENCHMARK), y)
|
||||
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/support
|
||||
KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/cubic \
|
||||
-I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/picojpeg \
|
||||
|
@ -505,7 +505,7 @@ KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/c
|
|||
-I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/sglib-combined \
|
||||
-I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/slre \
|
||||
-lm
|
||||
# endif
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(CONFIG_TOOL_SHELL), y)
|
||||
|
|
Loading…
Reference in New Issue