xref: /phasta/phastaIO/phiotmrc.cc (revision e5b451c7cedb3219127f3dfd8ec0556bbfd97a33)
159599516SKenneth E. Jansen #include <stdio.h>
259599516SKenneth E. Jansen #include <sys/types.h>
359599516SKenneth E. Jansen #include <time.h>
4*e5b451c7SCameron Smith #include <cassert>
559599516SKenneth E. Jansen 
659599516SKenneth E. Jansen #include <sys/time.h>
759599516SKenneth E. Jansen #include <sys/resource.h>
859599516SKenneth E. Jansen #include <unistd.h>
937dc80d0SCameron Smith #define __STDC_FORMAT_MACROS /* c++ requires this for the print macros */
1037dc80d0SCameron Smith #include <inttypes.h> /* PRIu64 */
1159599516SKenneth E. Jansen 
1259599516SKenneth E. Jansen #ifdef __bgq__
1359599516SKenneth E. Jansen #include "hwi/include/bqc/A2_inlines.h"
1459599516SKenneth E. Jansen #endif
1559599516SKenneth E. Jansen 
1659599516SKenneth E. Jansen #include "phiotmrc.h"
1737dc80d0SCameron Smith #include "phiompi.h"
1837dc80d0SCameron Smith 
1937dc80d0SCameron Smith #define BILLION 1000L*1000L*1000L
2037dc80d0SCameron Smith #define MILLION 1000L*1000L
2137dc80d0SCameron Smith 
2237dc80d0SCameron Smith #ifdef __INTEL_COMPILER
2337dc80d0SCameron Smith size_t phastaio_global_cpus;
2437dc80d0SCameron Smith size_t phastaio_time_diff(phioTime* start, phioTime* end);
2537dc80d0SCameron Smith /* return the cycle count */
2637dc80d0SCameron Smith void phastaio_time(phioTime* t) {
2737dc80d0SCameron Smith   *t = _rdtsc(); //intel intrinsic
2837dc80d0SCameron Smith }
2937dc80d0SCameron Smith /* determine the reference clock frequency */
3037dc80d0SCameron Smith void phastaio_setCyclesPerMicroSec() {
3137dc80d0SCameron Smith   const size_t usec = 5*MILLION;
3237dc80d0SCameron Smith   size_t cpus, cycles;
3337dc80d0SCameron Smith   phioTime t0, t1;
3437dc80d0SCameron Smith   phastaio_time(&t0);
3537dc80d0SCameron Smith   /* Testing on Theta indicates that 5s is long enough
3637dc80d0SCameron Smith    * to get a stable value for the reference frequency.
3737dc80d0SCameron Smith    */
3837dc80d0SCameron Smith   usleep(usec);
3937dc80d0SCameron Smith   phastaio_time(&t1);
4037dc80d0SCameron Smith   cycles = t1 - t0;
4137dc80d0SCameron Smith   cpus = ((double)cycles)/(usec);
4237dc80d0SCameron Smith   if(!phio_self())
4337dc80d0SCameron Smith     fprintf(stderr, "cycles %" PRIu64 " us %" PRIu64 " cycles per micro second %" PRIu64"\n", cycles, usec, cpus);
4437dc80d0SCameron Smith   phastaio_global_cpus = cpus;
4537dc80d0SCameron Smith }
4637dc80d0SCameron Smith /*return elapsed time in micro seconds*/
4737dc80d0SCameron Smith size_t phastaio_time_diff(phioTime* start, phioTime* end) {
4837dc80d0SCameron Smith   size_t cycles = *end - *start;
4937dc80d0SCameron Smith   size_t us = ((double)cycles)/phastaio_global_cpus;
5037dc80d0SCameron Smith   return us;
5137dc80d0SCameron Smith }
5237dc80d0SCameron Smith #else
5337dc80d0SCameron Smith void phastaio_time(phioTime* t) {
5437dc80d0SCameron Smith   int err;
5537dc80d0SCameron Smith   err = clock_gettime(CLOCK_MONOTONIC,t);
5637dc80d0SCameron Smith   assert(!err);
5737dc80d0SCameron Smith }
5837dc80d0SCameron Smith /*return elapsed time in micro seconds*/
5937dc80d0SCameron Smith size_t phastaio_time_diff(phioTime* start, phioTime* end) {
6037dc80d0SCameron Smith   assert(sizeof(size_t)==8);
6137dc80d0SCameron Smith   size_t elapsed = 0;
6237dc80d0SCameron Smith   phioTime diff;
6337dc80d0SCameron Smith   if ((end->tv_nsec-start->tv_nsec)<0) {
6437dc80d0SCameron Smith     diff.tv_sec = end->tv_sec-start->tv_sec-1;
6537dc80d0SCameron Smith     diff.tv_nsec = BILLION+end->tv_nsec-start->tv_nsec;
6637dc80d0SCameron Smith   } else {
6737dc80d0SCameron Smith     diff.tv_sec = end->tv_sec-start->tv_sec;
6837dc80d0SCameron Smith     diff.tv_nsec = end->tv_nsec-start->tv_nsec;
6937dc80d0SCameron Smith   }
7037dc80d0SCameron Smith   elapsed = (diff.tv_sec)*MILLION + (diff.tv_nsec)/1000L;
7137dc80d0SCameron Smith   return elapsed;
7237dc80d0SCameron Smith }
7337dc80d0SCameron Smith #endif
7459599516SKenneth E. Jansen 
7559599516SKenneth E. Jansen double phiotmrc (void)
7659599516SKenneth E. Jansen {
7759599516SKenneth E. Jansen 
7859599516SKenneth E. Jansen #ifdef __bgq__
7959599516SKenneth E. Jansen 
8059599516SKenneth E. Jansen    // use the GetTimeBase function available on BGQ
8159599516SKenneth E. Jansen    uint64_t TB  = GetTimeBase();
8259599516SKenneth E. Jansen    double t1 = 6.25e-10*TB; // = 1/1.6e9
8359599516SKenneth E. Jansen 
8459599516SKenneth E. Jansen #else
8559599516SKenneth E. Jansen 
8659599516SKenneth E. Jansen   // use the gettimeofday function available on any Linux plateform
8759599516SKenneth E. Jansen 
8859599516SKenneth E. Jansen   int rc;
8959599516SKenneth E. Jansen   struct timeval tv;
9059599516SKenneth E. Jansen 
9159599516SKenneth E. Jansen   rc = gettimeofday (&tv, NULL);
9259599516SKenneth E. Jansen   if (rc == -1) {
9359599516SKenneth E. Jansen     fprintf(stderr,"tmrc: gettimeofday\n");
9459599516SKenneth E. Jansen     return 0.;
9559599516SKenneth E. Jansen   }
9659599516SKenneth E. Jansen   double t1 =  ((double) tv.tv_sec) + 1.e-6 * ((double) tv.tv_usec);
9759599516SKenneth E. Jansen 
9859599516SKenneth E. Jansen #endif
9959599516SKenneth E. Jansen 
10059599516SKenneth E. Jansen   return t1;
10159599516SKenneth E. Jansen 
10259599516SKenneth E. Jansen }
10359599516SKenneth E. Jansen 
104