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:
parent
e2d01c02e3
commit
c7b27f5af9
3
applications/test/cpuInfo/Make/files
Normal file
3
applications/test/cpuInfo/Make/files
Normal file
@ -0,0 +1,3 @@
|
||||
Test-cpuInfo.C
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-cpuInfo
|
0
applications/test/cpuInfo/Make/options
Normal file
0
applications/test/cpuInfo/Make/options
Normal file
47
applications/test/cpuInfo/Test-cpuInfo.C
Normal file
47
applications/test/cpuInfo/Test-cpuInfo.C
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
@ -10,6 +10,7 @@ fileStat.C
|
||||
POSIX.C
|
||||
cpuTime/cpuTime.C
|
||||
clockTime/clockTime.C
|
||||
cpuInfo/cpuInfo.C
|
||||
memInfo/memInfo.C
|
||||
|
||||
/*
|
||||
|
241
src/OSspecific/POSIX/cpuInfo/cpuInfo.C
Normal file
241
src/OSspecific/POSIX/cpuInfo/cpuInfo.C
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
110
src/OSspecific/POSIX/cpuInfo/cpuInfo.H
Normal file
110
src/OSspecific/POSIX/cpuInfo/cpuInfo.H
Normal 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
|
||||
|
||||
// ************************************************************************* //
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user