ENH: provide basic cpu-information

- can be useful later when trying to interpret run-times etc.

  Contains only the most basic information.
This commit is contained in:
Mark Olesen 2016-06-15 12:38:46 +02:00
parent e2d01c02e3
commit c7b27f5af9
8 changed files with 457 additions and 21 deletions

View File

@ -0,0 +1,3 @@
Test-cpuInfo.C
EXE = $(FOAM_USER_APPBIN)/Test-cpuInfo

View File

View File

@ -0,0 +1,47 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM 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 General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Application
Description
\*---------------------------------------------------------------------------*/
#include "cpuInfo.H"
#include "IOstreams.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
cpuInfo().write(Info);
Info<< endl;
return 0;
}
// ************************************************************************* //

View File

@ -10,6 +10,7 @@ fileStat.C
POSIX.C
cpuTime/cpuTime.C
clockTime/clockTime.C
cpuInfo/cpuInfo.C
memInfo/memInfo.C
/*

View File

@ -0,0 +1,241 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM 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 General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "cpuInfo.H"
#include "IFstream.H"
#include "IOstreams.H"
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
// file-scope function
template<class T>
inline static void writeEntry
(
Foam::Ostream& os, const Foam::word& key, const T& value
)
{
os.writeKeyword(key) << value << Foam::token::END_STATEMENT << '\n';
}
// file-scope function
static bool split(std::string& line, std::string& key, std::string& val)
{
std::string::size_type sep = line.find(':');
if (sep == std::string::npos)
{
return false;
}
std::string::size_type endKey = line.find_last_not_of("\t:", sep);
std::string::size_type begVal = line.find_first_not_of(" :", sep);
if (endKey == std::string::npos || begVal == std::string::npos)
{
return false;
}
++endKey;
// replace spaces in key with '_' for ease of use/consistency
for
(
std::string::iterator iter = line.begin();
iter != line.end();
++iter
)
{
if (*iter == ' ')
{
*iter = '_';
}
else if (*iter == ':')
{
break;
}
}
key = line.substr(0, endKey);
val = line.substr(begVal);
// std::cerr<<"key=" << key << " val= " << val << '\n';
return true;
}
// file-scope function - get int
static inline bool getInt(const std::string& str, int& val)
{
int i;
if (sscanf(str.c_str(), "%d", &i) == 1)
{
val = i;
return true;
}
else
{
return false;
}
}
// file-scope function - get float
static inline bool getFlt(const std::string& str, float& val)
{
float f;
if (sscanf(str.c_str(), "%f", &f) == 1)
{
val = f;
return true;
}
else
{
return false;
}
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// parse this type of content:
// ===========================
// processor : 0
// vendor_id : GenuineIntel
// cpu family : 6
// model : 63
// model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
// stepping : 2
// microcode : 0x35
// cpu MHz : 1200.000
// cache size : 15360 KB
// physical id : 0
// siblings : 12
// core id : 0
// cpu cores : 6
// apicid : 0
// initial apicid : 0
// fpu : yes
// fpu_exception : yes
// cpuid level : 15
// wp : yes
// flags : fpu vme ...
// bugs :
// bogomips : 4789.15
// clflush size : 64
// cache_alignment : 64
// address sizes : 46 bits physical, 48 bits virtual
// power management:
void Foam::cpuInfo::parse()
{
int ncpu = 0;
IFstream is("/proc/cpuinfo");
while (is.good())
{
string line, key, value;
is.getLine(line);
if (!split(line, key, value))
{
continue;
}
if (key == "processor")
{
if (ncpu++)
{
break; // stop after the first cpu
}
}
else if (key == "vendor_id") { vendor_id = value; }
else if (key == "model_name") { model_name = value; }
else if (key == "cpu_family") { getInt(value, cpu_family); }
else if (key == "model") { getInt(value, model); }
else if (key == "cpu_MHz") { getFlt(value, cpu_MHz); }
else if (key == "cpu_cores") { getInt(value, cpu_cores); }
else if (key == "siblings") { getInt(value, siblings); }
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::cpuInfo::cpuInfo()
:
vendor_id(),
model_name(),
cpu_family(-1),
model(-1),
cpu_MHz(0),
siblings(0),
cpu_cores(0)
{
parse();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::cpuInfo::~cpuInfo()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::cpuInfo::write(Ostream& os) const
{
if (!vendor_id.empty())
{
writeEntry(os, "vendor_id", vendor_id);
}
if (!model_name.empty())
{
writeEntry(os, "model_name", model_name);
}
if (cpu_family != -1)
{
writeEntry(os, "cpu_family", cpu_family);
}
if (model != -1)
{
writeEntry(os, "model", model);
}
if (cpu_MHz > 0)
{
writeEntry(os, "cpu_MHz", cpu_MHz);
}
if (cpu_cores > 0)
{
writeEntry(os, "cpu_cores", cpu_cores);
}
if (siblings > 0)
{
writeEntry(os, "siblings", siblings);
}
}
// ************************************************************************* //

View File

@ -0,0 +1,110 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM 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 General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::cpuInfo
Description
General CPU characteristics.
If the machine has multiple cpus/cores, only the characteristics
of the first core are used.
Note
Uses the information from /proc/cpuinfo
SourceFiles
cpuInfo.C
\*---------------------------------------------------------------------------*/
#ifndef cpuInfo_H
#define cpuInfo_H
#include <string>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// forward declarations
class Ostream;
/*---------------------------------------------------------------------------*\
Class cpuInfo Declaration
\*---------------------------------------------------------------------------*/
class cpuInfo
{
// Private data
// Various bits from /proc/cpuinfo
std::string vendor_id;
std::string model_name;
int cpu_family;
int model;
float cpu_MHz;
int siblings;
int cpu_cores;
// Private Member Functions
//- Parse /proc/cpuinfo
void parse();
//- Disallow default bitwise assignment
void operator=(const cpuInfo&) = delete;
//- Disallow default copy constructor
cpuInfo(const cpuInfo&) = delete;
public:
// Constructors
//- Construct null
cpuInfo();
//- Destructor
~cpuInfo();
// Member Functions
//- Write content as dictionary entries
void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\/ M anipulation |
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -24,14 +24,29 @@ License
\*---------------------------------------------------------------------------*/
#include "memInfo.H"
#include "IFstream.H"
#include "IOstreams.H"
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
// file-scope function
template<class T>
inline static void writeEntry
(
Foam::Ostream& os, const Foam::word& key, const T& value
)
{
os.writeKeyword(key) << value << Foam::token::END_STATEMENT << '\n';
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::memInfo::memInfo()
:
peak_(-1),
size_(-1),
rss_(-1)
peak_(0),
size_(0),
rss_(0)
{
update();
}
@ -48,7 +63,7 @@ Foam::memInfo::~memInfo()
const Foam::memInfo& Foam::memInfo::update()
{
// reset to invalid values first
peak_ = size_ = rss_ = -1;
peak_ = size_ = rss_ = 0;
IFstream is("/proc/" + name(pid()) + "/status");
while (is.good())
@ -81,7 +96,15 @@ const Foam::memInfo& Foam::memInfo::update()
bool Foam::memInfo::valid() const
{
return peak_ != -1;
return peak_ > 0;
}
void Foam::memInfo::write(Ostream& os) const
{
writeEntry(os, "size", size_);
writeEntry(os, "peak", peak_);
writeEntry(os, "rss", rss_);
}
@ -108,14 +131,15 @@ Foam::Istream& Foam::operator>>(Istream& is, memInfo& m)
Foam::Ostream& Foam::operator<<(Ostream& os, const memInfo& m)
{
os << token::BEGIN_LIST
<< m.peak_ << token::SPACE << m.size_ << token::SPACE << m.rss_
<< m.peak_ << token::SPACE
<< m.size_ << token::SPACE
<< m.rss_
<< token::END_LIST;
// Check state of Ostream
os.check
(
"Foam::Ostream& Foam::operator<<(Foam::Ostream&, "
"const Foam::memInfo&)"
"Foam::Ostream& Foam::operator<<(Foam::Ostream&, const Foam::memInfo&)"
);
return os;

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\/ M anipulation |
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -28,7 +28,7 @@ Description
Memory usage information for the process running this object.
Note
Uses the information from /proc/\<pid\>/status
Uses the information from /proc/PID/status
SourceFiles
memInfo.C
@ -47,6 +47,10 @@ SourceFiles
namespace Foam
{
// forward declarations
class Istream;
class Ostream;
/*---------------------------------------------------------------------------*\
Class memInfo Declaration
\*---------------------------------------------------------------------------*/
@ -55,15 +59,20 @@ class memInfo
{
// Private data
//- Peak memory used by the process (VmPeak in /proc/\<pid\>/status)
//- Peak memory used by the process (VmPeak in /proc/PID/status)
int peak_;
//- Memory used by the process (VmSize in /proc/\<pid\>/status)
//- Memory used by the process (VmSize in /proc/PID/status)
int size_;
//- Resident set size of the process (VmRSS in /proc/\<pid\>/status)
//- Resident set size of the process (VmRSS in /proc/PID/status)
int rss_;
//- Disallow default bitwise assignment
void operator=(const memInfo&) = delete;
//- Disallow default copy constructor
memInfo(const memInfo&) = delete;
public:
@ -79,27 +88,24 @@ public:
// Member Functions
//- Parse /proc/\<pid\>/status
//- Parse /proc/PID/status and update accordingly
const memInfo& update();
// Access
//- Access the stored peak memory (VmPeak in /proc/\<pid\>/status)
// The value is stored from the previous update()
//- Peak memory (VmPeak in /proc/PID/status) at last update()
int peak() const
{
return peak_;
}
//- Access the stored memory size (VmSize in /proc/\<pid\>/status)
// The value is stored from the previous update()
//- Memory size (VmSize in /proc/PID/status) at last update()
int size() const
{
return size_;
}
//- Access the stored rss value (VmRSS in /proc/\<pid\>/status)
// The value is stored from the previous update()
//- Resident set size (VmRSS in /proc/PID/status) at last update()
int rss() const
{
return rss_;
@ -109,6 +115,10 @@ public:
bool valid() const;
//- Write content as dictionary entries
void write(Ostream&) const;
// IOstream Operators
//- Read peak/size/rss from stream