xref: /petsc/src/sys/mpiuni/mpitime.c (revision 03047865b8d8757cf1cf9cda45785c1537b01dc1)
1 #include <petscsys.h>
2 #if !defined(MPIUNI_H)
3   #error "Wrong mpi.h included! require mpi.h from MPIUNI"
4 #endif
5 
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) */
15 
MPI_Wtime(void)16 double MPI_Wtime(void)
17 {
18   static int           flag = 1;
19   static LARGE_INTEGER StartTime, PerfFreq, CurTime;
20   static double        SecInTick = 0.0;
21 
22   DWORD  dwStartHigh, dwCurHigh;
23   double dTime, dHigh;
24   double ptime;
25 
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   }
38 
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);
48 
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 }
61 
62 /*
63     The usual Unix time routines.
64 */
65 #else
66 
67   #if defined(PETSC_HAVE_SYS_TIME_H)
68     #include <sys/time.h>
69   #endif
70 
71 double MPI_Wtime(void)
72 {
73   static struct timeval _tp;
74   gettimeofday(&_tp, NULL);
75   return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec);
76 }
77 #endif
78 
79 #if defined(__cplusplus)
80 }
81 #endif
82