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