⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pregtime.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// pregtime.cc//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Curtis Janssen <cljanss@limitpt.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#ifdef __GNUC__#pragma implementation#endif#ifdef HAVE_CONFIG_H#  include <scconfig.h>#endif#include <iostream>#include <iomanip>#include <util/misc/formio.h>#include <util/group/pregtime.h>using namespace std;using namespace sc;static ClassDesc ParallelRegionTimer_cd(  typeid(ParallelRegionTimer),"ParallelRegionTimer",1,"public RegionTimer",  0, create<ParallelRegionTimer>, 0);ParallelRegionTimer::ParallelRegionTimer(const Ref<KeyVal> &keyval):  RegionTimer(keyval){  msg_ = MessageGrp::get_default_messagegrp();}ParallelRegionTimer::ParallelRegionTimer(const Ref<MessageGrp>&msg,                                         const char *topname,                                         int cpu_time, int wall_time):  RegionTimer(topname, cpu_time, wall_time),  msg_(msg){}ParallelRegionTimer::~ParallelRegionTimer(){}voidParallelRegionTimer::print(ostream &o) const{  int i,j;  if (msg_->n() == 1) {      RegionTimer::print(o);      return;    }  update_top();  int n = nregion();  int minn = n;  int maxn = n;  msg_->max(maxn);  msg_->min(minn);  if (maxn != minn) {      ExEnv::err0()           << "ParallelRegionTimer::print: differing number of regions"           << endl;      abort();    }  double *cpu_time = 0;  double *wall_time = 0;  double *flops = 0;  double *min_cpu_time = 0;  double *min_wall_time = 0;  double *min_flops = 0;  double *max_cpu_time = 0;  double *max_wall_time = 0;  double *max_flops = 0;  double *avg_cpu_time = 0;  double *avg_wall_time = 0;  double *avg_flops = 0;  if (cpu_time_) {      cpu_time = new double[n];      get_cpu_times(cpu_time);      min_cpu_time = new double[n];      get_cpu_times(min_cpu_time);      max_cpu_time = new double[n];      get_cpu_times(max_cpu_time);      avg_cpu_time = new double[n];      get_cpu_times(avg_cpu_time);      msg_->max(max_cpu_time,n);      msg_->min(min_cpu_time,n);      msg_->sum(avg_cpu_time,n);      for (i=0; i<n; i++) {          avg_cpu_time[i] /= msg_->n();        }    }  if (wall_time_) {      wall_time = new double[n];      get_wall_times(wall_time);      min_wall_time = new double[n];      get_wall_times(min_wall_time);      max_wall_time = new double[n];      get_wall_times(max_wall_time);      avg_wall_time = new double[n];      get_wall_times(avg_wall_time);      msg_->max(max_wall_time,n);      msg_->min(min_wall_time,n);      msg_->sum(avg_wall_time,n);      for (i=0; i<n; i++) {          avg_wall_time[i] /= msg_->n();        }    }  const char *flops_name = 0;  if (flops_) {      flops= new double[n];      get_flops(flops);      if (cpu_time_) {        for (i=0; i<n; i++) {          if (fabs(cpu_time[i]) > 1.0e-10) flops[i] /= cpu_time[i]*1000000.;          else flops[i] = 0.0;          }        flops_name = "MFLOP/S";        }      else if (wall_time_) {        for (i=0; i<n; i++) {          if (fabs(wall_time[i]) > 1.0e-10) flops[i] /= wall_time[i]*1000000.;          else flops[i] = 0.0;          }        flops_name = "MFLOP/WS";        }      else {        for (i=0; i<n; i++) {          flops[i] /= 1000000.;          }        flops_name = "mflops";        }      min_flops= new double[n];      memcpy(min_flops, flops, sizeof(double)*n);      max_flops= new double[n];      memcpy(max_flops, flops, sizeof(double)*n);      avg_flops= new double[n];      memcpy(avg_flops, flops, sizeof(double)*n);      msg_->max(max_flops,n);      msg_->min(min_flops,n);      msg_->sum(avg_flops,n);      for (i=0; i<n; i++) {          avg_flops[i] /= msg_->n();        }    }  if (msg_->me() == 0) {      const char **names = new const char*[n];      get_region_names(names);      int *depth = new int[n];      get_depth(depth);      int maxwidth = 0;      double maxtime = 0.0;      for (i=0; i<n; i++) {          int width = strlen(names[i]) + 2 * depth[i] + 2;          if (width > maxwidth) maxwidth = width;          if (cpu_time_ && max_cpu_time[i] > maxtime)              maxtime = max_cpu_time[i];          if (wall_time_ && max_wall_time[i] > maxtime)              maxtime = max_wall_time[i];          if (flops_ && max_flops[i] > maxtime)              maxtime = max_flops[i];        }      int maxtimewidth = 4;      while (maxtime >= 10.0) { maxtime/=10.0; maxtimewidth++; }      o.setf(ios::right);      for (i=0; i<maxwidth; i++) o << " ";      if (cpu_time_) {          o << setw(maxtimewidth+1) << " ";          o << setw(maxtimewidth+1) << " CPU";          o << setw(maxtimewidth+1) << " ";        }      if (wall_time_) {          o << setw(maxtimewidth+1) << " ";          o << setw(maxtimewidth+1) << " Wall";          o << setw(maxtimewidth+1) << " ";        }      if (flops_) {          o << setw(maxtimewidth+1) << " ";          o << " " << setw(maxtimewidth+1) << flops_name;          o << setw(maxtimewidth+1) << " ";        }      o << endl;      for (i=0; i<maxwidth; i++) o << " ";      if (cpu_time_) {          o << setw(maxtimewidth+1) << " min";          o << setw(maxtimewidth+1) << " max";          o << setw(maxtimewidth+1) << " avg";        }      if (wall_time_) {          o << setw(maxtimewidth+1) << " min";          o << setw(maxtimewidth+1) << " max";          o << setw(maxtimewidth+1) << " avg";        }      if (flops_) {          o << setw(maxtimewidth+1) << " min";          o << setw(maxtimewidth+1) << " max";          o << setw(maxtimewidth+1) << " avg";        }      o << endl;      o.setf(ios::fixed);      o.precision(2);      for (i=0; i<n; i++) {          int width = strlen(names[i]) + 2 * depth[i] + 2;          for (j=0; j<depth[i]; j++) o << "  ";          o << names[i] << ": ";          for (j=width; j<maxwidth; j++) o << " ";          if (cpu_time_) {              o << " " << setw(maxtimewidth) << min_cpu_time[i];              o << " " << setw(maxtimewidth) << max_cpu_time[i];              o << " " << setw(maxtimewidth) << avg_cpu_time[i];            }                              if (wall_time_) {              o << " " << setw(maxtimewidth) << min_wall_time[i];              o << " " << setw(maxtimewidth) << max_wall_time[i];              o << " " << setw(maxtimewidth) << avg_wall_time[i];            }          if (flops_) {              o << " " << setw(maxtimewidth) << min_flops[i];              o << " " << setw(maxtimewidth) << max_flops[i];              o << " " << setw(maxtimewidth) << avg_flops[i];            }          o << endl;        }      delete[] names;      delete[] depth;    }  delete[] cpu_time;  delete[] min_cpu_time;  delete[] max_cpu_time;  delete[] avg_cpu_time;  delete[] wall_time;  delete[] min_wall_time;  delete[] max_wall_time;  delete[] avg_wall_time;  delete[] flops;  delete[] min_flops;  delete[] max_flops;  delete[] avg_flops;}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -