summaryrefslogtreecommitdiffstats
path: root/perform/pio_timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'perform/pio_timer.c')
-rw-r--r--perform/pio_timer.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/perform/pio_timer.c b/perform/pio_timer.c
new file mode 100644
index 0000000..1220e38
--- /dev/null
+++ b/perform/pio_timer.c
@@ -0,0 +1,137 @@
+/*
+ * 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>
+#include <mpi.h>
+
+#if 0
+
+#include "hdf5.h"
+
+#endif /* 0 */
+
+#include "pio_timer.h"
+
+/*
+ * 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
+
+/*
+ * Function: perf_time_new
+ * 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).
+ * Return: Pointer to perf_time object
+ * Programmer: Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+perf_time *
+perf_time_new(unsigned int type)
+{
+ perf_time *pt = (perf_time *)calloc(1, sizeof(struct perf_time_));
+
+ pt->type = type;
+ return pt;
+}
+
+/*
+ * Function: perf_time_destroy
+ * Purpose: Remove the memory allocated for the perf_time object. Only
+ * need to call on a pointer allocated with the ``perf_time_new''
+ * function.
+ * Return: Nothing
+ * Programmer: Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+void
+perf_time_destroy(perf_time *pt)
+{
+ 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
+ * timer with the perf_timer_new function (shame!).
+ * Return: Nothing
+ * Programmer: Bill Wendling, 04. October 2001
+ * Modifications:
+ */
+void
+set_timer_type(perf_time *pt, timer_type type)
+{
+ 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
+get_timer_type(perf_time *pt)
+{
+ return pt->type;
+}
+
+/*
+ * Function: set_time
+ * Purpose: Set the time in a ``perf_time'' object.
+ * Return: Pointer to the passed in ``perf_time'' object.
+ * Programmer: Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+perf_time *
+set_time(perf_time *pt, timer_type t, int start_stop)
+{
+ 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);
+ pt->total_time[t] += (double)pt->sys_timer[t].tv_sec +
+ ((double)pt->sys_timer[t].tv_usec) / MILLISECOND;
+ }
+ }
+ }
+
+ return pt;
+}
+
+/*
+ * Function: get_time
+ * Purpose: Get the time from a ``perf_time'' object.
+ * Return: The number of seconds as a DOUBLE.
+ * Programmer: Bill Wendling, 01. October 2001
+ * Modifications:
+ */
+double
+get_time(perf_time *pt, timer_type t)
+{
+ return pt->total_time[t];
+}