diff --git a/ompi/mpi/c/wtick.c b/ompi/mpi/c/wtick.c index 9f4795f192..a246288e77 100644 --- a/ompi/mpi/c/wtick.c +++ b/ompi/mpi/c/wtick.c @@ -12,6 +12,9 @@ * Copyright (c) 2007-2014 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2015-2016 Research Organization for Information Science * and Technology (RIST). All rights reserved. + * Copyright (c) 2017 IBM Corporation. All rights reserved. + * Copyright (c) 2017 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -24,6 +27,9 @@ #include #endif #include +#ifdef HAVE_TIME_H +#include +#endif #include MCA_timer_IMPLEMENTATION_HEADER #include "ompi/mpi/c/bindings.h" @@ -40,6 +46,11 @@ double MPI_Wtick(void) { OPAL_CR_NOOP_PROGRESS(); + /* + * See https://github.com/open-mpi/ompi/issues/3003 + * to get an idea what's going on here. + */ +#if 0 #if OPAL_TIMER_CYCLE_NATIVE { opal_timer_t freq = opal_timer_base_get_freq(); @@ -52,8 +63,21 @@ double MPI_Wtick(void) } #elif OPAL_TIMER_USEC_NATIVE return 0.000001; +#endif +#else +#if defined(__linux__) && OPAL_HAVE_CLOCK_GETTIME + struct timespec spec; + double wtick = 0.0; + if (0 == clock_getres(CLOCK_MONOTONIC, &spec)){ + wtick = spec.tv_sec + spec.tv_nsec * 1.0e-09; + } else { + /* guess */ + wtick = 1.0e-09; + } + return wtick; #else /* Otherwise, we already return usec precision. */ return 0.000001; #endif +#endif } diff --git a/ompi/mpi/c/wtime.c b/ompi/mpi/c/wtime.c index fa62c985c7..2b72d27ba7 100644 --- a/ompi/mpi/c/wtime.c +++ b/ompi/mpi/c/wtime.c @@ -12,6 +12,9 @@ * Copyright (c) 2006-2014 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. + * Copyright (c) 2017 IBM Corporation. All rights reserved. + * Copyright (c) 2017 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -24,6 +27,9 @@ #include #endif #include +#ifdef HAVE_TIME_H +#include +#endif /* HAVE_TIME_H */ #include MCA_timer_IMPLEMENTATION_HEADER #include "ompi/mpi/c/bindings.h" @@ -40,16 +46,29 @@ double MPI_Wtime(void) { double wtime; + /* + * See https://github.com/open-mpi/ompi/issues/3003 to find out + * what's happening here. + */ +#if 0 #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; +#endif +#else +#if defined(__linux__) && OPAL_HAVE_CLOCK_GETTIME + struct timespec tp = {.tv_sec = 0, .tv_nsec = 0}; + (void) clock_gettime(CLOCK_MONOTONIC, &tp); + wtime = tp.tv_sec; + wtime += tp.tv_nsec/1.0e+9; #else /* Fall back to gettimeofday() if we have nothing else */ struct timeval tv; gettimeofday(&tv, NULL); wtime = tv.tv_sec; wtime += (double)tv.tv_usec / 1000000.0; +#endif #endif OPAL_CR_NOOP_PROGRESS(); diff --git a/opal/mca/timer/linux/timer_linux.h b/opal/mca/timer/linux/timer_linux.h index 6bf05c9f5d..2c2126c618 100644 --- a/opal/mca/timer/linux/timer_linux.h +++ b/opal/mca/timer/linux/timer_linux.h @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2017 Cisco Systems, Inc. All rights reserved * $COPYRIGHT$ * * Additional copyrights may follow @@ -22,8 +23,6 @@ #include "opal_config.h" #include -OPAL_DECLSPEC extern opal_timer_t opal_timer_linux_freq; - OPAL_DECLSPEC extern opal_timer_t (*opal_timer_base_get_cycles)(void); OPAL_DECLSPEC extern opal_timer_t (*opal_timer_base_get_usec)(void); diff --git a/opal/mca/timer/linux/timer_linux_component.c b/opal/mca/timer/linux/timer_linux_component.c index 5c16ac9487..15a584cd3f 100644 --- a/opal/mca/timer/linux/timer_linux_component.c +++ b/opal/mca/timer/linux/timer_linux_component.c @@ -14,7 +14,7 @@ * and Technology (RIST). All rights reserved. * Copyright (c) 2015-2017 Los Alamos National Security, LLC. All rights * reserved. - * Copyright (c) 2015 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2015-2017 Cisco Systems, Inc. All rights reserved * Copyright (c) 2016 Broadcom Limited. All rights reserved. * $COPYRIGHT$ * @@ -33,23 +33,28 @@ #include "opal/constants.h" #include "opal/util/show_help.h" -static opal_timer_t opal_timer_base_get_cycles_sys_timer(void); -static opal_timer_t opal_timer_base_get_usec_sys_timer(void); +static opal_timer_t opal_timer_linux_get_cycles_sys_timer(void); +static opal_timer_t opal_timer_linux_get_usec_sys_timer(void); /** * Define some sane defaults until we call the _init function. */ #if OPAL_HAVE_CLOCK_GETTIME -static opal_timer_t opal_timer_base_get_cycles_clock_gettime(void); -static opal_timer_t opal_timer_base_get_usec_clock_gettime(void); -opal_timer_t (*opal_timer_base_get_cycles)(void) = opal_timer_base_get_cycles_clock_gettime; -opal_timer_t (*opal_timer_base_get_usec)(void) = opal_timer_base_get_usec_clock_gettime; +static opal_timer_t opal_timer_linux_get_cycles_clock_gettime(void); +static opal_timer_t opal_timer_linux_get_usec_clock_gettime(void); + +opal_timer_t (*opal_timer_base_get_cycles)(void) = + opal_timer_linux_get_cycles_clock_gettime; +opal_timer_t (*opal_timer_base_get_usec)(void) = + opal_timer_linux_get_usec_clock_gettime; #else -opal_timer_t (*opal_timer_base_get_cycles)(void) = opal_timer_base_get_cycles_sys_timer; -opal_timer_t (*opal_timer_base_get_usec)(void) = opal_timer_base_get_usec_sys_timer; +opal_timer_t (*opal_timer_base_get_cycles)(void) = + opal_timer_linux_get_cycles_sys_timer; +opal_timer_t (*opal_timer_base_get_usec)(void) = + opal_timer_linux_get_usec_sys_timer; #endif /* OPAL_HAVE_CLOCK_GETTIME */ -opal_timer_t opal_timer_linux_freq = {0}; +static opal_timer_t opal_timer_linux_freq = {0}; static int opal_timer_linux_open(void); @@ -171,8 +176,8 @@ int opal_timer_linux_open(void) struct timespec res; if( 0 == clock_getres(CLOCK_MONOTONIC, &res)) { opal_timer_linux_freq = 1.e3; - opal_timer_base_get_cycles = opal_timer_base_get_cycles_clock_gettime; - opal_timer_base_get_usec = opal_timer_base_get_usec_clock_gettime; + opal_timer_base_get_cycles = opal_timer_linux_get_cycles_clock_gettime; + opal_timer_base_get_usec = opal_timer_linux_get_usec_clock_gettime; return ret; } #else @@ -181,13 +186,13 @@ int opal_timer_linux_open(void) #endif /* OPAL_HAVE_CLOCK_GETTIME && (0 == OPAL_TIMER_MONOTONIC) */ } ret = opal_timer_linux_find_freq(); - opal_timer_base_get_cycles = opal_timer_base_get_cycles_sys_timer; - opal_timer_base_get_usec = opal_timer_base_get_usec_sys_timer; + opal_timer_base_get_cycles = opal_timer_linux_get_cycles_sys_timer; + opal_timer_base_get_usec = opal_timer_linux_get_usec_sys_timer; return ret; } #if OPAL_HAVE_CLOCK_GETTIME -opal_timer_t opal_timer_base_get_usec_clock_gettime(void) +opal_timer_t opal_timer_linux_get_usec_clock_gettime(void) { struct timespec tp = {.tv_sec = 0, .tv_nsec = 0}; @@ -196,7 +201,7 @@ opal_timer_t opal_timer_base_get_usec_clock_gettime(void) return (tp.tv_sec * 1e6 + tp.tv_nsec/1000); } -opal_timer_t opal_timer_base_get_cycles_clock_gettime(void) +opal_timer_t opal_timer_linux_get_cycles_clock_gettime(void) { struct timespec tp = {.tv_sec = 0, .tv_nsec = 0}; @@ -206,7 +211,7 @@ opal_timer_t opal_timer_base_get_cycles_clock_gettime(void) } #endif /* OPAL_HAVE_CLOCK_GETTIME */ -opal_timer_t opal_timer_base_get_cycles_sys_timer(void) +opal_timer_t opal_timer_linux_get_cycles_sys_timer(void) { #if OPAL_HAVE_SYS_TIMER_GET_CYCLES return opal_sys_timer_get_cycles(); @@ -216,7 +221,7 @@ opal_timer_t opal_timer_base_get_cycles_sys_timer(void) } -opal_timer_t opal_timer_base_get_usec_sys_timer(void) +opal_timer_t opal_timer_linux_get_usec_sys_timer(void) { #if OPAL_HAVE_SYS_TIMER_GET_CYCLES /* freq is in MHz, so this gives usec */ @@ -230,5 +235,3 @@ opal_timer_t opal_timer_base_get_freq(void) { return opal_timer_linux_freq * 1000000; } - -