benchmarks/dhrystone: Port to RTEMS

Update #2958.
This commit is contained in:
Sebastian Huber
2017-03-28 13:44:45 +02:00
parent 317c1f41ea
commit 954ca41055
7 changed files with 129 additions and 34 deletions

View File

@@ -1,5 +1,5 @@
rtems_tests_PROGRAMS = dhrystone
dhrystone_SOURCES = init.c
dhrystone_SOURCES = init.c dhry_1.c dhry_2.c
dist_rtems_tests_DATA = dhrystone.scn dhrystone.doc
@@ -8,6 +8,7 @@ include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
AM_CFLAGS += -fno-inline -fno-builtin
LINK_OBJS = $(dhrystone_OBJECTS)
LINK_LIBS = $(dhrystone_LDLIBS)

View File

@@ -345,6 +345,8 @@
***************************************************************************
*/
#define TIME
/* Compiler and system dependent definitions: */
#ifndef TIME
@@ -420,4 +422,14 @@ typedef struct record
} variant;
} Rec_Type, *Rec_Pointer;
void Proc_1 (Rec_Pointer);
void Proc_2 (One_Fifty *);
void Proc_3 (Rec_Pointer *);
void Proc_4 (void);
void Proc_5 (void);
void Proc_6 (Enumeration, Enumeration *);
void Proc_7 (One_Fifty, One_Fifty, One_Fifty *);
void Proc_8 (Arr_1_Dim, Arr_2_Dim, int, int);
Enumeration Func_1 (Capital_Letter, Capital_Letter);
Boolean Func_2 (Str_30, Str_30);
Boolean Func_3 (Enumeration);

View File

@@ -17,6 +17,9 @@
#include "dhry.h"
#include <stdlib.h>
#include <string.h>
/* Global Variables: */
Rec_Pointer Ptr_Glob,
@@ -28,10 +31,6 @@ char Ch_1_Glob,
int Arr_1_Glob [50];
int Arr_2_Glob [50] [50];
extern char *malloc ();
Enumeration Func_1 ();
/* forward declaration necessary since Enumeration may not simply be int */
#ifndef REG
Boolean Reg = false;
#define REG
@@ -51,22 +50,30 @@ extern int times ();
/* Measurements should last at least about 2 seconds */
#endif
#ifdef TIME
extern long time();
#include <sys/time.h>
/* see library function "time" */
#define time(x) Time()
static double Time(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6;
}
#define Too_Small_Time 2
/* Measurements should last at least 2 seconds */
#endif
long Begin_Time,
double Begin_Time,
End_Time,
User_Time;
float Microseconds,
double Microseconds,
Dhrystones_Per_Second;
/* end of variables for time measurement */
main ()
int main (int argc, char **argv)
/*****/
/* main program, corresponds to procedures */
@@ -114,14 +121,13 @@ main ()
printf ("Program compiled without 'register' attribute\n");
printf ("\n");
}
printf ("Please give the number of runs through the benchmark: ");
{
int n;
scanf ("%d", &n);
Number_Of_Runs = n;
}
printf ("\n");
Number_Of_Runs = atoi(argv[1]);
if (Number_Of_Runs < 1) {
return 1;
}
execution_start:
printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs);
/***************/
@@ -254,13 +260,14 @@ main ()
printf ("Measured time too small to obtain meaningful results\n");
printf ("Please increase number of runs\n");
printf ("\n");
Number_Of_Runs *= 2;
goto execution_start;
}
else
{
#ifdef TIME
Microseconds = (float) User_Time * Mic_secs_Per_Second
/ (float) Number_Of_Runs;
Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time;
Microseconds = User_Time * Mic_secs_Per_Second / Number_Of_Runs;
Dhrystones_Per_Second = Number_Of_Runs / User_Time;
#else
Microseconds = (float) User_Time * Mic_secs_Per_Second
/ ((float) HZ * ((float) Number_Of_Runs));
@@ -271,13 +278,15 @@ main ()
printf ("%6.1f \n", Microseconds);
printf ("Dhrystones per Second: ");
printf ("%6.1f \n", Dhrystones_Per_Second);
printf ("DMIPS: ");
printf ("%5.2f \n", Dhrystones_Per_Second / 1757.0);
printf ("\n");
}
}
Proc_1 (Ptr_Val_Par)
void Proc_1 (Ptr_Val_Par)
/******************/
REG Rec_Pointer Ptr_Val_Par;
@@ -311,7 +320,7 @@ REG Rec_Pointer Ptr_Val_Par;
} /* Proc_1 */
Proc_2 (Int_Par_Ref)
void Proc_2 (Int_Par_Ref)
/******************/
/* executed once */
/* *Int_Par_Ref == 1, becomes 4 */
@@ -334,7 +343,7 @@ One_Fifty *Int_Par_Ref;
} /* Proc_2 */
Proc_3 (Ptr_Ref_Par)
void Proc_3 (Ptr_Ref_Par)
/******************/
/* executed once */
/* Ptr_Ref_Par becomes Ptr_Glob */
@@ -349,7 +358,7 @@ Rec_Pointer *Ptr_Ref_Par;
} /* Proc_3 */
Proc_4 () /* without parameters */
void Proc_4 (void) /* without parameters */
/*******/
/* executed once */
{
@@ -361,7 +370,7 @@ Proc_4 () /* without parameters */
} /* Proc_4 */
Proc_5 () /* without parameters */
void Proc_5 (void) /* without parameters */
/*******/
/* executed once */
{

View File

@@ -17,6 +17,8 @@
#include "dhry.h"
#include <string.h>
#ifndef REG
#define REG
/* REG becomes defined as empty */
@@ -27,7 +29,7 @@ extern int Int_Glob;
extern char Ch_1_Glob;
Proc_6 (Enum_Val_Par, Enum_Ref_Par)
void Proc_6 (Enum_Val_Par, Enum_Ref_Par)
/*********************************/
/* executed once */
/* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
@@ -61,7 +63,7 @@ Enumeration *Enum_Ref_Par;
} /* Proc_6 */
Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref)
void Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref)
/**********************************************/
/* executed three times */
/* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */
@@ -81,7 +83,7 @@ One_Fifty *Int_Par_Ref;
} /* Proc_7 */
Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val)
void Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val)
/*********************************************************************/
/* executed once */
/* Int_Par_Val_1 == 3 */

View File

@@ -4,8 +4,10 @@ test set name: dhrystone
directives:
TBD
None, this benchmark program depends on the compiler, standard libraries, the
processor and the memory system. It is more or less independent of the
operating system, except some disturbance from the system clock service.
concepts:
TBD
This is the dhrystone benchmark ported to RTEMS.

View File

@@ -0,0 +1,63 @@
*** BEGIN OF TEST DHRYSTONE ***
Dhrystone Benchmark, Version 2.1 (Language: C)
Program compiled without 'register' attribute
Execution starts, 1000000 runs through Dhrystone
Execution ends
Final values of the variables used in the benchmark:
Int_Glob: 5
should be: 5
Bool_Glob: 1
should be: 1
Ch_1_Glob: A
should be: A
Ch_2_Glob: B
should be: B
Arr_1_Glob[8]: 7
should be: 7
Arr_2_Glob[8][7]: 1000010
should be: Number_Of_Runs + 10
Ptr_Glob->
Ptr_Comp: 33770520
should be: (implementation-dependent)
Discr: 0
should be: 0
Enum_Comp: 2
should be: 2
Int_Comp: 17
should be: 17
Str_Comp: DHRYSTONE PROGRAM, SOME STRING
should be: DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
Ptr_Comp: 33770520
should be: (implementation-dependent), same as above
Discr: 0
should be: 0
Enum_Comp: 1
should be: 1
Int_Comp: 18
should be: 18
Str_Comp: DHRYSTONE PROGRAM, SOME STRING
should be: DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc: 5
should be: 5
Int_2_Loc: 13
should be: 13
Int_3_Loc: 7
should be: 7
Enum_Loc: 1
should be: 1
Str_1_Loc: DHRYSTONE PROGRAM, 1'ST STRING
should be: DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc: DHRYSTONE PROGRAM, 2'ND STRING
should be: DHRYSTONE PROGRAM, 2'ND STRING
Microseconds for one run through Dhrystone: 82.8
Dhrystones per Second: 12078.2
DMIPS: 6.87
*** END OF TEST DHRYSTONE ***

View File

@@ -20,15 +20,19 @@
const char rtems_test_name[] = "DHRYSTONE";
static void test(void)
{
}
int main(int argc, char **argv);
static void Init(rtems_task_argument arg)
{
char *argv[] = {
"dhrystone",
"1000000",
NULL
};
TEST_BEGIN();
test();
main(2, argv);
TEST_END();
rtems_test_exit(0);
@@ -41,6 +45,8 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_INIT