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