Skip to content
Merged
4 changes: 3 additions & 1 deletion ompi/mpi/c/wtick.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ double MPI_Wtick(void)
{
OPAL_CR_NOOP_PROGRESS();

#if OPAL_TIMER_USEC_NATIVE
#if OPAL_TIMER_CYCLE_NATIVE
return opal_timer_base_get_freq();
#elif OPAL_TIMER_USEC_NATIVE
return 0.000001;
#else
/* Otherwise, we already return usec precision. */
Expand Down
4 changes: 3 additions & 1 deletion ompi/mpi/c/wtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ double MPI_Wtime(void)
{
double wtime;

#if OPAL_TIMER_USEC_NATIVE
#if OPAL_TIMER_CYCLE_NATIVE
wtime = ((double) opal_timer_base_get_cycles()) / opal_timer_base_get_freq();
#elif OPAL_TIMER_USEC_NATIVE
wtime = ((double) opal_timer_base_get_usec()) / 1000000.0;
#else
/* Fall back to gettimeofday() if we have nothing else */
Expand Down
17 changes: 1 addition & 16 deletions opal/include/opal/sys/amd64/timer.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand All @@ -25,19 +25,6 @@ typedef uint64_t opal_timer_t;

#if OPAL_GCC_INLINE_ASSEMBLY

#if 0
static inline opal_timer_t
opal_sys_timer_get_cycles(void)
{
opal_timer_t ret;

__asm__ __volatile__("rdtsc" : "=A"(ret));

return ret;
}

#else

static inline opal_timer_t
opal_sys_timer_get_cycles(void)
{
Expand All @@ -46,8 +33,6 @@ opal_sys_timer_get_cycles(void)
return ((opal_timer_t)a) | (((opal_timer_t)d) << 32);
}

#endif

#define OPAL_HAVE_SYS_TIMER_GET_CYCLES 1

#else
Expand Down
4 changes: 2 additions & 2 deletions opal/mca/timer/aix/timer_aix.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2006 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand Down Expand Up @@ -39,7 +39,7 @@ opal_timer_base_get_usec()
retval = (t.tb_high * 1000000) + t.tb_low / 1000;

return retval;
}
}

static inline opal_timer_t
opal_timer_base_get_cycles()
Expand Down
4 changes: 2 additions & 2 deletions opal/mca/timer/altix/timer_altix.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand Down Expand Up @@ -36,7 +36,7 @@ static inline opal_timer_t
opal_timer_base_get_usec(void)
{
return opal_timer_base_get_cycles() / opal_timer_altix_usec_conv;
}
}


static inline opal_timer_t
Expand Down
15 changes: 9 additions & 6 deletions opal/mca/timer/darwin/timer_darwin.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand All @@ -26,15 +26,18 @@ typedef uint64_t opal_timer_t;

/* frequency in mhz */
OPAL_DECLSPEC extern opal_timer_t opal_timer_darwin_freq;

OPAL_DECLSPEC extern mach_timebase_info_data_t opal_timer_darwin_info;

static inline opal_timer_t
opal_timer_base_get_cycles(void)
{
if( opal_timer_darwin_info.denom == 0 ) {
(void) mach_timebase_info(&opal_timer_darwin_info);
}
/* this is basically a wrapper around the "right" assembly to get
the tick counter off the PowerPC Time Base. I believe it's
something similar on x86 */
return mach_absolute_time();
return mach_absolute_time() * opal_timer_darwin_info.numer / opal_timer_darwin_info.denom / 1000;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Watch out for integer overflow here. I think you want to convert the fraction to a double and then multiply the absolute time by that. See this detailed Stack Overflow answer: http://stackoverflow.com/a/23378064/158513

}


Expand All @@ -43,7 +46,7 @@ opal_timer_base_get_usec(void)
{
/* freq is in Hz, so this gives usec */
return mach_absolute_time() * 1000000 / opal_timer_darwin_freq;
}
}


static inline opal_timer_t
Expand All @@ -53,9 +56,9 @@ opal_timer_base_get_freq(void)
}


#define OPAL_TIMER_CYCLE_NATIVE 1
#define OPAL_TIMER_CYCLE_NATIVE 0
#define OPAL_TIMER_CYCLE_SUPPORTED 1
#define OPAL_TIMER_USEC_NATIVE 0
#define OPAL_TIMER_USEC_NATIVE 1
#define OPAL_TIMER_USEC_SUPPORTED 1

#endif
11 changes: 2 additions & 9 deletions opal/mca/timer/darwin/timer_darwin_component.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand All @@ -20,17 +20,15 @@

#include "opal_config.h"

#include <mach/mach_time.h>

#include "opal/mca/timer/timer.h"
#include "opal/mca/timer/darwin/timer_darwin.h"
#include "opal/constants.h"

opal_timer_t opal_timer_darwin_freq;
mach_timebase_info_data_t opal_timer_darwin_info;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would be better as:

mach_timebase_info_data_t opal_timer_darwin_info = { 0, 0 };


static int opal_timer_darwin_open(void);


const opal_timer_base_component_2_0_0_t mca_timer_darwin_component = {
/* First, the mca_component_t struct containing meta information
about the component itself */
Expand Down Expand Up @@ -95,11 +93,6 @@ int opal_timer_darwin_open(void)
nanoseconds, taking the reverse of that and multipling by
1000000000 will give you a frequency in cycles / second if you
think of mach_absolute_time() always returning a cycle count.

By the way, it's interesting to note that because these are
library functions and because of how rosetta works, a PPC
binary running under rosetta on an Intel Mac will behave
exactly like an Intel binary running on an Intel Mac.
*/
opal_timer_darwin_freq = sTBI.denom * (1000000000 / sTBI.numer);

Expand Down
6 changes: 3 additions & 3 deletions opal/mca/timer/linux/timer_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand Down Expand Up @@ -44,7 +44,7 @@ opal_timer_base_get_usec(void)
#else
return 0;
#endif
}
}


static inline opal_timer_t
Expand All @@ -56,7 +56,7 @@ opal_timer_base_get_freq(void)

#define OPAL_TIMER_CYCLE_NATIVE OPAL_HAVE_SYS_TIMER_GET_CYCLES
#define OPAL_TIMER_CYCLE_SUPPORTED OPAL_HAVE_SYS_TIMER_GET_CYCLES
#define OPAL_TIMER_USEC_NATIVE 0
#define OPAL_TIMER_USEC_NATIVE OPAL_HAVE_SYS_TIMER_GET_CYCLES
#define OPAL_TIMER_USEC_SUPPORTED OPAL_HAVE_SYS_TIMER_GET_CYCLES

#endif
4 changes: 2 additions & 2 deletions opal/mca/timer/solaris/timer_solaris.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* Copyright (c) 2004-2014 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Expand Down Expand Up @@ -35,7 +35,7 @@ opal_timer_base_get_usec(void)
{
/* gethrtime returns nanoseconds */
return gethrtime() / 1000;
}
}

static inline opal_timer_t
opal_timer_base_get_freq(void)
Expand Down