Re: [PATCH v1] commands: Add dhrystone
On Fr, 2015-07-24 at 13:41 +0200, Daniel Schultz wrote: At the end of the do_dhrystone function: if (user_time TOO_SMALL_TIME) { number_of_runs = number_of_runs * 10; new_argv[0] = argv[0]; sprintf(tmp_str, %i, number_of_runs); new_argv[1] = tmp_str; printf(Measured time too small to obtain meaningful results\n); printf(or a timer wrap happend. I will increase the number\n); printf(of runs by *10 to %d\n, number_of_runs); printf(user_time: %llu ns\n, user_time); do_dhrystone(2, new_argv); ... I'm sure there is a better solution. Why not just loop for a few seconds? Regards, Jan -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0| Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917- | ___ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
Re: [PATCH v1] commands: Add dhrystone
On Thu, Jul 23, 2015 at 10:01:32AM +0200, Daniel Schultz wrote: This tool will help to measure the system performance. Some SoCs haven't the possibility to route their clocks to the output pins. So you can use dhrystone to get a feedback about the clock speed. Signed-off-by: Daniel Schultz d.schu...@phytec.de --- Changes: v1: applied RFC suggestions: -removed 'default n' in Kconfig -refactored time defines with default time units -only print variable values when values are wrong -added units to printf -the iteration parameter is now optional. The programm starts with 1 iterations and adjust higher, when execution time is too short. I can see that the parameter is now optional, but I can't find the code which adjusts the number of iterations. Am I missing something? -changed variable name (microseconds - nanoseconds) -corrected the command description commands/Kconfig | 6 + commands/Makefile| 1 + commands/dhrystone.c | 466 +++ 3 files changed, 473 insertions(+) create mode 100644 commands/dhrystone.c diff --git a/commands/Kconfig b/commands/Kconfig index bb6674e..30485c0 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -2102,6 +2102,12 @@ config CMD_STATE depends on STATE prompt state +config CMD_DHRYSTONE + bool + prompt dhrystone + help + CPU benchmark tool + # end Miscellaneous commands endmenu diff --git a/commands/Makefile b/commands/Makefile index 3698347..879caec 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -112,3 +112,4 @@ obj-$(CONFIG_CMD_NV) += nv.o obj-$(CONFIG_CMD_DEFAULTENV) += defaultenv.o obj-$(CONFIG_CMD_STATE) += state.o obj-$(CONFIG_CMD_DHCP) += dhcp.o +obj-$(CONFIG_CMD_DHRYSTONE) += dhrystone.o diff --git a/commands/dhrystone.c b/commands/dhrystone.c new file mode 100644 index 000..e965011 --- /dev/null +++ b/commands/dhrystone.c @@ -0,0 +1,466 @@ +/* + * (C) Copyright 2014 - 2015 Phytec Messtechnik GmbH + * Author: Stefan Müller-Klieser s.mueller-klie...@phytec.de + * Author: Daniel Schultz d.schu...@phytec.de + * + * based on DHRYSTONE Benchmark Program + * Version:C, Version 2.1 + * Date: May 25, 1988 + * Author: Reinhold P. Weicker + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include common.h +#include command.h +#include errno.h +#include clock.h +#include asm-generic/div64.h +#include malloc.h +#include stdbool.h +#include stdio.h /* for strcpy, strcmp */ + +enum idents {ident_1, ident_2, ident_3, ident_4, ident_5}; + +/* General definitions: */ + +struct record { + struct record *ptr_comp; + enum idents discr; + union { + struct { + enum idents enum_comp; + int int_comp; + charstr_comp[31]; + } var_1; + struct { + enum idents enum_comp_2; + charstr_2_comp[31]; + } var_2; + struct { + char char_1_Comp; + char char_2_Comp; + } var_3; + } variant; +}; + +/* Global Variables: */ + +struct record*record_glob; +struct record*next_record_glob; +int int_glob; +bool bool_glob; +char char_1_glob; +char char_2_glob; +int arr_1_glob[50]; +int arr_2_glob[50][50]; These should all be static. + +/* variables for time measurement: */ + +#define TOO_SMALL_TIME (50 * MSECOND) +/* Measurements should last at least 50mseconds */ +#define TOO_LARGE_TIME (2 * SECOND) + +u64 begin_time; +u64 end_time; +u64 user_time; +u64 nanoseconds; +u64 dhrystones_per_second; These should probably be local variables in do_dhrystone(). +/* end of variables for time measurement */ + +enum idents compare_chars(char char_1, char char_2) +{ + if (char_1 != char_2) { + return ident_1; + } else { /* should not executed */ + char_1_glob = char_1; + return ident_2; + } +} + +bool compare_strs(char str_1[31], char
[PATCH v1] commands: Add dhrystone
This tool will help to measure the system performance. Some SoCs haven't the possibility to route their clocks to the output pins. So you can use dhrystone to get a feedback about the clock speed. Signed-off-by: Daniel Schultz d.schu...@phytec.de --- Changes: v1: applied RFC suggestions: -removed 'default n' in Kconfig -refactored time defines with default time units -only print variable values when values are wrong -added units to printf -the iteration parameter is now optional. The programm starts with 1 iterations and adjust higher, when execution time is too short. -changed variable name (microseconds - nanoseconds) -corrected the command description commands/Kconfig | 6 + commands/Makefile| 1 + commands/dhrystone.c | 466 +++ 3 files changed, 473 insertions(+) create mode 100644 commands/dhrystone.c diff --git a/commands/Kconfig b/commands/Kconfig index bb6674e..30485c0 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -2102,6 +2102,12 @@ config CMD_STATE depends on STATE prompt state +config CMD_DHRYSTONE + bool + prompt dhrystone + help + CPU benchmark tool + # end Miscellaneous commands endmenu diff --git a/commands/Makefile b/commands/Makefile index 3698347..879caec 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -112,3 +112,4 @@ obj-$(CONFIG_CMD_NV)+= nv.o obj-$(CONFIG_CMD_DEFAULTENV) += defaultenv.o obj-$(CONFIG_CMD_STATE)+= state.o obj-$(CONFIG_CMD_DHCP) += dhcp.o +obj-$(CONFIG_CMD_DHRYSTONE)+= dhrystone.o diff --git a/commands/dhrystone.c b/commands/dhrystone.c new file mode 100644 index 000..e965011 --- /dev/null +++ b/commands/dhrystone.c @@ -0,0 +1,466 @@ +/* + * (C) Copyright 2014 - 2015 Phytec Messtechnik GmbH + * Author: Stefan Müller-Klieser s.mueller-klie...@phytec.de + * Author: Daniel Schultz d.schu...@phytec.de + * + * based on DHRYSTONE Benchmark Program + * Version:C, Version 2.1 + * Date: May 25, 1988 + * Author: Reinhold P. Weicker + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include common.h +#include command.h +#include errno.h +#include clock.h +#include asm-generic/div64.h +#include malloc.h +#include stdbool.h +#include stdio.h /* for strcpy, strcmp */ + +enum idents {ident_1, ident_2, ident_3, ident_4, ident_5}; + +/* General definitions: */ + +struct record { + struct record *ptr_comp; + enum idents discr; + union { + struct { + enum idents enum_comp; + int int_comp; + charstr_comp[31]; + } var_1; + struct { + enum idents enum_comp_2; + charstr_2_comp[31]; + } var_2; + struct { + char char_1_Comp; + char char_2_Comp; + } var_3; + } variant; +}; + +/* Global Variables: */ + +struct record *record_glob; +struct record *next_record_glob; +intint_glob; +bool bool_glob; +char char_1_glob; +char char_2_glob; +intarr_1_glob[50]; +intarr_2_glob[50][50]; + +/* variables for time measurement: */ + +#define TOO_SMALL_TIME (50 * MSECOND) +/* Measurements should last at least 50mseconds */ +#define TOO_LARGE_TIME (2 * SECOND) + +u64 begin_time; +u64 end_time; +u64 user_time; +u64 nanoseconds; +u64 dhrystones_per_second; +/* end of variables for time measurement */ + +enum idents compare_chars(char char_1, char char_2) +{ + if (char_1 != char_2) { + return ident_1; + } else { /* should not executed */ + char_1_glob = char_1; + return ident_2; + } +} + +bool compare_strs(char str_1[31], char str_2[31]) +{ + int offset; + + offset = 2; + while (offset = 2) + if (compare_chars(str_1[offset], str_2[offset+1]) == ident_1) + ++offset; + if (strcmp(str_1, str_2) 0) { + int_glob = offset + 7; + return true; + } else { + return false; +