1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
/*
-- MAGMA (version 2.9.0) --
Univ. of Tennessee, Knoxville
Univ. of California, Berkeley
Univ. of Colorado, Denver
@date January 2025
*/
#include "magma_internal.h"
#if defined( _WIN32 ) || defined( _WIN64 )
# include <time.h>
# include <sys/timeb.h>
# if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
# define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
# else
# define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
# endif
#else
# include <sys/time.h>
#endif
// =============================================================================
// Emulate gettimeofday on Windows.
#if defined( _WIN32 ) || defined( _WIN64 )
#ifndef _TIMEZONE_DEFINED
#define _TIMEZONE_DEFINED
struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};
#endif
extern "C"
int gettimeofday(struct timeval* tv, struct timezone* tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
static int tzflag = 0;
if (NULL != tv) {
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
/*converting file time to unix epoch*/
tmpres /= 10; /*convert into microseconds*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
if (NULL != tz) {
if (!tzflag) {
_tzset();
tzflag = 1;
}
tz->tz_minuteswest = _timezone / 60;
tz->tz_dsttime = _daylight;
}
return 0;
}
#endif
/***************************************************************************//**
@return Current wall-clock time in seconds.
Resolution is from gettimeofday.
@ingroup magma_wtime
*******************************************************************************/
extern "C"
double magma_wtime( void )
{
struct timeval t;
gettimeofday( &t, NULL );
return t.tv_sec + t.tv_usec*1e-6;
}
/***************************************************************************//**
Calls magma_queue_sync() to synchronize, then returns current time.
@param[in] queue Queue to synchronize.
@return Current wall-clock time in seconds.
Resolution is from gettimeofday.
@ingroup magma_wtime
*******************************************************************************/
extern "C"
double magma_sync_wtime( magma_queue_t queue )
{
magma_queue_sync( queue );
return magma_wtime();
}
#define magmaf_wtime FORTRAN_NAME( magmaf_wtime, MAGMAF_WTIME )
/***************************************************************************//**
Version of magma_wtime() that is callable from Fortran.
@param[out]
time On output, set to current wall-clock time in seconds.
Resolution is from gettimeofday.
@ingroup magma_wtime
*******************************************************************************/
extern "C"
void magmaf_wtime(double *time)
{
*time = magma_wtime();
}
|