1
1

Merge pull request #537 from nkogteva/timings_fixes

opal timing: added ability to choose the timer type
Этот коммит содержится в:
Mike Dubman 2015-04-17 18:27:46 +03:00
родитель 9a5a5111e6 116169c38a
Коммит 45396451cc
4 изменённых файлов: 59 добавлений и 23 удалений

Просмотреть файл

@ -99,7 +99,7 @@ int ompi_mpi_finalize(void)
ompi_proc_t** procs; ompi_proc_t** procs;
size_t nprocs; size_t nprocs;
OPAL_TIMING_DECLARE(tm); OPAL_TIMING_DECLARE(tm);
OPAL_TIMING_INIT(&tm); OPAL_TIMING_INIT_EXT(&tm, OPAL_TIMING_GET_TIME_OF_DAY);
/* Be a bit social if an erroneous program calls MPI_FINALIZE in /* Be a bit social if an erroneous program calls MPI_FINALIZE in

Просмотреть файл

@ -388,7 +388,7 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided)
char *error = NULL; char *error = NULL;
char *cmd=NULL, *av=NULL; char *cmd=NULL, *av=NULL;
OPAL_TIMING_DECLARE(tm); OPAL_TIMING_DECLARE(tm);
OPAL_TIMING_INIT(&tm); OPAL_TIMING_INIT_EXT(&tm, OPAL_TIMING_GET_TIME_OF_DAY);
/* bitflag of the thread level support provided. To be used /* bitflag of the thread level support provided. To be used
* for the modex in order to work in heterogeneous environments. */ * for the modex in order to work in heterogeneous environments. */

Просмотреть файл

@ -59,10 +59,6 @@ struct interval_descr{
double interval, overhead; double interval, overhead;
}; };
opal_timing_event_t *opal_timing_event_alloc(opal_timing_t *t);
void opal_timing_init(opal_timing_t *t);
opal_timing_prep_t opal_timing_prep_ev(opal_timing_t *t, const char *fmt, ...);
static OBJ_CLASS_INSTANCE(opal_timing_event_t, opal_list_item_t, NULL, NULL); static OBJ_CLASS_INSTANCE(opal_timing_event_t, opal_list_item_t, NULL, NULL);
@ -165,15 +161,34 @@ static double get_ts_cycle(void)
{ {
return ((double) opal_timer_base_get_cycles()) / opal_timer_base_get_freq(); return ((double) opal_timer_base_get_cycles()) / opal_timer_base_get_freq();
} }
#elif OPAL_TIMER_USEC_NATIVE #endif
#if OPAL_TIMER_USEC_NATIVE
static double get_ts_usec(void) static double get_ts_usec(void)
{ {
return ((double) opal_timer_base_get_usec()) / 1000000.0; return ((double) opal_timer_base_get_usec()) / 1000000.0;
} }
#endif #endif
static get_ts_t _init_timestamping(void) static get_ts_t _init_timestamping(opal_timer_type_t type)
{ {
switch (type) {
case OPAL_TIMING_GET_TIME_OF_DAY:
return get_ts_gettimeofday;
case OPAL_TIMING_CYCLE_NATIVE:
#if OPAL_TIMER_CYCLE_NATIVE
return get_ts_cycle;
#else
return NULL;
#endif // OPAL_TIMER_CYCLE_NATIVE
case OPAL_TIMING_USEC_NATIVE:
#if OPAL_TIMER_USEC_NATIVE
return get_ts_usec;
#else
return NULL;
#endif // OPAL_TIMER_USEC_NATIVE
default:
if( !opal_initialized ){ if( !opal_initialized ){
return get_ts_gettimeofday; return get_ts_gettimeofday;
} }
@ -184,7 +199,7 @@ static get_ts_t _init_timestamping(void)
#endif #endif
return get_ts_gettimeofday; return get_ts_gettimeofday;
} }
}
opal_timing_event_t *opal_timing_event_alloc(opal_timing_t *t) opal_timing_event_t *opal_timing_event_alloc(opal_timing_t *t)
{ {
@ -209,7 +224,7 @@ opal_timing_event_t *opal_timing_event_alloc(opal_timing_t *t)
return t->buffer + tmp; return t->buffer + tmp;
} }
void opal_timing_init(opal_timing_t *t) int opal_timing_init(opal_timing_t *t, opal_timer_type_t type)
{ {
memset(t,0,sizeof(*t)); memset(t,0,sizeof(*t));
@ -223,8 +238,11 @@ void opal_timing_init(opal_timing_t *t)
* will be allocated at first event report */ * will be allocated at first event report */
t->buffer_offset = t->buffer_size; t->buffer_offset = t->buffer_size;
/* initialize gettime function */ /* initialize gettime function */
t->get_ts = _init_timestamping(); t->get_ts = _init_timestamping(type);
if (NULL == t->get_ts) {
return OPAL_ERR_BAD_PARAM;
}
return OPAL_SUCCESS;
} }
opal_timing_prep_t opal_timing_prep_ev(opal_timing_t *t, const char *fmt, ...) opal_timing_prep_t opal_timing_prep_ev(opal_timing_t *t, const char *fmt, ...)

Просмотреть файл

@ -16,6 +16,13 @@
#include "opal/class/opal_list.h" #include "opal/class/opal_list.h"
#include "opal/runtime/opal_params.h" #include "opal/runtime/opal_params.h"
typedef enum {
OPAL_TIMING_AUTOMATIC_TIMER,
OPAL_TIMING_GET_TIME_OF_DAY,
OPAL_TIMING_CYCLE_NATIVE,
OPAL_TIMING_USEC_NATIVE
} opal_timer_type_t;
#if OPAL_ENABLE_TIMING #if OPAL_ENABLE_TIMING
#define OPAL_TIMING_DESCR_MAX 1024 #define OPAL_TIMING_DESCR_MAX 1024
@ -94,7 +101,7 @@ int opal_timing_set_jobid(char *jid);
* @retval OPAL_SUCCESS On success * @retval OPAL_SUCCESS On success
* @retval OPAL_ERROR On failure * @retval OPAL_ERROR On failure
*/ */
void opal_timing_init(opal_timing_t *t); int opal_timing_init(opal_timing_t *t, opal_timer_type_t type);
/** /**
* Prepare timing event, do all printf-like processing. * Prepare timing event, do all printf-like processing.
@ -278,7 +285,16 @@ void opal_timing_release(opal_timing_t *t);
* *
* @see opal_timing_init() * @see opal_timing_init()
*/ */
#define OPAL_TIMING_INIT(t) opal_timing_init(t) #define OPAL_TIMING_INIT(t) opal_timing_init(t, OPAL_TIMING_AUTOMATIC_TIMER)
/**
* Main macro for use in initializing opal timing handler;
* will be "compiled out" when OPAL is configured without
* --enable-timing.
*
* @see opal_timing_init()
*/
#define OPAL_TIMING_INIT_EXT(t, type) opal_timing_init(t, type)
/** /**
* Macro that enqueues event with its description to the specified * Macro that enqueues event with its description to the specified
@ -408,6 +424,8 @@ void opal_timing_release(opal_timing_t *t);
#define OPAL_TIMING_INIT(t) #define OPAL_TIMING_INIT(t)
#define OPAL_TIMING_INIT_EXT(t, type)
#define OPAL_TIMING_EVENT(x) #define OPAL_TIMING_EVENT(x)
#define OPAL_TIMING_MDESCR(x) #define OPAL_TIMING_MDESCR(x)