xref: /petsc/src/sys/mpiuni/mpitime.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1891da655SBarry Smith #include <petscsys.h>
2c9b973beSBarry Smith #if !defined(MPIUNI_H)
36a2f88bbSSatish Balay #error "Wrong mpi.h included! require mpi.h from MPIUNI"
46a2f88bbSSatish Balay #endif
56a2f88bbSSatish Balay 
66a2f88bbSSatish Balay #if defined(__cplusplus)
76a2f88bbSSatish Balay extern "C" {
86a2f88bbSSatish Balay #endif
96a2f88bbSSatish Balay /* ------------------------------------------------------------------
106a2f88bbSSatish Balay    Microsoft Windows has its own time routines
116a2f88bbSSatish Balay */
126a2f88bbSSatish Balay #if defined(PETSC_USE_MICROSOFT_TIME)
134e8afd12SMosè Giordano #include <windows.h>
146a2f88bbSSatish Balay #define FACTOR 4294967296.0 /* pow(2,32) */
156a2f88bbSSatish Balay 
16*9371c9d4SSatish Balay double MPI_Wtime(void) {
176a2f88bbSSatish Balay   static int           flag = 1;
186a2f88bbSSatish Balay   static LARGE_INTEGER StartTime, PerfFreq, CurTime;
196a2f88bbSSatish Balay   static double        SecInTick = 0.0;
206a2f88bbSSatish Balay 
216a2f88bbSSatish Balay   DWORD  dwStartHigh, dwCurHigh;
226a2f88bbSSatish Balay   double dTime, dHigh;
236a2f88bbSSatish Balay   double ptime;
246a2f88bbSSatish Balay 
256a2f88bbSSatish Balay   if (flag) {
2641e02c4dSJunchao Zhang     if (!QueryPerformanceCounter(&StartTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB);
2741e02c4dSJunchao Zhang     if (!QueryPerformanceFrequency(&PerfFreq)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB);
286a2f88bbSSatish Balay       /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
296a2f88bbSSatish Balay       /* works on non-pentium CPUs ? */
306a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U)
316a2f88bbSSatish Balay     SecInTick = 1.0 / ((double)PerfFreq.u.HighPart * FACTOR + (double)PerfFreq.u.LowPart);
326a2f88bbSSatish Balay #else
336a2f88bbSSatish Balay     SecInTick = 1.0 / ((double)PerfFreq.HighPart * FACTOR + (double)PerfFreq.LowPart);
346a2f88bbSSatish Balay #endif
356a2f88bbSSatish Balay     flag = 0;
366a2f88bbSSatish Balay   }
376a2f88bbSSatish Balay 
3841e02c4dSJunchao Zhang   if (!QueryPerformanceCounter(&CurTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB);
396a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U)
406a2f88bbSSatish Balay   dwCurHigh   = (DWORD)CurTime.u.HighPart;
416a2f88bbSSatish Balay   dwStartHigh = (DWORD)StartTime.u.HighPart;
426a2f88bbSSatish Balay #else
436a2f88bbSSatish Balay   dwCurHigh = (DWORD)CurTime.HighPart;
446a2f88bbSSatish Balay   dwStartHigh = (DWORD)StartTime.HighPart;
456a2f88bbSSatish Balay #endif
466a2f88bbSSatish Balay   dHigh = (signed)(dwCurHigh - dwStartHigh);
476a2f88bbSSatish Balay 
486a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U)
496a2f88bbSSatish Balay   dTime = dHigh * (double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
506a2f88bbSSatish Balay #else
516a2f88bbSSatish Balay   dTime = dHigh * (double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
526a2f88bbSSatish Balay #endif
536a2f88bbSSatish Balay   /* Use the following with older versions of the Borland compiler
546a2f88bbSSatish Balay   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
556a2f88bbSSatish Balay   */
566a2f88bbSSatish Balay   ptime = (double)SecInTick * dTime;
576a2f88bbSSatish Balay   return (ptime);
586a2f88bbSSatish Balay }
596a2f88bbSSatish Balay 
606a2f88bbSSatish Balay /* ------------------------------------------------------------------
616a2f88bbSSatish Balay     The usual Unix time routines.
626a2f88bbSSatish Balay */
636a2f88bbSSatish Balay #else
646a2f88bbSSatish Balay 
656a2f88bbSSatish Balay #if defined(PETSC_HAVE_SYS_TIME_H)
666a2f88bbSSatish Balay #include <sys/time.h>
676a2f88bbSSatish Balay #endif
686a2f88bbSSatish Balay 
696a2f88bbSSatish Balay #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO)
706a2f88bbSSatish Balay extern int gettimeofday(struct timeval *, struct timezone *);
716a2f88bbSSatish Balay #endif
726a2f88bbSSatish Balay 
73*9371c9d4SSatish Balay double MPI_Wtime(void) {
746a2f88bbSSatish Balay   static struct timeval _tp;
756a2f88bbSSatish Balay   gettimeofday(&_tp, (struct timezone *)0);
766a2f88bbSSatish Balay   return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec);
776a2f88bbSSatish Balay }
786a2f88bbSSatish Balay #endif
796a2f88bbSSatish Balay 
806a2f88bbSSatish Balay #if defined(__cplusplus)
816a2f88bbSSatish Balay }
826a2f88bbSSatish Balay #endif
83