6 #include <sys/rusage.h>
9 #include <sys/resource.h>
12 /*Blocksize is 1M words (on intels, this is 1Mb)
15 #define MAXBSIZE (1024*1024)
18 typedef unsigned int ui;
20 double readtime(void);
22 void build_buffer(int, int);
24 ui buf[MAXBSIZE * sizeof(ui *)];
32 getrusage(RUSAGE_SELF,&r);
34 #ifdef SOLARIS2 || _POSIX_C_SOURCE
35 rv = (double)r.ru_utime.tv_sec + (double)(r.ru_utime.tv_nsec/1e9);
37 rv = (double)r.ru_utime.tv_sec + (double)(r.ru_utime.tv_usec/1e6);
50 /* Open our log file */
53 sprintf(strbuf,"cache.%d",i);
54 if (access(strbuf,0)) break;
56 record=fopen(strbuf,"w");
57 if (record==NULL) printf("Could not open record file %s. No record kept\n",strbuf);
58 else printf("\t\tA copy of this run will be kept in %s\n\n",strbuf);
60 printf("Memory tester v1.0\n");
61 printf("Author: Anthony.Wesley@anu.edu.au, January 1996\n\n");
62 printf("On this machine, one word = %d bytes\n",sizeof(ui *));
63 printf("Reported access times are in nS per word.\n\n");
66 fprintf(record,"On this machine, one word = %d bytes\n",sizeof(ui *));
67 fprintf(record,"Reported access times are in nS per word.\n\n");
70 /* Start with a block of 256 words, each word is of type (ui *) */
83 count = (ui)((double)count * LOOPTIME / t);
84 for(buflen=256; buflen<=MAXBSIZE; buflen*=2)
86 if (buflen<256*1024) sprintf(strbuf,"%uk",buflen/256);
87 else sprintf(strbuf,"%uM",buflen/(256*1024));
89 printf("%-5.5s|",strbuf); fflush(stdout);
90 if (record!=NULL) fprintf(record,"%-5.5s|",strbuf);
92 for(str=1; str<buflen; str*=2)
94 build_buffer(buflen,str);
99 if (t<1.0) count*=3; else break;
102 wps = (double)(count) / t;
107 if (record!=NULL) fprintf(record,"1k+ ");
111 printf("%-3d ", (int)wps);
112 if (record!=NULL) fprintf(record,"%-3d ", (int)wps);
115 fflush(stdout); if (record!=NULL) fflush(record);
117 count = (ui)((double)count * LOOPTIME / t);
120 if (record!=NULL) putc('\n',record);
123 if (record!=NULL) fclose(record);
126 double read_test(ui count)
132 t1=readtime(); while(i<count)
134 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
135 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
136 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
137 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
138 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
139 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
140 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
141 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
142 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
143 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
144 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
145 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
146 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
147 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
148 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
149 o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o); o=(ui *)(*o);
152 return(readtime()-t1);
156 build_buffer(int size, int stridelen)
160 for(i=0; i<(size-stridelen); i+=stridelen)
161 buf[i]=(ui)&buf[i+stridelen];
162 buf[i] = (ui)&buf[0];
172 "Block|--------------------------Memory Stride (words)------------------------\n");
178 "Block|--------------------------Memory Stride (words)------------------------\n");
179 fprintf(record,"size |");
182 for(val=1; val<=(1024*128); val*=2)
185 if (val>=(1024*1024)) { c='M'; v = val / (1024*1024); }
186 else if (val>=1024) { c='k'; v = val / 1024; }
188 sprintf(strbuf,"%d%c",v,c);
189 if (v>64 && c) {strbuf[2]=c; strbuf[3]=0;}
190 printf("%-3s ",strbuf);
191 if (record!=NULL) fprintf(record,"%-3s ",strbuf);
193 putchar('\n'); if (record!=NULL) putc('\n',record);
195 if (record!=NULL) fprintf(record," |\n");