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