143 lines
3.6 KiB
C++
143 lines
3.6 KiB
C++
/* -*- c++ -*- ----------------------------------------------------------
|
|
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
|
https://www.lammps.org/, Sandia National Laboratories
|
|
Steve Plimpton, sjplimp@sandia.gov
|
|
|
|
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
|
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
|
certain rights in this software. This software is distributed under
|
|
the GNU General Public License.
|
|
|
|
See the README file in the top-level LAMMPS directory.
|
|
------------------------------------------------------------------------- */
|
|
|
|
#ifndef LMP_TIMER_H
|
|
#define LMP_TIMER_H
|
|
|
|
#include "pointers.h"
|
|
|
|
namespace LAMMPS_NS {
|
|
|
|
class Timer : protected Pointers {
|
|
public:
|
|
enum ttype {
|
|
RESET = -2,
|
|
START = -1,
|
|
TOTAL = 0,
|
|
PAIR,
|
|
BOND,
|
|
KSPACE,
|
|
NEIGH,
|
|
COMM,
|
|
MODIFY,
|
|
OUTPUT,
|
|
SYNC,
|
|
ALL,
|
|
DEPHASE,
|
|
DYNAMICS,
|
|
QUENCH,
|
|
NEB,
|
|
REPCOMM,
|
|
REPOUT,
|
|
NUM_TIMER
|
|
};
|
|
enum tlevel { OFF = 0, LOOP, NORMAL, FULL };
|
|
|
|
Timer(class LAMMPS *);
|
|
~Timer(){};
|
|
void init();
|
|
|
|
// inline function to reduce overhead if we want no detailed timings
|
|
|
|
void stamp(enum ttype which = START)
|
|
{
|
|
if (_level > LOOP) _stamp(which);
|
|
}
|
|
|
|
void barrier_start();
|
|
void barrier_stop();
|
|
|
|
// accessor methods for supported level of detail
|
|
|
|
bool has_loop() const { return (_level >= LOOP); }
|
|
bool has_normal() const { return (_level >= NORMAL); }
|
|
bool has_full() const { return (_level >= FULL); }
|
|
bool has_sync() const { return (_sync != OFF); }
|
|
|
|
// flag if wallclock time is expired
|
|
bool is_timeout() const { return (_timeout == 0.0); }
|
|
|
|
double elapsed(enum ttype);
|
|
double cpu(enum ttype);
|
|
|
|
double get_cpu(enum ttype which) const { return cpu_array[which]; };
|
|
double get_wall(enum ttype which) const { return wall_array[which]; };
|
|
|
|
void set_wall(enum ttype, double);
|
|
|
|
// initialize timeout timer
|
|
void init_timeout();
|
|
|
|
// trigger enforced timeout
|
|
void force_timeout() { _timeout = 0.0; }
|
|
|
|
// restore original timeout setting after enforce timeout
|
|
void reset_timeout() { _timeout = _s_timeout; }
|
|
|
|
// get remaining time in seconds. 0.0 if inactive, negative if expired
|
|
double get_timeout_remain();
|
|
|
|
// print timeout message
|
|
void print_timeout(FILE *);
|
|
|
|
// check for timeout. inline wrapper around internal
|
|
// function to reduce overhead in case there is no check.
|
|
bool check_timeout(int step)
|
|
{
|
|
if (_timeout == 0.0) return true;
|
|
if (_nextcheck != step)
|
|
return false;
|
|
else
|
|
return _check_timeout();
|
|
}
|
|
|
|
void modify_params(int, char **);
|
|
|
|
private:
|
|
double cpu_array[NUM_TIMER];
|
|
double wall_array[NUM_TIMER];
|
|
double previous_cpu;
|
|
double previous_wall;
|
|
double timeout_start;
|
|
int _level; // level of detail: off=0,loop=1,normal=2,full=3
|
|
int _sync; // if nonzero, synchronize tasks before setting the timer
|
|
int _timeout; // max allowed wall time in seconds. infinity if negative
|
|
int _s_timeout; // copy of timeout for restoring after a forced timeout
|
|
int _checkfreq; // frequency of timeout checking
|
|
int _nextcheck; // loop number of next timeout check
|
|
|
|
// update one specific timer array
|
|
void _stamp(enum ttype);
|
|
|
|
// check for timeout
|
|
bool _check_timeout();
|
|
};
|
|
|
|
} // namespace LAMMPS_NS
|
|
|
|
#endif
|
|
|
|
/* ERROR/WARNING messages:
|
|
|
|
W: Wall time limit reached
|
|
|
|
UNDOCUMENTED
|
|
|
|
E: Illegal ... command
|
|
|
|
Self-explanatory. Check the input script syntax and compare to the
|
|
documentation for the command. You can use -echo screen as a
|
|
command-line option when running LAMMPS to see the offending line.
|
|
|
|
*/
|