From 2ab29c74f263c784a640ae67c68ce165aa99186e Mon Sep 17 00:00:00 2001 From: Abe Date: Fri, 25 Jun 2021 16:27:23 -0400 Subject: [PATCH 1/2] Fixed Coremark Score output printing. Also made it so that the loop that sets the iteration count increments iterations by 1 instead by increasing it by a factor of 10 each time (which was overkill for the timing that's needed to exit the loop) --- riscv-coremark/coremark/core_main.c | 45 +++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/riscv-coremark/coremark/core_main.c b/riscv-coremark/coremark/core_main.c index edd1ac46..a2c3ac67 100644 --- a/riscv-coremark/coremark/core_main.c +++ b/riscv-coremark/coremark/core_main.c @@ -211,26 +211,53 @@ MAIN_RETURN_TYPE main(int argc, char *argv[]) { core_init_state(results[0].size,results[i].seed1,results[i].memblock[3]); } } - + + /*int foreverLoop = 1; + secs_ret timing = 0; + int timingInt; + ee_printf("\nENTERING FOREVER WHILE LOOP\n"); + while(foreverLoop == 1) + { + start_time(); + //filler + stop_time(); + timing += time_in_secs(get_time()); + timingInt = (int)timing; + ee_printf("Timing is %d\n", timingInt); + }/* + /* automatically determine number of iterations if not set */ if (results[0].iterations==0) { secs_ret secs_passed=0; ee_u32 divisor; results[0].iterations=1; + int iterationInc = 0; + ee_printf("\n\nENTERING ITERATION WHILE LOOP\n"); while (secs_passed < (secs_ret)1) { - results[0].iterations*=10; + if(iterationInc != 0) + { + results[0].iterations++; + } + ee_printf("iterations is %d\n", results[0].iterations); start_time(); iterate(&results[0]); stop_time(); - secs_passed=time_in_secs(get_time()); + secs_passed = time_in_secs(get_time()); + int secs_passed_int = (int)secs_passed; + ee_printf("secs passed is %d\n", secs_passed_int); + iterationInc++; } + ee_printf("LEAVING ITERATION WHILE LOOP!\n\n"); /* now we know it executes for at least 1 sec, set actual run time at about 10 secs */ divisor=(ee_u32)secs_passed; + ee_printf("divisor is %lu\n", divisor); if (divisor==0) /* some machines cast float to int as 0 since this conversion is not defined by ANSI, but we know at least one second passed */ divisor=1; results[0].iterations*=1+10/divisor; + ee_printf("iterations is %d\n", results[0].iterations); } /* perform actual benchmark */ + ee_printf("Starting benchmark\n"); start_time(); #if (MULTITHREAD>1) if (default_num_contexts>MULTITHREAD) { @@ -249,7 +276,8 @@ MAIN_RETURN_TYPE main(int argc, char *argv[]) { #endif stop_time(); total_time=get_time(); - ee_printf("ending benchmark"); + ee_printf("total time is %u\n", total_time); + ee_printf("ending benchmark\n"); /* get a function of the input to report */ seedcrc=crc16(results[0].seed1,seedcrc); seedcrc=crc16(results[0].seed2,seedcrc); @@ -340,12 +368,17 @@ MAIN_RETURN_TYPE main(int argc, char *argv[]) { for (i=0 ; i Date: Fri, 25 Jun 2021 16:42:03 -0400 Subject: [PATCH 2/2] Updated timing functions to read from MTIME register, TICKS_PER_SEC set to 10000 so timer reads millisecs --- riscv-coremark/riscv64-baremetal/core_portme.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/riscv-coremark/riscv64-baremetal/core_portme.c b/riscv-coremark/riscv64-baremetal/core_portme.c index 8f17cb8b..dab42830 100755 --- a/riscv-coremark/riscv64-baremetal/core_portme.c +++ b/riscv-coremark/riscv64-baremetal/core_portme.c @@ -114,9 +114,10 @@ void portable_free(void *p) { #define read_csr(reg) ({ unsigned long __tmp; \ asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ __tmp; }) - #define GETMYTIME(_t) (*_t=read_csr(cycle)) + #define GETMYTIME(_t) (_t = *(volatile unsigned long long*)0x0200BFF8) #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) - #define TIMER_RES_DIVIDER 1 + // Changing TIMER_RES_DIVIDER to 1000000 sets EE_TICKS_PER_SEC to 1000 (now counting ticks per ms) + #define TIMER_RES_DIVIDER 10000 #define SAMPLE_TIME_IMPLEMENTATION 1 #endif #define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) @@ -132,7 +133,9 @@ static CORETIMETYPE start_time_val, stop_time_val; or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. */ void start_time(void) { - GETMYTIME(&start_time_val ); + GETMYTIME(start_time_val); + ee_printf("Timer started\n"); + ee_printf(" MTIME: %u\n", start_time_val); #if CALLGRIND_RUN CALLGRIND_START_INSTRUMENTATION #endif @@ -153,7 +156,9 @@ void stop_time(void) { #if MICA asm volatile("int3");/*1 */ #endif - GETMYTIME(&stop_time_val ); + GETMYTIME(stop_time_val); + ee_printf("Timer stopped\n"); + ee_printf(" MTIME: %u\n", stop_time_val); } /* Function: get_time Return an abstract "ticks" number that signifies time on the system. @@ -166,6 +171,7 @@ void stop_time(void) { */ CORE_TICKS get_time(void) { CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + ee_printf(" Elapsed MTIME: %u\n", elapsed); return elapsed; } /* Function: time_in_secs @@ -176,13 +182,15 @@ CORE_TICKS get_time(void) { */ secs_ret time_in_secs(CORE_TICKS ticks) { secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + int retvalint = (int)retval; + ee_printf(" RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); return retval; } #else #error "Please implement timing functionality in core_portme.c" #endif /* SAMPLE_TIME_IMPLEMENTATION */ -ee_u32 default_num_contexts=MULTITHREAD; +ee_u32 default_num_contexts = MULTITHREAD; /* Function: portable_init Target specific initialization code