Actual source code: mpitime.c

  1: #include <petscsys.h>
  2: #ifndef MPIUNI_H
  3:   #error "Wrong mpi.h included! require mpi.h from MPIUNI"
  4: #endif

  6: #if defined(__cplusplus)
  7: extern "C" {
  8: #endif
  9: /* ------------------------------------------------------------------
 10:    Microsoft Windows has its own time routines
 11: */
 12: #if defined(PETSC_USE_MICROSOFT_TIME)
 13:   #include <windows.h>
 14:   #define FACTOR 4294967296.0 /* pow(2,32) */

 16: double MPI_Wtime(void)
 17: {
 18:   static int           flag = 1;
 19:   static LARGE_INTEGER StartTime, PerfFreq, CurTime;
 20:   static double        SecInTick = 0.0;

 22:   DWORD  dwStartHigh, dwCurHigh;
 23:   double dTime, dHigh;
 24:   double ptime;

 26:   if (flag) {
 27:     if (!QueryPerformanceCounter(&StartTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB);
 28:     if (!QueryPerformanceFrequency(&PerfFreq)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB);
 29:       /* Explicitly convert the higher 32-bits, and add the lower 32-bits from the counter */
 30:       /* works on non-pentium CPUs ? */
 31:   #if defined(PETSC_HAVE_LARGE_INTEGER_U)
 32:     SecInTick = 1.0 / ((double)PerfFreq.u.HighPart * FACTOR + (double)PerfFreq.u.LowPart);
 33:   #else
 34:     SecInTick = 1.0 / ((double)PerfFreq.HighPart * FACTOR + (double)PerfFreq.LowPart);
 35:   #endif
 36:     flag = 0;
 37:   }

 39:   if (!QueryPerformanceCounter(&CurTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB);
 40:   #if defined(PETSC_HAVE_LARGE_INTEGER_U)
 41:   dwCurHigh   = (DWORD)CurTime.u.HighPart;
 42:   dwStartHigh = (DWORD)StartTime.u.HighPart;
 43:   #else
 44:   dwCurHigh   = (DWORD)CurTime.HighPart;
 45:   dwStartHigh = (DWORD)StartTime.HighPart;
 46:   #endif
 47:   dHigh = (signed)(dwCurHigh - dwStartHigh);

 49:   dTime = dHigh * (double)FACTOR;
 50:   #if defined(PETSC_HAVE_LARGE_INTEGER_U)
 51:   dTime += (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
 52:   #else
 53:   dTime += (double)CurTime.LowPart - (double)StartTime.LowPart;
 54:   #endif
 55:   /* Use the following with older versions of the Borland compiler
 56:   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
 57:   */
 58:   ptime = (double)SecInTick * dTime;
 59:   return (ptime);
 60: }

 62: /* ------------------------------------------------------------------
 63:     The usual Unix time routines.
 64: */
 65: #else

 67:   #if defined(PETSC_HAVE_SYS_TIME_H)
 68:     #include <sys/time.h>
 69:   #endif

 71:   #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO)
 72: extern int gettimeofday(struct timeval *, struct timezone *);
 73:   #endif

 75: double MPI_Wtime(void)
 76: {
 77:   static struct timeval _tp;
 78:   gettimeofday(&_tp, (struct timezone *)0);
 79:   return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec);
 80: }
 81: #endif

 83: #if defined(__cplusplus)
 84: }
 85: #endif