88 lines
1.9 KiB
C
Executable File
88 lines
1.9 KiB
C
Executable File
#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);
|
|
}
|