aad-assignment-1/aad_utilities.h

66 lines
1.7 KiB
C

//
// Tomás Oliveira e Silva, September 2025
//
// Arquiteturas de Alto Desempenho 2025/2026
//
// useful functions (all functions are marked with the unused attribute)
// the compiler will not complain if they are not actually used in the code
//
#ifndef AAD_UTILITIES
#define AAD_UTILITIES
//
// measure elapsed and wall times --- requires <time.h>
//
// warning: Linux and macOS only, if clock_gettime() is not available, consider using clock()
//
static struct timespec measured_cpu_time[2],measured_wall_time[2];
__attribute__((unused))
static void time_measurement(void)
{
measured_cpu_time[0] = measured_cpu_time[1];
(void)clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&measured_cpu_time[1]);
measured_wall_time[0] = measured_wall_time[1];
(void)clock_gettime(CLOCK_MONOTONIC_RAW,&measured_wall_time[1]);
}
__attribute__((unused))
static double cpu_time_delta(void)
{
return ((double)measured_cpu_time[1].tv_sec - (double)measured_cpu_time[0].tv_sec)
+ 1.0e-9 * ((double)measured_cpu_time[1].tv_nsec - (double)measured_cpu_time[0].tv_nsec);
}
__attribute__((unused))
static double wall_time_delta(void)
{
return ((double)measured_wall_time[1].tv_sec - (double)measured_wall_time[0].tv_sec)
+ 1.0e-9 * ((double)measured_wall_time[1].tv_nsec - (double)measured_wall_time[0].tv_nsec);
}
//
// linear congruential pseudo-random number generator with period 2^32
// see, for example, https://en.wikipedia.org/wiki/Linear_congruential_generator
// not good for cryptographic applications, but good enough to generate test data
//
__attribute__((unused))
u08_t random_byte(void)
{
static u32_t x = 0u;
x = 3134521u * x + 1u;
return (u08_t)x;
}
//
// the end!
//
#endif