home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tests / benchmarks / gausspage.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-05-06  |  1.9 KB  |  105 lines

  1. /*
  2.  * Random page access with
  3.  * a gaussian distribution.
  4.  *
  5.  * Allocate a large (zero fill on demand) address
  6.  * space and fault the pages in a random gaussian
  7.  * order.
  8.  */
  9. #include <math.h>
  10.  
  11. float    rnd(), gauss();
  12. char    *valloc();
  13. int    rand();
  14.  
  15. main(argc, argv)
  16.     char *argv[];
  17. {
  18.     register int pn, i, niter, delta;
  19.     register char *pages;
  20.     float sd = 10.0;
  21.     int npages = 4096, pagesize, debug = 0;
  22.     char *name;
  23.  
  24.     name = argv[0];
  25.     argc--, argv++;
  26. again:
  27.     if (argc < 1) {
  28. usage:
  29.         printf(
  30. "usage: %s [ -d ] [ -k #Kb ] [ -s standard-deviation ] iterations\n", name);
  31.         exit(1);
  32.     }
  33.     if (strcmp(*argv, "-s") == 0) {
  34.         argc--, argv++;
  35.         if (argc < 1)
  36.             goto usage;
  37.         sscanf(*argv, "%f", &sd);
  38.         if (sd <= 0) {
  39.             printf("%s: Bad standard deviation.\n", *argv);
  40.             exit(2);
  41.         }
  42.         argc--, argv++;
  43.         goto again;
  44.     }
  45.     if (strcmp(*argv, "-k") == 0) {
  46.         argc--, argv++;
  47.         if (argc < 1)
  48.             goto usage;
  49.         npages = atoi(*argv);
  50.         if (npages <= 0) {
  51.             printf("%s: Bad virtual memory size.\n", *argv);
  52.             exit(2);
  53.         }
  54.         argc--, argv++;
  55.         goto again;
  56.     }
  57.     if (strcmp(*argv, "-d") == 0) {
  58.         argc--, argv++;
  59.         debug++;
  60.         goto again;
  61.     }
  62.     niter = atoi(*argv);
  63.     pagesize = getpagesize();
  64.     npages /= pagesize / 1024;
  65.     pages = valloc(npages, pagesize);
  66.     if (pages == (char *)0) {
  67.         printf("Can't allocate %d pages (%2.1f megabytes).\n",
  68.             npages, (npages*pagesize) / (1024. * 1024.));
  69.         exit(3);
  70.     }
  71.     if (pagesize != 1024)
  72.         printf("Pagesize %dKb\n", pagesize / 1024);
  73.     pn = 0;
  74.     for (i = 0; i < niter; i++) {
  75.         delta = gauss(sd, 0.0);
  76.         while (pn + delta < 0 || pn + delta > npages)
  77.             delta = gauss(sd, 0.0);
  78.         pn += delta;
  79.         if (debug)
  80.             printf("touch page %d\n", pn);
  81.         else
  82.             pages[pn * pagesize] = 1;
  83.     }
  84. }
  85.  
  86. float
  87. gauss(sd, mean)
  88.     float sd, mean;
  89. {
  90.     register float qa, qb;
  91.  
  92.     qa = sqrt(log(rnd()) * -2.0);
  93.     qb = 3.14159 * rnd();
  94.     return (qa * cos(qb) * sd + mean);
  95. }
  96.  
  97. float
  98. rnd()
  99. {
  100.     static int seed = 1;
  101.     static int biggest = 0x7fffffff;
  102.  
  103.     return ((float)rand(seed) / (float)biggest);
  104. }
  105.