diff options
Diffstat (limited to 'gcell/src/apps/benchmark_nop.cc')
-rw-r--r-- | gcell/src/apps/benchmark_nop.cc | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/gcell/src/apps/benchmark_nop.cc b/gcell/src/apps/benchmark_nop.cc new file mode 100644 index 000000000..7ef3f636e --- /dev/null +++ b/gcell/src/apps/benchmark_nop.cc @@ -0,0 +1,162 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007 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. + */ + +#include "gc_job_manager.h" +#include "mb_time.h" +#include <getopt.h> +#include <stdlib.h> +#include <stdio.h> + +// handle to embedded SPU executable that contains benchmark routines +// (The name of the variable (benchmark_procs) is the name of the spu executable.) +extern spe_program_handle_t benchmark_procs; + +static gc_proc_id_t gcp_benchmark_udelay = GCP_UNKNOWN_PROC; + +static void +init_jd(gc_job_desc *jd, unsigned int usecs) +{ + jd->proc_id = gcp_benchmark_udelay; + jd->input.nargs = 1; + jd->input.arg[0].u32 = usecs; + jd->output.nargs = 0; + jd->eaa.nargs = 0; +} + +static void +run_test(unsigned int nspes, unsigned int usecs, int njobs) +{ + static const int NJDS = 64; + int nsubmitted = 0; + int ncompleted = 0; + gc_job_desc *all_jds[NJDS]; + gc_job_desc *jds[2][NJDS]; + unsigned int njds[2]; + unsigned int ci; // current index + bool done[NJDS]; + + gc_jm_options opts; + opts.program_handle = &benchmark_procs; + opts.nspes = nspes; + opts.gang_schedule = true; + gc_job_manager *mgr = gc_make_job_manager(&opts); + + if ((gcp_benchmark_udelay = mgr->lookup_proc("benchmark_udelay")) == GCP_UNKNOWN_PROC){ + fprintf(stderr, "lookup_proc: failed to find \"benchmark_udelay\"\n"); + return; + } + + // allocate and init all job descriptors + for (int i = 0; i < NJDS; i++){ + all_jds[i] = mgr->alloc_job_desc(); + init_jd(all_jds[i], usecs); + } + + mb_time t_start = mb_time::time(); + + ci = 0; + njds[0] = 0; + njds[1] = 0; + + // submit the first batch + for (int i = 0; i < NJDS; i++){ + if (mgr->submit_job(all_jds[i])){ + jds[ci][njds[ci]++] = all_jds[i]; + nsubmitted++; + } + else { + printf("submit_job(jds[%d]) failed, status = %d\n", + i, all_jds[i]->status); + } + } + + while (ncompleted < njobs){ + njds[ci^1] = 0; + int n = mgr->wait_jobs(njds[ci], jds[ci], done, GC_WAIT_ANY); + // printf("%2d\n", n); + if (n < 0){ + fprintf(stderr, "mgr->wait_jobs failed\n"); + break; + } + for (unsigned int i = 0; i < njds[ci]; i++){ + if (!done[i]){ // remember for next iteration + jds[ci^1][njds[ci^1]++] = jds[ci][i]; + } + else { + ncompleted++; + // printf("ncompleted = %7d\n", ncompleted); + if (nsubmitted < njobs){ // submit another one + if (mgr->submit_job(jds[ci][i])){ + jds[ci^1][njds[ci^1]++] = jds[ci][i]; // remember for next iter + nsubmitted++; + } + else { + printf("submit_job(jds[%d]) failed, status = %d\n", + i, jds[ci][i]->status); + } + } + } + } + ci ^= 1; // toggle current + } + + // stop timing + mb_time t_stop = mb_time::time(); + double delta = (t_stop - t_start).double_time(); + printf("nspes: %2d udelay: %4d elapsed_time: %7.3f njobs: %g speedup: %6.3f\n", + mgr->nspes(), usecs, delta, (double) njobs, + njobs * usecs * 1e-6 / delta); + + delete mgr; +} + +int +main(int argc, char **argv) +{ + unsigned int nspes = 0; + unsigned int usecs = 0; + int njobs = 500000; + int ch; + + while ((ch = getopt(argc, argv, "n:u:N:")) != EOF){ + switch(ch){ + case 'n': + nspes = strtol(optarg, 0, 0); + break; + + case 'u': + usecs = strtol(optarg, 0, 0); + break; + + case 'N': + njobs = strtol(optarg, 0, 0); + break; + + case '?': + default: + fprintf(stderr, "usage: benchmark_nop [-n <nspes>] [-u <udelay>] [-N <njobs>]\n"); + return 1; + } + } + + run_test(nspes, usecs, njobs); + return 0; +} |