2001-11-07 23:28:33 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2001
|
|
|
|
* National Center for Supercomputing Applications
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Purpose:
|
|
|
|
*
|
|
|
|
* This is a module of useful timing functions for performance testing.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2001-11-16 06:46:32 +08:00
|
|
|
#include "pio_timer.h"
|
2001-11-07 23:28:33 +08:00
|
|
|
|
2001-11-16 06:46:32 +08:00
|
|
|
#ifdef H5_HAVE_PARALLEL
|
2001-11-07 23:28:33 +08:00
|
|
|
|
2001-11-16 06:46:32 +08:00
|
|
|
#include <mpi.h>
|
2001-11-07 23:28:33 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The number to divide the tv_usec field with to get a nice decimal to add to
|
|
|
|
* the number of seconds.
|
|
|
|
*/
|
|
|
|
#define MILLISECOND 1000000.0
|
|
|
|
|
|
|
|
/*
|
2001-12-05 06:23:54 +08:00
|
|
|
* Function: pio_time_new
|
2001-11-07 23:28:33 +08:00
|
|
|
* Purpose: Build us a brand, spankin', new performance time object.
|
|
|
|
* The object is a black box to the user. They just tell us
|
|
|
|
* what type of timer they want (MPI_TIMER for MPI_Wtime or
|
|
|
|
* SYS_TIMER for system time).
|
2001-12-05 06:23:54 +08:00
|
|
|
* Return: Pointer to pio_time object
|
2001-11-07 23:28:33 +08:00
|
|
|
* Programmer: Bill Wendling, 01. October 2001
|
|
|
|
* Modifications:
|
|
|
|
*/
|
2001-12-05 06:23:54 +08:00
|
|
|
pio_time *
|
|
|
|
pio_time_new(unsigned int type)
|
2001-11-07 23:28:33 +08:00
|
|
|
{
|
2001-12-05 06:23:54 +08:00
|
|
|
pio_time *pt = (pio_time *)calloc(1, sizeof(struct pio_time_));
|
2002-01-12 03:44:51 +08:00
|
|
|
register int i;
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_TIMERS; ++i)
|
|
|
|
pt->total_time[i] = 0.0;
|
2001-11-07 23:28:33 +08:00
|
|
|
|
|
|
|
pt->type = type;
|
|
|
|
return pt;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2001-12-05 06:23:54 +08:00
|
|
|
* Function: pio_time_destroy
|
|
|
|
* Purpose: Remove the memory allocated for the pio_time object. Only
|
|
|
|
* need to call on a pointer allocated with the ``pio_time_new''
|
2001-11-07 23:28:33 +08:00
|
|
|
* function.
|
|
|
|
* Return: Nothing
|
|
|
|
* Programmer: Bill Wendling, 01. October 2001
|
|
|
|
* Modifications:
|
|
|
|
*/
|
|
|
|
void
|
2001-12-05 06:23:54 +08:00
|
|
|
pio_time_destroy(pio_time *pt)
|
2001-11-07 23:28:33 +08:00
|
|
|
{
|
|
|
|
free(pt);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_timer_type
|
|
|
|
* Purpose: Set the type of the timer to either MPI_TIMER or SYS_TIMER.
|
|
|
|
* This really only needs to be called if you didn't construct a
|
2001-12-05 06:23:54 +08:00
|
|
|
* timer with the pio_timer_new function (shame!).
|
2001-11-07 23:28:33 +08:00
|
|
|
* Return: Nothing
|
|
|
|
* Programmer: Bill Wendling, 04. October 2001
|
|
|
|
* Modifications:
|
|
|
|
*/
|
|
|
|
void
|
2001-12-05 06:23:54 +08:00
|
|
|
set_timer_type(pio_time *pt, timer_type type)
|
2001-11-07 23:28:33 +08:00
|
|
|
{
|
|
|
|
pt->type = type;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: get_timer_type
|
|
|
|
* Purpose: Get the type of the timer.
|
|
|
|
* Return: MPI_TIMER or SYS_TIMER.
|
|
|
|
* Programmer: Bill Wendling, 04. October 2001
|
|
|
|
* Modifications:
|
|
|
|
*/
|
|
|
|
timer_type
|
2001-12-05 06:23:54 +08:00
|
|
|
get_timer_type(pio_time *pt)
|
2001-11-07 23:28:33 +08:00
|
|
|
{
|
|
|
|
return pt->type;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: set_time
|
2001-12-05 06:23:54 +08:00
|
|
|
* Purpose: Set the time in a ``pio_time'' object.
|
|
|
|
* Return: Pointer to the passed in ``pio_time'' object.
|
2001-11-07 23:28:33 +08:00
|
|
|
* Programmer: Bill Wendling, 01. October 2001
|
|
|
|
* Modifications:
|
|
|
|
*/
|
2001-12-05 06:23:54 +08:00
|
|
|
pio_time *
|
|
|
|
set_time(pio_time *pt, timer_type t, int start_stop)
|
2001-11-07 23:28:33 +08:00
|
|
|
{
|
|
|
|
if (pt) {
|
|
|
|
if (pt->type == MPI_TIMER) {
|
|
|
|
if (start_stop == START) {
|
|
|
|
pt->mpi_timer[t] = MPI_Wtime();
|
|
|
|
} else {
|
|
|
|
pt->total_time[t] += MPI_Wtime() - pt->mpi_timer[t];
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (start_stop == START) {
|
|
|
|
gettimeofday(&pt->sys_timer[t], NULL);
|
|
|
|
} else {
|
|
|
|
struct timeval sys_t;
|
|
|
|
|
|
|
|
gettimeofday(&sys_t, NULL);
|
2001-12-12 04:56:02 +08:00
|
|
|
pt->total_time[t] =
|
|
|
|
((double)sys_t.tv_sec +
|
|
|
|
((double)sys_t.tv_usec) / MILLISECOND) -
|
|
|
|
((double)pt->sys_timer[t].tv_sec +
|
|
|
|
((double)pt->sys_timer[t].tv_usec) / MILLISECOND);
|
2001-11-07 23:28:33 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return pt;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Function: get_time
|
2001-12-05 06:23:54 +08:00
|
|
|
* Purpose: Get the time from a ``pio_time'' object.
|
2001-11-07 23:28:33 +08:00
|
|
|
* Return: The number of seconds as a DOUBLE.
|
|
|
|
* Programmer: Bill Wendling, 01. October 2001
|
|
|
|
* Modifications:
|
|
|
|
*/
|
|
|
|
double
|
2001-12-05 06:23:54 +08:00
|
|
|
get_time(pio_time *pt, timer_type t)
|
2001-11-07 23:28:33 +08:00
|
|
|
{
|
|
|
|
return pt->total_time[t];
|
|
|
|
}
|
2001-11-16 06:46:32 +08:00
|
|
|
|
|
|
|
#endif /* H5_HAVE_PARALLEL */
|