diff options
Diffstat (limited to 'libdimension')
-rw-r--r-- | libdimension/bench/Makefile.am | 5 | ||||
-rw-r--r-- | libdimension/bench/future.c | 67 |
2 files changed, 71 insertions, 1 deletions
diff --git a/libdimension/bench/Makefile.am b/libdimension/bench/Makefile.am index 09530ff..934657c 100644 --- a/libdimension/bench/Makefile.am +++ b/libdimension/bench/Makefile.am @@ -1,5 +1,5 @@ ########################################################################### -## Copyright (C) 2009-2011 Tavian Barnes <tavianator@tavianator.com> ## +## Copyright (C) 2009-2013 Tavian Barnes <tavianator@tavianator.com> ## ## ## ## This file is part of The Dimension Build Suite. ## ## ## @@ -20,6 +20,7 @@ EXTRA_PROGRAMS = array.bench \ geometry.bench \ polynomial.bench \ + future.bench \ prtree.bench AM_CFLAGS = $(libsandglass_CFLAGS) -fno-inline -I$(top_srcdir)/libdimension @@ -28,6 +29,7 @@ AM_LDFLAGS = $(libsandglass_LIBS) $(top_builddir)/libdimension/libdimension.la array_bench_SOURCES = array.c geometry_bench_SOURCES = geometry.c polynomial_bench_SOURCES = polynomial.c +future_bench_SOURCES = future.c prtree_bench_SOURCES = prtree.c prtree_bench_CFLAGS = $(AM_CFLAGS) -finline @@ -35,6 +37,7 @@ bench: $(EXTRA_PROGRAMS) ./array.bench ./geometry.bench ./polynomial.bench + ./future.bench ./prtree.bench clean-local: diff --git a/libdimension/bench/future.c b/libdimension/bench/future.c new file mode 100644 index 0000000..7b199c7 --- /dev/null +++ b/libdimension/bench/future.c @@ -0,0 +1,67 @@ +/************************************************************************* + * Copyright (C) 2009-2013 Tavian Barnes <tavianator@tavianator.com> * + * * + * This file is part of The Dimension Benchmark Suite. * + * * + * The Dimension Benchmark Suite is free software; you can redistribute * + * it and/or modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Benchmark Suite 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. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +#include "../platform.c" +#include "../future.c" +#include "../threads.c" +#include <sandglass.h> +#include <stdlib.h> + +#define ITERATIONS 100000 + +static int +dmnsn_bench_future(void *ptr, unsigned int thread, unsigned int nthreads) +{ + dmnsn_future *future = (dmnsn_future *)ptr; + for (int i = 0; i < ITERATIONS; ++i) { + dmnsn_future_increment(future); + } + return 0; +} + +static int +dmnsn_bench_thread(void *ptr) +{ + size_t nthreads = 2*dmnsn_ncpus(); + + dmnsn_future *future = (dmnsn_future *)ptr; + dmnsn_future_set_total(future, nthreads*ITERATIONS); + + return dmnsn_execute_concurrently(&dmnsn_bench_future, future, nthreads); +} + +int +main(void) +{ + dmnsn_timer timer1, timer2; + dmnsn_future *future = dmnsn_new_future(); + + dmnsn_timer_start(&timer1); + dmnsn_timer_start(&timer2); + + dmnsn_new_thread(future, &dmnsn_bench_thread, future); + + dmnsn_future_wait(future, 0.5); + dmnsn_timer_stop(&timer1); + printf(" 50%%: " DMNSN_TIMER_FORMAT "\n", DMNSN_TIMER_PRINTF(timer1)); + + dmnsn_future_join(future); + dmnsn_timer_stop(&timer2); + printf("100%%: " DMNSN_TIMER_FORMAT "\n", DMNSN_TIMER_PRINTF(timer2)); +} |