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