From: eb Date: Mon, 23 Jun 2008 19:42:13 +0000 (+0000) Subject: Renamed benchmark_dotprod to benchmark_dotprod_fff (which it really was). X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=fd2bf069496e39e6be2df18f37e4fec89e09a6a8;p=debian%2Fgnuradio Renamed benchmark_dotprod to benchmark_dotprod_fff (which it really was). Added new script, benchmark_dotprod, which runs all dotprods. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@8674 221aa14e-8319-0410-a670-987f0aec2ac5 --- diff --git a/gnuradio-core/src/tests/Makefile.am b/gnuradio-core/src/tests/Makefile.am index 01e35120..d846613f 100644 --- a/gnuradio-core/src/tests/Makefile.am +++ b/gnuradio-core/src/tests/Makefile.am @@ -35,7 +35,7 @@ EXTRA_DIST = \ test_buffers.py noinst_PROGRAMS = \ - benchmark_dotprod \ + benchmark_dotprod_fff \ benchmark_dotprod_fsf \ benchmark_dotprod_fcc \ benchmark_dotprod_scc \ @@ -50,11 +50,15 @@ noinst_PROGRAMS = \ test_vmcircbuf +noinst_SCRIPTS = \ + benchmark_dotprod + + LIBGNURADIO = $(GNURADIO_CORE_LA) LIBGNURADIOQA = $(top_builddir)/gnuradio-core/src/lib/libgnuradio-core-qa.la $(LIBGNURADIO) -benchmark_dotprod_SOURCES = benchmark_dotprod.cc -benchmark_dotprod_LDADD = $(LIBGNURADIO) +benchmark_dotprod_fff_SOURCES = benchmark_dotprod_fff.cc +benchmark_dotprod_fff_LDADD = $(LIBGNURADIO) benchmark_dotprod_fsf_SOURCES = benchmark_dotprod_fsf.cc benchmark_dotprod_fsf_LDADD = $(LIBGNURADIO) diff --git a/gnuradio-core/src/tests/benchmark_dotprod b/gnuradio-core/src/tests/benchmark_dotprod new file mode 100755 index 00000000..69489e46 --- /dev/null +++ b/gnuradio-core/src/tests/benchmark_dotprod @@ -0,0 +1,46 @@ +#!/bin/sh +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio 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, or (at your option) +# any later version. +# +# GNU Radio 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, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +DIR=. + +tests=" +benchmark_dotprod_fff +benchmark_dotprod_ccf +benchmark_dotprod_ccc +benchmark_dotprod_fcc +benchmark_dotprod_scc +benchmark_dotprod_fsf +" + +echo "uname -a" +uname -a + +if test -e /proc/cpuinfo +then + cat /proc/cpuinfo +fi + +for t in $tests +do + echo + echo "$t": + $DIR/$t +done diff --git a/gnuradio-core/src/tests/benchmark_dotprod.cc b/gnuradio-core/src/tests/benchmark_dotprod.cc deleted file mode 100644 index 56e06450..00000000 --- a/gnuradio-core/src/tests/benchmark_dotprod.cc +++ /dev/null @@ -1,148 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2002 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio 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, or (at your option) - * any later version. - * - * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#include -#include -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif - -#include -#include -#include -#include - -#define TOTAL_TEST_SIZE (40 * 1000 * 1000L) -#define NTAPS 256 -#define BLOCK_SIZE (50 * 1000) /* fits in cache */ - -#if ((TOTAL_TEST_SIZE % BLOCK_SIZE) != 0) -#error "TOTAL_TEST_SIZE % BLOCK_SIZE must equal 0" -#endif - -typedef gr_fir_fff* (*fir_maker_t)(const std::vector &taps); -typedef gr_fir_fff filter_t; - - -static double -timeval_to_double (const struct timeval *tv) -{ - return (double) tv->tv_sec + (double) tv->tv_usec * 1e-6; -} - - -static void -benchmark (fir_maker_t filter_maker, const char *implementation_name) -{ - int i; - float coeffs[NTAPS]; - float input[BLOCK_SIZE + NTAPS]; - long n; - float result; -#ifdef HAVE_SYS_RESOURCE_H - struct rusage rusage_start; - struct rusage rusage_stop; -#else - double clock_start; - double clock_end; -#endif - // setup coefficients and input data - - for (i = 0; i < NTAPS; i++) - coeffs[i] = random() - RANDOM_MAX/2; - - for (i = 0; i < BLOCK_SIZE + NTAPS; i++) - input[i] = random() - RANDOM_MAX/2; - - std::vector taps (&coeffs[0], &coeffs[NTAPS]); - filter_t *f = filter_maker (taps); - - // get starting CPU usage -#ifdef HAVE_SYS_RESOURCE_H - if (getrusage (RUSAGE_SELF, &rusage_start) < 0){ - perror ("getrusage"); - exit (1); - } -#else - clock_start = (double) clock() * (1000000. / CLOCKS_PER_SEC); -#endif - // do the actual work - - for (n = 0; n < TOTAL_TEST_SIZE; n += BLOCK_SIZE){ - int j; - for (j = 0; j < BLOCK_SIZE; j++){ - result = f->filter (&input[j]); - } - } - - // get ending CPU usage -#ifdef HAVE_SYS_RESOURCE_H - if (getrusage (RUSAGE_SELF, &rusage_stop) < 0){ - perror ("getrusage"); - exit (1); - } - - // compute results - - double user = - timeval_to_double (&rusage_stop.ru_utime) - - timeval_to_double (&rusage_start.ru_utime); - - double sys = - timeval_to_double (&rusage_stop.ru_stime) - - timeval_to_double (&rusage_start.ru_stime); - - double total = user + sys; -#else - clock_end = (double) clock () * (1000000. / CLOCKS_PER_SEC); - double total = clock_end -clock_start; -#endif - double macs = NTAPS * (double) TOTAL_TEST_SIZE; - - printf ("%10s: taps: %4d input: %4g cpu: %6.3f taps/sec: %10.4g \n", - implementation_name, NTAPS, (double) TOTAL_TEST_SIZE, total, macs / total); - - delete f; -} - -static void -do_all () -{ - std::vector info; - gr_fir_util::get_gr_fir_fff_info (&info); // get all known FFF implementations - - for (std::vector::iterator p = info.begin (); - p != info.end (); - ++p){ - - benchmark (p->create, p->name); - } -} - -int -main (int argc, char **argv) -{ - do_all (); - return 0; -} diff --git a/gnuradio-core/src/tests/benchmark_dotprod_fff.cc b/gnuradio-core/src/tests/benchmark_dotprod_fff.cc new file mode 100644 index 00000000..56e06450 --- /dev/null +++ b/gnuradio-core/src/tests/benchmark_dotprod_fff.cc @@ -0,0 +1,148 @@ +/* -*- c++ -*- */ +/* + * Copyright 2002 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio 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, or (at your option) + * any later version. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +#include +#include +#include +#include + +#define TOTAL_TEST_SIZE (40 * 1000 * 1000L) +#define NTAPS 256 +#define BLOCK_SIZE (50 * 1000) /* fits in cache */ + +#if ((TOTAL_TEST_SIZE % BLOCK_SIZE) != 0) +#error "TOTAL_TEST_SIZE % BLOCK_SIZE must equal 0" +#endif + +typedef gr_fir_fff* (*fir_maker_t)(const std::vector &taps); +typedef gr_fir_fff filter_t; + + +static double +timeval_to_double (const struct timeval *tv) +{ + return (double) tv->tv_sec + (double) tv->tv_usec * 1e-6; +} + + +static void +benchmark (fir_maker_t filter_maker, const char *implementation_name) +{ + int i; + float coeffs[NTAPS]; + float input[BLOCK_SIZE + NTAPS]; + long n; + float result; +#ifdef HAVE_SYS_RESOURCE_H + struct rusage rusage_start; + struct rusage rusage_stop; +#else + double clock_start; + double clock_end; +#endif + // setup coefficients and input data + + for (i = 0; i < NTAPS; i++) + coeffs[i] = random() - RANDOM_MAX/2; + + for (i = 0; i < BLOCK_SIZE + NTAPS; i++) + input[i] = random() - RANDOM_MAX/2; + + std::vector taps (&coeffs[0], &coeffs[NTAPS]); + filter_t *f = filter_maker (taps); + + // get starting CPU usage +#ifdef HAVE_SYS_RESOURCE_H + if (getrusage (RUSAGE_SELF, &rusage_start) < 0){ + perror ("getrusage"); + exit (1); + } +#else + clock_start = (double) clock() * (1000000. / CLOCKS_PER_SEC); +#endif + // do the actual work + + for (n = 0; n < TOTAL_TEST_SIZE; n += BLOCK_SIZE){ + int j; + for (j = 0; j < BLOCK_SIZE; j++){ + result = f->filter (&input[j]); + } + } + + // get ending CPU usage +#ifdef HAVE_SYS_RESOURCE_H + if (getrusage (RUSAGE_SELF, &rusage_stop) < 0){ + perror ("getrusage"); + exit (1); + } + + // compute results + + double user = + timeval_to_double (&rusage_stop.ru_utime) + - timeval_to_double (&rusage_start.ru_utime); + + double sys = + timeval_to_double (&rusage_stop.ru_stime) + - timeval_to_double (&rusage_start.ru_stime); + + double total = user + sys; +#else + clock_end = (double) clock () * (1000000. / CLOCKS_PER_SEC); + double total = clock_end -clock_start; +#endif + double macs = NTAPS * (double) TOTAL_TEST_SIZE; + + printf ("%10s: taps: %4d input: %4g cpu: %6.3f taps/sec: %10.4g \n", + implementation_name, NTAPS, (double) TOTAL_TEST_SIZE, total, macs / total); + + delete f; +} + +static void +do_all () +{ + std::vector info; + gr_fir_util::get_gr_fir_fff_info (&info); // get all known FFF implementations + + for (std::vector::iterator p = info.begin (); + p != info.end (); + ++p){ + + benchmark (p->create, p->name); + } +} + +int +main (int argc, char **argv) +{ + do_all (); + return 0; +}