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
get_max_time_diff(uint64_t * first,uint64_t * last,uint64_t * c_first,uint64_t * c_last,char * lbl)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>
get_time(uint64_t * rv,uint64_t * cycle)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>
get_time(uint64_t * rv)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