xref: /petsc/src/sys/mpiuni/mpitime.c (revision 6a2f88bb130cf410a8b5539452c84ac6e9bbd54e)
1*6a2f88bbSSatish Balay #include <mpiuni/mpi.h>
2*6a2f88bbSSatish Balay #if !defined(__MPIUNI_H)
3*6a2f88bbSSatish Balay #error "Wrong mpi.h included! require mpi.h from MPIUNI"
4*6a2f88bbSSatish Balay #endif
5*6a2f88bbSSatish Balay 
6*6a2f88bbSSatish Balay #if defined(__cplusplus)
7*6a2f88bbSSatish Balay extern "C" {
8*6a2f88bbSSatish Balay #endif
9*6a2f88bbSSatish Balay /* ------------------------------------------------------------------
10*6a2f88bbSSatish Balay    Microsoft Windows has its own time routines
11*6a2f88bbSSatish Balay */
12*6a2f88bbSSatish Balay #if defined (PETSC_USE_MICROSOFT_TIME)
13*6a2f88bbSSatish Balay #include <Windows.h>
14*6a2f88bbSSatish Balay #define FACTOR   4294967296.0 /* pow(2,32) */
15*6a2f88bbSSatish Balay 
16*6a2f88bbSSatish Balay double MPI_Wtime(void)
17*6a2f88bbSSatish Balay {
18*6a2f88bbSSatish Balay   static int flag = 1;
19*6a2f88bbSSatish Balay   static LARGE_INTEGER  StartTime,PerfFreq,CurTime;
20*6a2f88bbSSatish Balay   static double SecInTick=0.0;
21*6a2f88bbSSatish Balay 
22*6a2f88bbSSatish Balay   DWORD  dwStartHigh,dwCurHigh;
23*6a2f88bbSSatish Balay   double dTime,dHigh;
24*6a2f88bbSSatish Balay   double ptime;
25*6a2f88bbSSatish Balay 
26*6a2f88bbSSatish Balay   if (flag) {
27*6a2f88bbSSatish Balay     if (!QueryPerformanceCounter(&StartTime)) MPI_Abort(MPI_COMM_WORLD,1);
28*6a2f88bbSSatish Balay     if (!QueryPerformanceFrequency(&PerfFreq)) MPI_Abort(MPI_COMM_WORLD,1);
29*6a2f88bbSSatish Balay     /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
30*6a2f88bbSSatish Balay     /* works on non-pentium CPUs ? */
31*6a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U)
32*6a2f88bbSSatish Balay     SecInTick = 1.0/((double)PerfFreq.u.HighPart*FACTOR+(double)PerfFreq.u.LowPart);
33*6a2f88bbSSatish Balay #else
34*6a2f88bbSSatish Balay     SecInTick = 1.0/((double)PerfFreq.HighPart*FACTOR+(double)PerfFreq.LowPart);
35*6a2f88bbSSatish Balay #endif
36*6a2f88bbSSatish Balay     flag = 0;
37*6a2f88bbSSatish Balay   }
38*6a2f88bbSSatish Balay 
39*6a2f88bbSSatish Balay   if (!QueryPerformanceCounter(&CurTime)) MPI_Abort(MPI_COMM_WORLD,1);
40*6a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U)
41*6a2f88bbSSatish Balay   dwCurHigh   = (DWORD)CurTime.u.HighPart;
42*6a2f88bbSSatish Balay   dwStartHigh = (DWORD)StartTime.u.HighPart;
43*6a2f88bbSSatish Balay #else
44*6a2f88bbSSatish Balay   dwCurHigh   = (DWORD)CurTime.HighPart;
45*6a2f88bbSSatish Balay   dwStartHigh = (DWORD)StartTime.HighPart;
46*6a2f88bbSSatish Balay #endif
47*6a2f88bbSSatish Balay   dHigh       = (signed)(dwCurHigh - dwStartHigh);
48*6a2f88bbSSatish Balay 
49*6a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U)
50*6a2f88bbSSatish Balay   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
51*6a2f88bbSSatish Balay #else
52*6a2f88bbSSatish Balay   dTime = dHigh*(double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
53*6a2f88bbSSatish Balay #endif
54*6a2f88bbSSatish Balay   /* Use the following with older versions of the Borland compiler
55*6a2f88bbSSatish Balay   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
56*6a2f88bbSSatish Balay   */
57*6a2f88bbSSatish Balay   ptime = (double)SecInTick*dTime;
58*6a2f88bbSSatish Balay   return(ptime);
59*6a2f88bbSSatish Balay }
60*6a2f88bbSSatish Balay 
61*6a2f88bbSSatish Balay 
62*6a2f88bbSSatish Balay /* ------------------------------------------------------------------
63*6a2f88bbSSatish Balay     The usual Unix time routines.
64*6a2f88bbSSatish Balay */
65*6a2f88bbSSatish Balay #else
66*6a2f88bbSSatish Balay 
67*6a2f88bbSSatish Balay #if defined(PETSC_HAVE_SYS_TIME_H)
68*6a2f88bbSSatish Balay #include <sys/time.h>
69*6a2f88bbSSatish Balay #endif
70*6a2f88bbSSatish Balay 
71*6a2f88bbSSatish Balay #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO)
72*6a2f88bbSSatish Balay extern int gettimeofday(struct timeval *,struct timezone *);
73*6a2f88bbSSatish Balay #endif
74*6a2f88bbSSatish Balay 
75*6a2f88bbSSatish Balay double MPI_Wtime(void)
76*6a2f88bbSSatish Balay {
77*6a2f88bbSSatish Balay   static struct timeval _tp;
78*6a2f88bbSSatish Balay   gettimeofday(&_tp,(struct timezone *)0);
79*6a2f88bbSSatish Balay   return  ((double)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);
80*6a2f88bbSSatish Balay }
81*6a2f88bbSSatish Balay #endif
82*6a2f88bbSSatish Balay 
83*6a2f88bbSSatish Balay #if defined(__cplusplus)
84*6a2f88bbSSatish Balay }
85*6a2f88bbSSatish Balay #endif
86