int main(int ac, char **av) { int i, max_procs; double overhead = 0; if (ac < 2) { usage: printf("Usage: %s [-s kbytes] processes [processes ...]\n", av[0]); exit(1); } /* * Need 4 byte ints. */ if (sizeof(int) != 4) { fprintf(stderr, "Fix sumit() in ctx.c.\n"); exit(1); } /* * If they specified a context size, get it. */ if (!strcmp(av[1], "-s")) { if (ac < 4) { goto usage; } process_size = atoi(av[2]) * 1024; if (process_size > 0) { data = (int *)calloc(1, max(process_size, CHUNK)); BENCHO(sumit(CHUNK), sumit(0), 0); overhead = gettime(); overhead /= get_n(); overhead *= process_size; overhead /= CHUNK; } ac -= 2; av += 2; } #if defined(sgi) && defined(PIN) ncpus = sysmp(MP_NPROCS); sysmp(MP_MUSTRUN, 0); #endif for (max_procs = atoi(av[1]), i = 1; i < ac; ++i) { int procs = atoi(av[i]); if (max_procs < procs) max_procs = procs; } max_procs = create_pipes(p, max_procs); overhead += pipe_cost(p, max_procs); max_procs = create_daemons(p, pids, max_procs); fprintf(stderr, "\n\"size=%dk ovr=%.2f\n", process_size/1024, overhead); for (i = 1; i < ac; ++i) { double time; int procs = atoi(av[i]); if (procs > max_procs) continue; BENCH(ctx(procs, max_procs), 0); time = usecs_spent(); time /= get_n(); time /= procs; time /= TRIPS; time -= overhead; fprintf(stderr, "%d %.2f\n", procs, time); } /* * Close the pipes and kill the children. */ killem(max_procs); for (i = 0; i < max_procs; ++i) { close(p[i][0]); close(p[i][1]); if (i > 0) { wait(0); } } return (0); }
void fatal_error(char *err) { killem(); fprintf(stderr, "FATAL ERROR: %s\n", err); exit(1); }