8 enum { STACK = 32768 };
15 int blocksize, seed, randpct;
16 int doread, dowrite, packets, permute;
17 vlong totalbytes, cur;
28 fprint(2, "usage: randtest [-q] [-h host] [-s seed] [-b blocksize] [-p randpct] [-n totalbytes] [-M maxblocks] [-P] [-r] [-w]\n");
29 threadexitsall("usage");
33 wr(char *buf, char *buf2)
35 uchar score[VtScoreSize], score2[VtScoreSize];
39 memset(&ds, 0, sizeof ds);
41 sha1((uchar*)buf, blocksize, score, &ds);
42 if(vtwrite(z, score2, VtDataType, (uchar*)buf, blocksize) < 0)
43 sysfatal("vtwrite %V at %,lld: %r", score, cur);
44 if(doublecheck && memcmp(score, score2, VtScoreSize) != 0)
45 sysfatal("score mismatch! %V %V", score, score2);
54 while((p = recvp(cw)) != nil){
61 rd(char *buf, char *buf2)
63 uchar score[VtScoreSize];
66 memset(&ds, 0, sizeof ds);
67 sha1((uchar*)buf, blocksize, score, &ds);
68 if(vtread(z, score, VtDataType, (uchar*)buf2, blocksize) < 0)
69 sysfatal("vtread %V at %,lld: %r", score, cur);
70 if(memcmp(buf, buf2, blocksize) != 0)
71 sysfatal("bad data read! %V", score);
79 buf2 = vtmalloc(blocksize);
81 while((p = recvp(cr)) != nil){
90 run(void (*fn)(char*, char*), Channel *c)
95 buf2 = vtmalloc(blocksize);
96 buf = vtmalloc(blocksize);
98 packets = totalbytes/blocksize;
99 if(maxpackets > 0 && maxpackets < packets)
100 packets = maxpackets;
101 totalbytes = (vlong)packets * blocksize;
102 order = vtmalloc(packets*sizeof order[0]);
103 for(i=0; i<packets; i++)
106 for(i=1; i<packets; i++){
113 for(i=0; i<packets; i++){
114 memmove(buf, template, blocksize);
115 *(uint*)buf = order[i];
118 buf = vtmalloc(blocksize);
126 #define TWID64 ((u64int)~(u64int)0)
136 n = strtoul(s, &es, 0);
137 if(*es == 'k' || *es == 'K'){
140 }else if(*es == 'm' || *es == 'M'){
143 }else if(*es == 'g' || *es == 'G'){
146 }else if(*es == 't' || *es == 'T'){
156 threadmain(int argc, char *argv[])
168 totalbytes = 1*1024*1024*1024;
169 fmtinstall('V', vtscorefmt);
170 fmtinstall('F', vtfcallfmt);
174 blocksize = unittoull(EARGF(usage()));
177 host = EARGF(usage());
180 maxpackets = unittoull(EARGF(usage()));
183 multi = atoi(EARGF(usage()));
186 totalbytes = unittoull(EARGF(usage()));
189 randpct = atoi(EARGF(usage()));
196 ventidoublechecksha1 = 0;
199 seed = atoi(EARGF(usage()));
214 if(doread==0 && dowrite==0){
221 sysfatal("could not connect to server: %r");
223 sysfatal("vtconnect: %r");
226 cr = chancreate(sizeof(void*), 0);
227 cw = chancreate(sizeof(void*), 0);
228 for(i=0; i<multi; i++){
229 proccreate(wrthread, nil, STACK);
230 proccreate(rdthread, nil, STACK);
234 template = vtmalloc(blocksize);
236 max = (256*randpct)/100;
239 for(i=0; i<blocksize; i++)
240 template[i] = xxxlrand()%max;
244 for(i=0; i<multi; i++)
246 t = (nsec() - t0)/1.e9;
247 print("write: %lld bytes / %.3f seconds = %.6f MB/s\n",
248 totalbytes, t, (double)totalbytes/1e6/t);
253 for(i=0; i<multi; i++)
255 t = (nsec() - t0)/1.e9;
256 print("read: %lld bytes / %.3f seconds = %.6f MB/s\n",
257 totalbytes, t, (double)totalbytes/1e6/t);
265 * D. P. Mitchell & J. A. Reeds
270 #define MASK 0x7fffffffL
275 #define NORM (1.0/(1.0+MASK))
277 static ulong rng_vec[LEN];
278 static ulong* rng_tap = rng_vec;
279 static ulong* rng_feed = 0;
288 rng_feed = rng_vec+LEN-TAP;
296 * Initialize by x[n+1] = 48271 * x[n] mod (2**31 - 1)
298 for(i = -20; i < LEN; i++) {
321 if(rng_tap < rng_vec) {
329 if(rng_feed < rng_vec)
331 x = (*rng_feed + *rng_tap) & MASK;