1*0d32f9a8SKenneth E. Jansen #include <stdio.h> 2*0d32f9a8SKenneth E. Jansen #include <sys/types.h> 3*0d32f9a8SKenneth E. Jansen #include <mpi.h> 4*0d32f9a8SKenneth E. Jansen #include <stdint.h> 5*0d32f9a8SKenneth E. Jansen #include <assert.h> 6*0d32f9a8SKenneth E. Jansen #ifdef __bgq__ 7*0d32f9a8SKenneth E. Jansen #include <hwi/include/bqc/A2_inlines.h> 8*0d32f9a8SKenneth E. Jansen #endif 9*0d32f9a8SKenneth E. Jansen #include "FCMangle.h" 10*0d32f9a8SKenneth E. Jansen 11*0d32f9a8SKenneth E. Jansen #define get_time FortranCInterface_GLOBAL_(get_time, GET_TIME) 12*0d32f9a8SKenneth E. Jansen #define get_max_time_diff FortranCInterface_GLOBAL_(get_max_time_diff, GET_MAX_TIME_DIFF) 13*0d32f9a8SKenneth E. Jansen static double multiplier; 14*0d32f9a8SKenneth E. Jansen 15*0d32f9a8SKenneth E. Jansen void get_max_time_diff(uint64_t* first, uint64_t* last, uint64_t* c_first, uint64_t* c_last, char* lbl) 16*0d32f9a8SKenneth E. Jansen { 17*0d32f9a8SKenneth E. Jansen uint64_t tmp = ((*last)-(*first)); 18*0d32f9a8SKenneth E. Jansen uint64_t iresult; 19*0d32f9a8SKenneth E. Jansen double result; 20*0d32f9a8SKenneth E. Jansen uint64_t c_result; 21*0d32f9a8SKenneth E. Jansen int rank; 22*0d32f9a8SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &rank); 23*0d32f9a8SKenneth E. Jansen assert(tmp > 0); 24*0d32f9a8SKenneth E. Jansen MPI_Allreduce(&tmp, &iresult, 1, MPI_UINT64_T, MPI_MAX, MPI_COMM_WORLD); 25*0d32f9a8SKenneth E. Jansen result = iresult*multiplier; 26*0d32f9a8SKenneth E. Jansen if(__builtin_expect(*c_last < *c_first, 0)) 27*0d32f9a8SKenneth E. Jansen { 28*0d32f9a8SKenneth E. Jansen tmp = *c_last + (UINT64_MAX - *c_first); 29*0d32f9a8SKenneth E. Jansen } 30*0d32f9a8SKenneth E. Jansen else 31*0d32f9a8SKenneth E. Jansen { 32*0d32f9a8SKenneth E. Jansen tmp = ((*c_last)-(*c_first)); 33*0d32f9a8SKenneth E. Jansen } 34*0d32f9a8SKenneth E. Jansen MPI_Allreduce(&tmp, &iresult, 1, MPI_UINT64_T, MPI_MAX, MPI_COMM_WORLD); 35*0d32f9a8SKenneth E. Jansen c_result = iresult; 36*0d32f9a8SKenneth E. Jansen if(rank == 0) 37*0d32f9a8SKenneth E. Jansen printf("%s: %.12g seconds, %llu cycles\n", lbl, result, c_result); 38*0d32f9a8SKenneth E. Jansen } 39*0d32f9a8SKenneth E. Jansen 40*0d32f9a8SKenneth E. Jansen /* 41*0d32f9a8SKenneth E. Jansen #ifdef __APPLE__ 42*0d32f9a8SKenneth E. Jansen #include <mach/time.h> 43*0d32f9a8SKenneth E. Jansen //todo 44*0d32f9a8SKenneth E. Jansen #endif 45*0d32f9a8SKenneth E. Jansen */ 46*0d32f9a8SKenneth E. Jansen 47*0d32f9a8SKenneth E. Jansen //#if defined(__bgq__) || defined(__APPLE__) 48*0d32f9a8SKenneth E. Jansen #if (1) 49*0d32f9a8SKenneth E. Jansen #include <sys/time.h> 50*0d32f9a8SKenneth E. Jansen void get_time(uint64_t* rv, uint64_t* cycle) 51*0d32f9a8SKenneth E. Jansen { 52*0d32f9a8SKenneth E. Jansen struct timeval time; 53*0d32f9a8SKenneth E. Jansen int ret; 54*0d32f9a8SKenneth E. Jansen ret = gettimeofday(&time, NULL); 55*0d32f9a8SKenneth E. Jansen if(ret != 0) perror("gettimeofday failed: "); 56*0d32f9a8SKenneth E. Jansen *rv = ((time.tv_sec*1000000)+(time.tv_usec)); 57*0d32f9a8SKenneth E. Jansen multiplier=0.000001;//10.0e-6; 58*0d32f9a8SKenneth E. Jansen #ifdef __bgq__ 59*0d32f9a8SKenneth E. Jansen *cycle = GetTimeBase(); 60*0d32f9a8SKenneth E. Jansen #endif 61*0d32f9a8SKenneth E. Jansen } 62*0d32f9a8SKenneth E. Jansen #else 63*0d32f9a8SKenneth E. Jansen #include <time.h> 64*0d32f9a8SKenneth E. Jansen void get_time(uint64_t* rv) 65*0d32f9a8SKenneth E. Jansen { 66*0d32f9a8SKenneth E. Jansen struct timespec time; 67*0d32f9a8SKenneth E. Jansen clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time); 68*0d32f9a8SKenneth E. Jansen *rv = ((time.tv_sec*1000000000)+(time.tv_nsec)); 69*0d32f9a8SKenneth E. Jansen multiplier = 0.000000001; 70*0d32f9a8SKenneth E. Jansen } 71*0d32f9a8SKenneth E. Jansen #endif 72