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