www.pudn.com > pebble.zip > lat_cache.c
/*
* Copyright 1999, 2000, 2001, 2002 Lucent Technologies Inc.
* All Rights Reserved.
* Information Sciences Research Center, Bell Labs.
*
* LUCENT TECHNOLOGIES DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE
* OR THE SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The
* software is provided "as is" without expressed or implied warranty
* of any kind.
*
* These notices must be retained in any copies of any part of this
* software.
*
*/
#include "pebble.h"
#include "unistd.h"
#include "types.h"
#include "time.h"
#include "synch.h"
#include "perfcount.h"
#define MEM_START 0
#define MEM_SIZE 4*1024*1024
#define SMALLEST_SIZE 8*1024
#define CACHE_LINE 32
int
main(void)
{
volatile char *p, *end;
char *area;
volatile int *q;
int i, ntimes;
int size, sum;
int perf_ix;
uint perf_count;
uvlong start_time, elapsed;
printf("lat_cache benchmark starting\n");
if ((int)(area = (char *)sbrk(MEM_SIZE)) <= 0)
panic("sbrk failed:");
/* a quick memory test */
end = area + MEM_SIZE;
for (q = (int *)area; q < (int *)end; q++)
*q = (int)q;
for (q = (int *)area; q < (int *)end; q++)
if (*q != (int)q) {
printf("memory test failed for address %08x = %08x\n",
(uint)q, *q);
task_exit(1);
}
for (size = SMALLEST_SIZE; size <= MEM_SIZE; size <<= 1) {
printf("=============\n");
printf("testing memory scan of %d bytes area\n", size);
ntimes = MEM_SIZE / size;
sum = 0;
/* initial scan to fill the cache */
end = area + size;
for (p = area; p < end; p += CACHE_LINE)
sum += *p;
for (perf_ix = 0; perf_vec[perf_ix].name != NULL; perf_ix++) {
set_perf_ctrl(perf_vec[perf_ix].ctrl);
start_time = hrtime();
for (i = 0; i < ntimes; i++) {
for (p = area; p < end; p += CACHE_LINE)
sum += *p;
}
perf_count = get_perf_count();
elapsed = 2 * (hrtime() - start_time);
printf("%s: %d elapsed time: %d cycles (%d cycles/access) sum=%d\n",
perf_vec[perf_ix].name, perf_count,
(int)elapsed,
(int)(elapsed / (MEM_SIZE/CACHE_LINE)),
sum);
}
}
printf("LAT_CACHE ENDED\n");
task_exit(0);
return(1);
}