blob: 8b2b64d51add2da4ee785068aaeb9f815fbae8c1 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sched.h>
#include <math.h>
#ifndef POLYBENCH_CACHE_SIZE_KB
# define POLYBENCH_CACHE_SIZE_KB 8192
#endif
/* Timer code (gettimeofday). */
double polybench_t_start, polybench_t_end;
static
inline
double rtclock()
{
struct timezone Tzp;
struct timeval Tp;
int stat;
stat = gettimeofday (&Tp, &Tzp);
if (stat != 0)
printf("Error return from gettimeofday: %d", stat);
return (Tp.tv_sec + Tp.tv_usec * 1.0e-6);
}
inline
void polybench_flush_cache()
{
int cs = POLYBENCH_CACHE_SIZE_KB * 1024 / sizeof(double);
double* flush = (double*) calloc(cs, sizeof(double));
int i;
double tmp = 0.0;
for (i = 0; i < cs; i++)
tmp += flush[i];
/* This prevents DCE on the cache flush code. */
assert (tmp <= 10.0);
}
#ifdef POLYBENCH_LINUX_FIFO_SCHEDULER
inline
void polybench_linux_fifo_scheduler()
{
/* Use FIFO scheduler to limit OS interference. Program must be run
as root, and this works only for Linux kernels. */
struct sched_param schedParam;
schedParam.sched_priority = sched_get_priority_max(SCHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, &schedParam);
}
inline
void polybench_linux_standard_scheduler()
{
/* Restore to standard scheduler policy. */
struct sched_param schedParam;
schedParam.sched_priority = sched_get_priority_max(SCHED_OTHER);
sched_setscheduler(0, SCHED_OTHER, &schedParam);
}
#endif
void polybench_timer_start()
{
#ifndef POLYBENCH_NO_FLUSH_CACHE
polybench_flush_cache();
#endif
#ifdef POLYBENCH_LINUX_FIFO_SCHEDULER
polybench_linux_fifo_scheduler();
#endif
polybench_t_start = rtclock();
}
void polybench_timer_stop()
{
#ifdef POLYBENCH_LINUX_FIFO_SCHEDULER
polybench_linux_standard_scheduler();
#endif
polybench_t_end = rtclock();
}
void polybench_timer_print()
{
printf("%0.6lfs\n", polybench_t_end - polybench_t_start);
}