xref: /phasta/phSolver/common/get_time.c (revision 0d32f9a804c0a2b00cb17c1df80aafdb299b28cb)
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