From f0eb7c327acbeb6a077e516a6790dc155bbf9eb4 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 2 May 2016 23:28:51 +0200 Subject: [PATCH] add benchmark to measure the overhead of common system calls --- hermit/usr/benchmarks/Makefile | 10 ++- hermit/usr/benchmarks/basic.c | 128 +++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 hermit/usr/benchmarks/basic.c diff --git a/hermit/usr/benchmarks/Makefile b/hermit/usr/benchmarks/Makefile index d7d8590d6..c322054c4 100644 --- a/hermit/usr/benchmarks/Makefile +++ b/hermit/usr/benchmarks/Makefile @@ -44,7 +44,7 @@ endif default: all -all: stream hg netio RCCE_pingping RCCE_pingpong +all: stream hg netio RCCE_pingping RCCE_pingpong basic stream.o: stream.c @echo [CC] $@ @@ -58,6 +58,14 @@ stream: stream.o $Q$(ELFEDIT_FOR_TARGET) --output-osabi HermitCore $@ $Qchmod a-x $@.sym +basic: basic.o + @echo [LD] $@ + $Q$(CC_FOR_TARGET) $(LDFLAGS_FOR_TARGET) $(CFLAGS_FOR_TARGET) -o $@ $< + $Q$(OBJCOPY_FOR_TARGET) $(KEEP_DEBUG) $@ $@.sym + $Q$(OBJCOPY_FOR_TARGET) $(STRIP_DEBUG) $@ + $Q$(ELFEDIT_FOR_TARGET) --output-osabi HermitCore $@ + $Qchmod a-x $@.sym + RCCE_pingping: RCCE_pingping.o @echo [LD] $@ $Q$(CC_FOR_TARGET) $(LDFLAGS_FOR_TARGET) $(CFLAGS_FOR_TARGET) -o $@ $< -lircce diff --git a/hermit/usr/benchmarks/basic.c b/hermit/usr/benchmarks/basic.c new file mode 100644 index 000000000..d4f2d9b4e --- /dev/null +++ b/hermit/usr/benchmarks/basic.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2016, Stefan Lankes, RWTH Aachen University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __hermit__ +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#ifndef __hermit__ +#include +#include + +static inline long mygetpid(void) +{ + return syscall(__NR_getpid); +} + +static inline void reschedule(void) +{ + sched_yield(); +} +#else +static inline long mygetpid(void) +{ + return getpid(); +} + +void reschedule(void); +#endif + +#define N 10000 +#define M (1024) +#define BUFFSZ (1ULL*1024ULL*1024ULL) + +static char* buff[M]; + +inline static unsigned long long rdtsc(void) +{ + unsigned long lo, hi; + asm volatile ("rdtsc" : "=a"(lo), "=d"(hi) :: "memory"); + return ((unsigned long long) hi << 32ULL | (unsigned long long) lo); +} + +int main(int argc, char** argv) +{ + long i, j, ret; + unsigned long long start, end; + const char str[] = "H"; + size_t len = strlen(str); + + printf("Determine systems performance\n\n"); + + ret = mygetpid(); + ret = mygetpid(); + start = rdtsc(); + for(i=0; i