Changeset 894a5f for src/base/timer.cpp


Ignore:
Timestamp:
Feb 2, 2012, 1:58:12 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
32ff22
Parents:
01be70
Message:

Parallel performance update.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1314 5161e1c8-67bf-11de-9fd5-51895aff932f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/base/timer.cpp

    r01be70 r894a5f  
    114114   comm.PrintStringOnce("Running times:");
    115115   for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter)
    116      comm.PrintStringOnce("  %s: %es", iter->first.c_str(), iter->second.duration);
     116     comm.PrintStringOnce("  %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total);
    117117 }
    118118#endif
    119119}
    120120
     121template <class T>
     122static T min(T* data, int num_data, int& at_rank)
     123{
     124  at_rank = 0;
     125  T min = data[0];
     126
     127  for (int i=1; i<num_data; ++i)
     128    if (data[i] < min) {
     129      at_rank = i;
     130      min = data[i];
     131    }
     132  return min;
     133}
     134
     135template <class T>
     136static T max(T* data, int num_data, int& at_rank)
     137{
     138  at_rank = 0;
     139  T max = data[0];
     140
     141  for (int i=1; i<num_data; ++i)
     142    if (data[i] > max) {
     143      at_rank = i;
     144      max = data[i];
     145    }
     146  return max;
     147}
     148
     149template <class T>
     150static vmg_float avg(T* data, int num_data)
     151{
     152  vmg_float average = 0.0;
     153  vmg_float num_data_inv = 1.0 / static_cast<vmg_float>(num_data);
     154  for (int i=0; i<num_data; ++i)
     155    average += data[i] * num_data_inv;
     156  return average;
     157}
     158
     159void Timer::PrintGlobal()
     160{
     161#ifdef DEBUG_MEASURE_TIME
     162  std::map<std::string, TimerData>::const_iterator iter;
     163  Comm& comm = *MG::GetComm();
     164  char name[80];
     165  int rank, size;
     166
     167  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
     168  MPI_Comm_size(MPI_COMM_WORLD, &size);
     169
     170  vmg_float times[size];
     171  int calls[size];
     172
     173  comm.PrintStringOnce("Running times (global):");
     174
     175  for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter) {
     176    std::strcpy(name, iter->first.c_str());
     177    MPI_Bcast(name, 80, MPI_CHAR, 0, MPI_COMM_WORLD);
     178    MPI_Gather(&Timer::td[name].duration, 1, MPI_DOUBLE, times, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
     179    MPI_Gather(&Timer::td[name].total, 1, MPI_INT, calls, 1, MPI_INT, 0, MPI_COMM_WORLD);
     180
     181    if (rank == 0) {
     182      int min_calls, max_calls, avg_calls;
     183      vmg_float min_duration, max_duration, avg_duration;
     184      int rank_min_calls, rank_max_calls, rank_min_duration, rank_max_duration;
     185
     186      min_duration = min(times, size, rank_min_duration);
     187      max_duration = max(times, size, rank_max_duration);
     188      avg_duration = avg(times, size);
     189      min_calls = min(calls, size, rank_min_calls);
     190      max_calls = max(calls, size, rank_max_calls);
     191      avg_calls = avg(calls, size);
     192
     193      comm.PrintStringOnce("  %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total);
     194      comm.PrintStringOnce("    Min: %e s @ %d", min_duration, rank_min_duration);
     195      comm.PrintStringOnce("    Max: %e s @ %d", max_duration, rank_max_duration);
     196      comm.PrintStringOnce("    Avg: %e s", avg_duration);
     197      comm.PrintStringOnce("    Min calls: %d @ %d", min_calls, rank_min_calls);
     198      comm.PrintStringOnce("    Max calls: %d @ %d", max_calls, rank_max_calls);
     199      comm.PrintStringOnce("    Avg calls: %f", avg_calls);
     200    }
     201  }
     202
     203#endif
     204}
     205
    121206std::ostream& VMG::operator<<(std::ostream& out, const Timer&)
    122207{
Note: See TracChangeset for help on using the changeset viewer.