10d32f9a8SKenneth E. Jansen #include <stdio.h>
20d32f9a8SKenneth E. Jansen #include <sys/types.h>
30d32f9a8SKenneth E. Jansen #include <mpi.h>
40d32f9a8SKenneth E. Jansen #include <stdint.h>
50d32f9a8SKenneth E. Jansen #include <assert.h>
60d32f9a8SKenneth E. Jansen #ifdef __bgq__
70d32f9a8SKenneth E. Jansen #include <hwi/include/bqc/A2_inlines.h>
80d32f9a8SKenneth E. Jansen #endif
90d32f9a8SKenneth E. Jansen #include "FCMangle.h"
100d32f9a8SKenneth E. Jansen
110d32f9a8SKenneth E. Jansen #define get_time FortranCInterface_GLOBAL_(get_time, GET_TIME)
120d32f9a8SKenneth E. Jansen #define get_max_time_diff FortranCInterface_GLOBAL_(get_max_time_diff, GET_MAX_TIME_DIFF)
130d32f9a8SKenneth E. Jansen static double multiplier;
140d32f9a8SKenneth E. Jansen
get_max_time_diff(uint64_t * first,uint64_t * last,uint64_t * c_first,uint64_t * c_last,char * lbl)150d32f9a8SKenneth E. Jansen void get_max_time_diff(uint64_t* first, uint64_t* last, uint64_t* c_first, uint64_t* c_last, char* lbl)
160d32f9a8SKenneth E. Jansen {
170d32f9a8SKenneth E. Jansen uint64_t tmp = ((*last)-(*first));
180d32f9a8SKenneth E. Jansen uint64_t iresult;
190d32f9a8SKenneth E. Jansen double result;
200d32f9a8SKenneth E. Jansen uint64_t c_result;
210d32f9a8SKenneth E. Jansen int rank;
220d32f9a8SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &rank);
230d32f9a8SKenneth E. Jansen assert(tmp > 0);
240d32f9a8SKenneth E. Jansen MPI_Allreduce(&tmp, &iresult, 1, MPI_UINT64_T, MPI_MAX, MPI_COMM_WORLD);
250d32f9a8SKenneth E. Jansen result = iresult*multiplier;
260d32f9a8SKenneth E. Jansen if(__builtin_expect(*c_last < *c_first, 0))
270d32f9a8SKenneth E. Jansen {
280d32f9a8SKenneth E. Jansen tmp = *c_last + (UINT64_MAX - *c_first);
290d32f9a8SKenneth E. Jansen }
300d32f9a8SKenneth E. Jansen else
310d32f9a8SKenneth E. Jansen {
320d32f9a8SKenneth E. Jansen tmp = ((*c_last)-(*c_first));
330d32f9a8SKenneth E. Jansen }
340d32f9a8SKenneth E. Jansen MPI_Allreduce(&tmp, &iresult, 1, MPI_UINT64_T, MPI_MAX, MPI_COMM_WORLD);
350d32f9a8SKenneth E. Jansen c_result = iresult;
360d32f9a8SKenneth E. Jansen if(rank == 0)
370d32f9a8SKenneth E. Jansen printf("%s: %.12g seconds, %llu cycles\n", lbl, result, c_result);
380d32f9a8SKenneth E. Jansen }
390d32f9a8SKenneth E. Jansen
400d32f9a8SKenneth E. Jansen /*
410d32f9a8SKenneth E. Jansen #ifdef __APPLE__
420d32f9a8SKenneth E. Jansen #include <mach/time.h>
430d32f9a8SKenneth E. Jansen #endif
440d32f9a8SKenneth E. Jansen */
450d32f9a8SKenneth E. Jansen
46*a0f32c18SCameron Smith /*#if defined(__bgq__) || defined(__APPLE__)*/
470d32f9a8SKenneth E. Jansen #if (1)
480d32f9a8SKenneth E. Jansen #include <sys/time.h>
get_time(uint64_t * rv,uint64_t * cycle)490d32f9a8SKenneth E. Jansen void get_time(uint64_t* rv, uint64_t* cycle)
500d32f9a8SKenneth E. Jansen {
510d32f9a8SKenneth E. Jansen struct timeval time;
520d32f9a8SKenneth E. Jansen int ret;
530d32f9a8SKenneth E. Jansen ret = gettimeofday(&time, NULL);
540d32f9a8SKenneth E. Jansen if(ret != 0) perror("gettimeofday failed: ");
550d32f9a8SKenneth E. Jansen *rv = ((time.tv_sec*1000000)+(time.tv_usec));
56*a0f32c18SCameron Smith multiplier=0.000001;/*10.0e-6;*/
570d32f9a8SKenneth E. Jansen #ifdef __bgq__
580d32f9a8SKenneth E. Jansen *cycle = GetTimeBase();
590d32f9a8SKenneth E. Jansen #endif
600d32f9a8SKenneth E. Jansen }
610d32f9a8SKenneth E. Jansen #else
620d32f9a8SKenneth E. Jansen #include <time.h>
get_time(uint64_t * rv)630d32f9a8SKenneth E. Jansen void get_time(uint64_t* rv)
640d32f9a8SKenneth E. Jansen {
650d32f9a8SKenneth E. Jansen struct timespec time;
660d32f9a8SKenneth E. Jansen clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time);
670d32f9a8SKenneth E. Jansen *rv = ((time.tv_sec*1000000000)+(time.tv_nsec));
680d32f9a8SKenneth E. Jansen multiplier = 0.000000001;
690d32f9a8SKenneth E. Jansen }
700d32f9a8SKenneth E. Jansen #endif
71