int main(int argc, char *argv[])
{
- int iterations, j, k, count, size;
+ int iterations, j, k, count, size, mask, latcount;
unsigned long *buf, i, tmp = 0;
struct timeval start, end;
iterations = 24;
if (argc > 2)
- count = atoi(argv[2]) * 1024;
+ count = atoi(argv[2]);
else
count = 1024;
+ latcount = count / 10;
printf("Doing %d runs with buffer size goin up to %dk\n",
iterations, 1 << (iterations - 10));
printf("Running each round %d times\n", count);
- printf("Size of unsigned long is %lu bits\n", lsize * 8);
+ printf("Size of unsigned long is %lu bits\n\n", lsize * 8);
switch (lsize) {
case 4:
exit(1);
}
+ printf(" |"
+ " Read |"
+ " Write |\n"
+ " |"
+ "-----------------------"
+ "-----------------------\n"
+ " Size |"
+ " MiB/s ns |"
+ " MiB/s ns |\n"
+ "----------|"
+ "-----------------------"
+ "-----------------------\n"
+ );
+
for (; j < iterations + 1; j++) {
size = (1 << j) / lsize;
buf = malloc(size * lsize);
+ mask = size - 1;
if (buf == NULL) {
printf("Malloc failed\n");
for (i = 0; i < size; i++)
buf[i] = i;
- printf("%luk\t", size * lsize / 1024);
+ printf("%8luk |", size * lsize / 1024);
+
+ /* Read bandwidth*/
- printf("read: ");
fflush(stdout);
gettimeofday(&start, 0);
gettimeofday(&end, 0);
- printf("% 9.2f MB/s ", (double)(size * lsize) *
+ printf("% 9.2f ", (double)(size * lsize) *
(1000000 / (1024.0 * 1024.0)) * count /
(double) usec_diff(&start, &end));
+ fflush(stdout);
+
+ /* Read latency */
+
+ gettimeofday(&start, 0);
+ for (k = 0; k < latcount; k++) {
+ buf[0] = tmp;
+ for (i = 0; i < size; i++)
+ tmp += buf[random() & mask];
+ }
+
+ gettimeofday(&end, 0);
+
+ printf("% 9.3f |", usec_diff(&start, &end) * 1000 /
+ ((double) (size * latcount )));
+
- printf("write: ");
fflush(stdout);
+ /* Write bandwidth */
+
gettimeofday(&start, 0);
for (k = 0; k < count; k++)
for (i = 0; i < size; i++)
buf[i] = i;
gettimeofday(&end, 0);
- printf("% 9.2f MB/s ", (double)(size * lsize) *
+ printf("% 9.2f ", (double)(size * lsize) *
(1000000 / (1024.0 * 1024.0)) * count /
(double) usec_diff(&start, &end));
+
+ /* Write latency */
+
+ gettimeofday(&start, 0);
+ for (k = 0; k < latcount; k++)
+ for (i = 0; i < size; i++)
+ buf[random() % mask] = i;
+ gettimeofday(&end, 0);
+
+ printf("% 9.3f |", usec_diff(&start, &end) * 1000 /
+ ((double) (size * latcount )));
+
printf("\n");
free(buf);