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