11c5ac21333f543680ce306d46f287d62c175d873mridge/* Memory streaming benchmark */
21c5ac21333f543680ce306d46f287d62c175d873mridge
31e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper/*
41c5ac21333f543680ce306d46f287d62c175d873mridge * Copyright (C) 2003-2006 IBM
51e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper *
61c5ac21333f543680ce306d46f287d62c175d873mridge * This program is free software; you can redistribute it and/or
71c5ac21333f543680ce306d46f287d62c175d873mridge * modify it under the terms of the GNU General Public License as
81c5ac21333f543680ce306d46f287d62c175d873mridge * published by the Free Software Foundation; either version 2 of the
91c5ac21333f543680ce306d46f287d62c175d873mridge * License, or (at your option) any later version.
101c5ac21333f543680ce306d46f287d62c175d873mridge *
111c5ac21333f543680ce306d46f287d62c175d873mridge * This program is distributed in the hope that it will be useful, but
121c5ac21333f543680ce306d46f287d62c175d873mridge * WITHOUT ANY WARRANTY; without even the implied warranty of
131c5ac21333f543680ce306d46f287d62c175d873mridge * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the GNU
141c5ac21333f543680ce306d46f287d62c175d873mridge * General Public License for more details.
151e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper *
161c5ac21333f543680ce306d46f287d62c175d873mridge * You should have received a copy of the GNU General Public License
171c5ac21333f543680ce306d46f287d62c175d873mridge * along with this program; if not, write to the Free Software
181c5ac21333f543680ce306d46f287d62c175d873mridge * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
191c5ac21333f543680ce306d46f287d62c175d873mridge * 02111-1307, USA.
201c5ac21333f543680ce306d46f287d62c175d873mridge */
211c5ac21333f543680ce306d46f287d62c175d873mridge
221c5ac21333f543680ce306d46f287d62c175d873mridge#define __int64 long long
231c5ac21333f543680ce306d46f287d62c175d873mridge#include <sys/time.h>
241c5ac21333f543680ce306d46f287d62c175d873mridge#define SLASHC		'/'
251c5ac21333f543680ce306d46f287d62c175d873mridge#define SLASHSTR	"/"
261c5ac21333f543680ce306d46f287d62c175d873mridge#include <sys/types.h>
271c5ac21333f543680ce306d46f287d62c175d873mridge#include <string.h>
281c5ac21333f543680ce306d46f287d62c175d873mridge#include <stddef.h>
291c5ac21333f543680ce306d46f287d62c175d873mridge#include <stdlib.h>
301c5ac21333f543680ce306d46f287d62c175d873mridge#include <stdio.h>
311c5ac21333f543680ce306d46f287d62c175d873mridge#include <ctype.h>
321c5ac21333f543680ce306d46f287d62c175d873mridge
331c5ac21333f543680ce306d46f287d62c175d873mridge#define equal !strcmp
341c5ac21333f543680ce306d46f287d62c175d873mridge
351c5ac21333f543680ce306d46f287d62c175d873mridgesize_t atoik(char *);
361c5ac21333f543680ce306d46f287d62c175d873mridgevoid *Malloc(size_t sz);
371c5ac21333f543680ce306d46f287d62c175d873mridgevoid tstart(void);
381c5ac21333f543680ce306d46f287d62c175d873mridgevoid tend(void);
391c5ac21333f543680ce306d46f287d62c175d873mridgedouble tval(void);
401c5ac21333f543680ce306d46f287d62c175d873mridge
411c5ac21333f543680ce306d46f287d62c175d873mridgechar *methods[] = {
421c5ac21333f543680ce306d46f287d62c175d873mridge	"\"memcpy\"",
431c5ac21333f543680ce306d46f287d62c175d873mridge	"\"char *\"",
441c5ac21333f543680ce306d46f287d62c175d873mridge	"\"short *\"",
451c5ac21333f543680ce306d46f287d62c175d873mridge	"\"int *\"",
461c5ac21333f543680ce306d46f287d62c175d873mridge	"\"long *\"",
471c5ac21333f543680ce306d46f287d62c175d873mridge	"\"__int64 *\"",
481c5ac21333f543680ce306d46f287d62c175d873mridge	"\"double *\"",
491c5ac21333f543680ce306d46f287d62c175d873mridge};
501c5ac21333f543680ce306d46f287d62c175d873mridge
51354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint nmethods = sizeof(methods) / sizeof(methods[0]);
52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint fflag = 0;			// if 0, then just Malloc once; else malloc/free each time
54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint wflag = 0;			// if 1, call SetProcessWorkingSetSize() (WINDOWS ONLY)
55354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint sflag = 0;			// if 1, only print averages.
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint pflag = 0;
57354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaoint csvflag = 0;		// Print Comma separated list for spreadsheet input.
581c5ac21333f543680ce306d46f287d62c175d873mridgechar *progname;
591c5ac21333f543680ce306d46f287d62c175d873mridge
601c5ac21333f543680ce306d46f287d62c175d873mridgedouble tottim = 0.0;
611c5ac21333f543680ce306d46f287d62c175d873mridge
621c5ac21333f543680ce306d46f287d62c175d873mridgeint main(int ac, char *av[])
631c5ac21333f543680ce306d46f287d62c175d873mridge{
641c5ac21333f543680ce306d46f287d62c175d873mridge	size_t size;
651c5ac21333f543680ce306d46f287d62c175d873mridge	int i;
661c5ac21333f543680ce306d46f287d62c175d873mridge	unsigned ui;
671c5ac21333f543680ce306d46f287d62c175d873mridge	size_t j;
681c5ac21333f543680ce306d46f287d62c175d873mridge	unsigned cnt;
691c5ac21333f543680ce306d46f287d62c175d873mridge	int method = 0;
701c5ac21333f543680ce306d46f287d62c175d873mridge	char *p1, *p2;
71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char *p, *q;
721c5ac21333f543680ce306d46f287d62c175d873mridge	short *sp, *sq;
731c5ac21333f543680ce306d46f287d62c175d873mridge	int *ip, *iq;
741c5ac21333f543680ce306d46f287d62c175d873mridge	long *lp, *lq;
751c5ac21333f543680ce306d46f287d62c175d873mridge	__int64 *llp, *llq;
761c5ac21333f543680ce306d46f287d62c175d873mridge	double *dp, *dq;
771c5ac21333f543680ce306d46f287d62c175d873mridge	double t;
781c5ac21333f543680ce306d46f287d62c175d873mridge
791c5ac21333f543680ce306d46f287d62c175d873mridge	progname = av[0];
80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (strrchr(progname, SLASHC))
81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		progname = strrchr(progname, SLASHC) + 1;
821c5ac21333f543680ce306d46f287d62c175d873mridge
8343088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	while (ac > 1) {
8443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (equal(av[1], "-f")) {
851c5ac21333f543680ce306d46f287d62c175d873mridge			ac--;
861c5ac21333f543680ce306d46f287d62c175d873mridge			fflag = 1;
871c5ac21333f543680ce306d46f287d62c175d873mridge			av++;
88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (equal(av[1], "-w")) {
891c5ac21333f543680ce306d46f287d62c175d873mridge			ac--;
901c5ac21333f543680ce306d46f287d62c175d873mridge			wflag = 1;
911c5ac21333f543680ce306d46f287d62c175d873mridge			av++;
92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (equal(av[1], "-s")) {
931c5ac21333f543680ce306d46f287d62c175d873mridge			ac--;
941c5ac21333f543680ce306d46f287d62c175d873mridge			sflag = 1;
951c5ac21333f543680ce306d46f287d62c175d873mridge			av++;
96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (equal(av[1], "-p")) {
971c5ac21333f543680ce306d46f287d62c175d873mridge			ac--;
981c5ac21333f543680ce306d46f287d62c175d873mridge			pflag = 1;
991c5ac21333f543680ce306d46f287d62c175d873mridge			av++;
100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else if (equal(av[1], "-csv")) {
1011c5ac21333f543680ce306d46f287d62c175d873mridge			ac--;
1021c5ac21333f543680ce306d46f287d62c175d873mridge			csvflag++;
1031c5ac21333f543680ce306d46f287d62c175d873mridge			av++;
104354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else
1051c5ac21333f543680ce306d46f287d62c175d873mridge			break;
1061c5ac21333f543680ce306d46f287d62c175d873mridge	}
10743088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	if (ac < 3) {
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		(void)
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    printf("Usage: %s [-f] [-w] [-s] [-p] size cnt [method]\n",
110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			   progname);
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		(void)
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    printf
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("\t-f flag says to malloc and free of the \"cnt\" times.\n");
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		(void)
115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    printf
116354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("\t-w = set process min and max working set size to \"size\"\n");
1171c5ac21333f543680ce306d46f287d62c175d873mridge		(void)printf("\t-s = silent; only print averages\n");
118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		(void)
119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    printf
120354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("\t-p = prep; \"freshen\" cache before; -w disables\n");
1211c5ac21333f543680ce306d46f287d62c175d873mridge		(void)printf("\t-csv = print output in CSV format\n");
1221c5ac21333f543680ce306d46f287d62c175d873mridge
1231c5ac21333f543680ce306d46f287d62c175d873mridge		(void)printf("\tmethods:\n");
12443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		for (i = 0; i < nmethods; i++)
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf("\t%2d:\t%s\n", i, methods[i]);
1261c5ac21333f543680ce306d46f287d62c175d873mridge		return 0;
1271c5ac21333f543680ce306d46f287d62c175d873mridge	}
1281c5ac21333f543680ce306d46f287d62c175d873mridge
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	size = atoik(av[1]);
1301c5ac21333f543680ce306d46f287d62c175d873mridge
1311c5ac21333f543680ce306d46f287d62c175d873mridge	//
1321c5ac21333f543680ce306d46f287d62c175d873mridge	// Round size up to 4*sizeof(double) bytes.
1331c5ac21333f543680ce306d46f287d62c175d873mridge	//
134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (size != ((size / (4 * sizeof(double))) * (4 * sizeof(double)))) {
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		size += (4 * sizeof(double));
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		size /= (4 * sizeof(double));
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		size *= (4 * sizeof(double));
1381c5ac21333f543680ce306d46f287d62c175d873mridge	}
1391c5ac21333f543680ce306d46f287d62c175d873mridge	cnt = (unsigned)atoik(av[2]);
1401c5ac21333f543680ce306d46f287d62c175d873mridge
14143088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	if (fflag == 0) {
1421c5ac21333f543680ce306d46f287d62c175d873mridge		p1 = (char *)Malloc(size);
1431c5ac21333f543680ce306d46f287d62c175d873mridge		p2 = (char *)Malloc(size);
14443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (pflag)
145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			memcpy(p1, p2, size);
1461c5ac21333f543680ce306d46f287d62c175d873mridge	}
1471c5ac21333f543680ce306d46f287d62c175d873mridge
148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	printf("%s ", progname);
149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (fflag)
150354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("-f ");
151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (wflag)
152354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("-w ");
153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (sflag)
154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("-s ");
155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (pflag)
156354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("-p ");
157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (csvflag)
158354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf("-csv ");
1591c5ac21333f543680ce306d46f287d62c175d873mridge	printf("%u %u ", size, cnt);
16043088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	if (csvflag) {
1611c5ac21333f543680ce306d46f287d62c175d873mridge		printf("Linux");
1621c5ac21333f543680ce306d46f287d62c175d873mridge	}
1631c5ac21333f543680ce306d46f287d62c175d873mridge	printf("\n");
1641c5ac21333f543680ce306d46f287d62c175d873mridge
16543088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	if (ac == 3) {
1661c5ac21333f543680ce306d46f287d62c175d873mridge		ac = 4;
1671c5ac21333f543680ce306d46f287d62c175d873mridge		av[3] = "0";
1681c5ac21333f543680ce306d46f287d62c175d873mridge	}
1691c5ac21333f543680ce306d46f287d62c175d873mridge
17043088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	for (; ac > 3; ac--, av++) {
171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (isdigit(*av[3]))
172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			method = *av[3] - '0';
17343088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (method < 0 || method >= nmethods)
1741c5ac21333f543680ce306d46f287d62c175d873mridge			method = 0;
17543088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (sflag)
1761c5ac21333f543680ce306d46f287d62c175d873mridge			tstart();
17743088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		for (ui = 0; ui < cnt; ui++) {
17843088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper			if (!sflag) {
1791c5ac21333f543680ce306d46f287d62c175d873mridge				(void)printf("%s %d %d %-18.18s\t",
180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     progname, size, cnt,
181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     methods[method]);
1821c5ac21333f543680ce306d46f287d62c175d873mridge				tstart();
1831c5ac21333f543680ce306d46f287d62c175d873mridge			}
18443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper			if (fflag == 1) {
1851c5ac21333f543680ce306d46f287d62c175d873mridge				p1 = (char *)Malloc(size);
1861c5ac21333f543680ce306d46f287d62c175d873mridge				p2 = (char *)Malloc(size);
1871c5ac21333f543680ce306d46f287d62c175d873mridge			}
188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			switch (method) {
1891c5ac21333f543680ce306d46f287d62c175d873mridge			case 0:
1901c5ac21333f543680ce306d46f287d62c175d873mridge				(void)memcpy(p1, p2, size);
1911c5ac21333f543680ce306d46f287d62c175d873mridge				break;
1921c5ac21333f543680ce306d46f287d62c175d873mridge			case 1:
1931c5ac21333f543680ce306d46f287d62c175d873mridge				p = p1;
1941c5ac21333f543680ce306d46f287d62c175d873mridge				q = p2;
19543088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper				for (j = 0; j < size; j++)
1961c5ac21333f543680ce306d46f287d62c175d873mridge					*p++ = *q++;
1971c5ac21333f543680ce306d46f287d62c175d873mridge				break;
1981c5ac21333f543680ce306d46f287d62c175d873mridge			case 2:
1991c5ac21333f543680ce306d46f287d62c175d873mridge				sp = (short *)p1;
2001c5ac21333f543680ce306d46f287d62c175d873mridge				sq = (short *)p2;
20143088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper				for (j = 0; j < size; j += sizeof(short))
2021c5ac21333f543680ce306d46f287d62c175d873mridge					*sp++ = *sq++;
2031c5ac21333f543680ce306d46f287d62c175d873mridge				break;
2041c5ac21333f543680ce306d46f287d62c175d873mridge			case 3:
2051c5ac21333f543680ce306d46f287d62c175d873mridge				ip = (int *)p1;
2061c5ac21333f543680ce306d46f287d62c175d873mridge				iq = (int *)p2;
20743088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper				for (j = 0; j < size; j += sizeof(int))
2081c5ac21333f543680ce306d46f287d62c175d873mridge					*ip++ = *iq++;
2091c5ac21333f543680ce306d46f287d62c175d873mridge				break;
2101c5ac21333f543680ce306d46f287d62c175d873mridge			case 4:
2111c5ac21333f543680ce306d46f287d62c175d873mridge				lp = (long *)p1;
2121c5ac21333f543680ce306d46f287d62c175d873mridge				lq = (long *)p2;
21343088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper				for (j = 0; j < size; j += sizeof(long))
2141c5ac21333f543680ce306d46f287d62c175d873mridge					*lp++ = *lq++;
2151c5ac21333f543680ce306d46f287d62c175d873mridge				break;
2161c5ac21333f543680ce306d46f287d62c175d873mridge			case 5:
217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				llp = (__int64 *) p1;
218354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				llq = (__int64 *) p2;
21943088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper				for (j = 0; j < size; j += sizeof(__int64))
2201c5ac21333f543680ce306d46f287d62c175d873mridge					*llp++ = *llq++;
2211c5ac21333f543680ce306d46f287d62c175d873mridge				break;
2221c5ac21333f543680ce306d46f287d62c175d873mridge			case 6:
2231c5ac21333f543680ce306d46f287d62c175d873mridge				dp = (double *)p1;
2241c5ac21333f543680ce306d46f287d62c175d873mridge				dq = (double *)p2;
225354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				for (j = 0; j < size; j += 4 * sizeof(double)) {
2261c5ac21333f543680ce306d46f287d62c175d873mridge					*dp++ = *dq++;
2271c5ac21333f543680ce306d46f287d62c175d873mridge					*dp++ = *dq++;
2281c5ac21333f543680ce306d46f287d62c175d873mridge					*dp++ = *dq++;
2291c5ac21333f543680ce306d46f287d62c175d873mridge					*dp++ = *dq++;
2301c5ac21333f543680ce306d46f287d62c175d873mridge				}
2311c5ac21333f543680ce306d46f287d62c175d873mridge				break;
2321c5ac21333f543680ce306d46f287d62c175d873mridge
2331c5ac21333f543680ce306d46f287d62c175d873mridge			}
23443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper			if (fflag == 1) {
2351c5ac21333f543680ce306d46f287d62c175d873mridge				free(p1);
2361c5ac21333f543680ce306d46f287d62c175d873mridge				free(p2);
2371c5ac21333f543680ce306d46f287d62c175d873mridge			}
23843088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper			if (!sflag) {
2391c5ac21333f543680ce306d46f287d62c175d873mridge				tend();
2401c5ac21333f543680ce306d46f287d62c175d873mridge				t = tval();
2411c5ac21333f543680ce306d46f287d62c175d873mridge				tottim += t;
24243088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper				if (t == 0.0)
2431c5ac21333f543680ce306d46f287d62c175d873mridge					t = .0001;
2441c5ac21333f543680ce306d46f287d62c175d873mridge				printf(" %8.6f seconds %8.3f MB/s\n",
245354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       t, (double)size / t / 1000000.);
2461c5ac21333f543680ce306d46f287d62c175d873mridge			}
2471c5ac21333f543680ce306d46f287d62c175d873mridge		}
24843088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (sflag) {
2491c5ac21333f543680ce306d46f287d62c175d873mridge			tend();
2501c5ac21333f543680ce306d46f287d62c175d873mridge			tottim = tval();
2511c5ac21333f543680ce306d46f287d62c175d873mridge		}
25243088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (csvflag) {
2531c5ac21333f543680ce306d46f287d62c175d873mridge			printf("%s,%u,%u,%8.3f,%8.3f\n",
254354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       methods[method], size, size * cnt, tottim,
255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       (double)size / (tottim / cnt) / 1000000.);
256354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
257354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			(void)printf("\tAVG: %d %-18.18s\t", size,
258354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     methods[method]);
259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			(void)printf(" %8.3f MB/s\n",
260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     (double)size / (tottim / cnt) / 1000000.);
2611c5ac21333f543680ce306d46f287d62c175d873mridge		}
2621c5ac21333f543680ce306d46f287d62c175d873mridge		tottim = 0.0;
2631c5ac21333f543680ce306d46f287d62c175d873mridge	}
2641c5ac21333f543680ce306d46f287d62c175d873mridge	return 0;
2651c5ac21333f543680ce306d46f287d62c175d873mridge}
2661c5ac21333f543680ce306d46f287d62c175d873mridge
2671c5ac21333f543680ce306d46f287d62c175d873mridgesize_t atoik(char *s)
2681c5ac21333f543680ce306d46f287d62c175d873mridge{
2691c5ac21333f543680ce306d46f287d62c175d873mridge	size_t ret = 0;
2701c5ac21333f543680ce306d46f287d62c175d873mridge	size_t base;
2711c5ac21333f543680ce306d46f287d62c175d873mridge
27243088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	if (*s == '0') {
2731c5ac21333f543680ce306d46f287d62c175d873mridge		base = 8;
27443088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (*++s == 'x' || *s == 'X') {
2751c5ac21333f543680ce306d46f287d62c175d873mridge			base = 16;
2761c5ac21333f543680ce306d46f287d62c175d873mridge			s++;
2771c5ac21333f543680ce306d46f287d62c175d873mridge		}
278354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else
2791c5ac21333f543680ce306d46f287d62c175d873mridge		base = 10;
2801c5ac21333f543680ce306d46f287d62c175d873mridge
28143088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	for (; isxdigit(*s); s++) {
28243088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		if (base == 16)
28343088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper			if (isalpha(*s))
284354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret = base * ret + (toupper(*s) - 'A');
2851c5ac21333f543680ce306d46f287d62c175d873mridge			else
286354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret = base * ret + (*s - '0');
28743088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper		else if (isdigit(*s))
288354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret = base * ret + (*s - '0');
2891c5ac21333f543680ce306d46f287d62c175d873mridge		else
2901c5ac21333f543680ce306d46f287d62c175d873mridge			break;
2911c5ac21333f543680ce306d46f287d62c175d873mridge	}
29243088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	for (; isalpha(*s); s++) {
293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		switch (toupper(*s)) {
294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		case 'K':
295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret *= 1024;
296354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		case 'M':
298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret *= 1024 * 1024;
299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
3001c5ac21333f543680ce306d46f287d62c175d873mridge		default:
3011c5ac21333f543680ce306d46f287d62c175d873mridge			return ret;
3021c5ac21333f543680ce306d46f287d62c175d873mridge		}
3031c5ac21333f543680ce306d46f287d62c175d873mridge	}
3041c5ac21333f543680ce306d46f287d62c175d873mridge	return ret;
3051c5ac21333f543680ce306d46f287d62c175d873mridge}
306354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
3071c5ac21333f543680ce306d46f287d62c175d873mridgevoid *Malloc(size_t sz)
3081c5ac21333f543680ce306d46f287d62c175d873mridge{
3091c5ac21333f543680ce306d46f287d62c175d873mridge	char *p;
3101c5ac21333f543680ce306d46f287d62c175d873mridge
3111c5ac21333f543680ce306d46f287d62c175d873mridge	p = (char *)malloc(sz);
31243088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	if (p == NULL) {
313354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		(void)printf("malloc(%d) failed\n", sz);
3141c5ac21333f543680ce306d46f287d62c175d873mridge		exit(1);
3151c5ac21333f543680ce306d46f287d62c175d873mridge	}
3161c5ac21333f543680ce306d46f287d62c175d873mridge	return (void *)p;
3171c5ac21333f543680ce306d46f287d62c175d873mridge}
3181c5ac21333f543680ce306d46f287d62c175d873mridge
3191c5ac21333f543680ce306d46f287d62c175d873mridgestatic struct timeval _tstart, _tend;
3201c5ac21333f543680ce306d46f287d62c175d873mridge
3211c5ac21333f543680ce306d46f287d62c175d873mridgevoid tstart(void)
3221c5ac21333f543680ce306d46f287d62c175d873mridge{
3231c5ac21333f543680ce306d46f287d62c175d873mridge	gettimeofday(&_tstart, NULL);
3241c5ac21333f543680ce306d46f287d62c175d873mridge}
325354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
3261c5ac21333f543680ce306d46f287d62c175d873mridgevoid tend(void)
3271c5ac21333f543680ce306d46f287d62c175d873mridge{
3281c5ac21333f543680ce306d46f287d62c175d873mridge	gettimeofday(&_tend, NULL);
3291c5ac21333f543680ce306d46f287d62c175d873mridge}
3301c5ac21333f543680ce306d46f287d62c175d873mridge
3311c5ac21333f543680ce306d46f287d62c175d873mridgedouble tval()
3321c5ac21333f543680ce306d46f287d62c175d873mridge{
3331c5ac21333f543680ce306d46f287d62c175d873mridge	double t1, t2;
3341c5ac21333f543680ce306d46f287d62c175d873mridge
335354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	t1 = (double)_tstart.tv_sec + (double)_tstart.tv_usec / (1000 * 1000);
336354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	t2 = (double)_tend.tv_sec + (double)_tend.tv_usec / (1000 * 1000);
337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return t2 - t1;
338ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
339