Loading...
Searching...
No Matches
cpuInfo.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2016-2023 OpenCFD Ltd.
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26\*---------------------------------------------------------------------------*/
27
28#include "cpuInfo.H"
29#include "IOstreams.H"
30
31#include <fstream>
33// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
34
35// file-scope function
36// split things like "a key word\t: value information"
37// into ("a_key_word", "value information")
38
39static bool split(const std::string& line, std::string& key, std::string& val)
40{
41 key.clear();
42 val.clear();
43
44 const auto keyLen = line.find_first_of("\t:");
45 const auto sep = line.find(':');
46
47 if (keyLen == std::string::npos || sep == std::string::npos)
48 {
49 return false;
50 }
51
52 const auto begVal = line.find_first_not_of(" :", sep);
53
54 if (begVal == std::string::npos)
55 {
56 return false;
57 }
58
59 key = line.substr(0, keyLen);
60 val = line.substr(begVal);
61
62 // Avoid spaces in key - replace with '_'
63 for (auto iter = key.begin(); iter < key.end(); ++iter)
64 {
65 if (*iter == ' ')
66 {
67 *iter = '_';
68 }
69 }
70
71 // std::cerr<<"key=<" << key << "> val=<" << val << ">\n";
72
73 return true;
74}
75
76
77// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
78
79// Parse the following type of content.
80// A TAB separates the keyword from content. Eg,
81//
82// "cpu cores\t: 6"
83//
84// ===========================
85// processor : 0
86// vendor_id : GenuineIntel
87// cpu family : 6
88// model : 63
89// model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
90// stepping : 2
91// microcode : 0x35
92// cpu MHz : 1200.000
93// cache size : 15360 KB
94// physical id : 0
95// siblings : 12
96// core id : 0
97// cpu cores : 6
98// apicid : 0
99// initial apicid : 0
100// fpu : yes
101// fpu_exception : yes
102// cpuid level : 15
103// wp : yes
104// flags : fpu vme ...
105// bugs :
106// bogomips : 4789.15
107// clflush size : 64
108// cache_alignment : 64
109// address sizes : 46 bits physical, 48 bits virtual
110// power management:
111
112void Foam::cpuInfo::populate()
113{
114 int ncpu = 0;
115 std::string line, key, val;
116
117 std::ifstream is("/proc/cpuinfo");
118 while (is.good() && std::getline(is, line))
119 {
120 if (!split(line, key, val))
121 {
122 continue;
123 }
124
125 if (key == "processor")
126 {
127 if (ncpu++)
128 {
129 break; // stop after the first cpu
130 }
131 }
132 else if (key == "vendor_id") { vendor_id = val; }
133 else if (key == "model_name") { model_name = val; }
134 else if (key == "cpu_family") { cpu_family = std::stoi(val); }
135 else if (key == "model") { model = std::stoi(val); }
136 else if (key == "cpu_MHz") { cpu_MHz = std::stof(val); }
137 else if (key == "cpu_cores") { cpu_cores = std::stoi(val); }
138 else if (key == "siblings") { siblings = std::stoi(val); }
139 }
140}
141
142
143// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
144
146:
147 vendor_id(),
148 model_name(),
149 cpu_family(-1),
150 model(-1),
151 cpu_MHz(0),
152 siblings(0),
153 cpu_cores(0)
155 populate();
156}
157
158
159// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
160
162{
163 if (!vendor_id.empty())
164 {
165 os.writeEntry("vendor_id", vendor_id);
166 }
167 if (!model_name.empty())
168 {
169 os.writeEntry("model_name", model_name);
170 }
171
172 os.writeEntryIfDifferent<int>("cpu_family", -1, cpu_family);
173 os.writeEntryIfDifferent<int>("model", -1, model);
174 os.writeEntryIfDifferent<float>("cpu_MHz", 0, cpu_MHz);
175 os.writeEntryIfDifferent<int>("cpu_cores", 0, cpu_cores);
176 os.writeEntryIfDifferent<int>("siblings", 0, siblings);
177}
178
179
180void Foam::cpuInfo::writeEntry(const word& keyword, Ostream& os) const
181{
182 os.beginBlock(keyword);
183 writeEntries(os);
184 os.endBlock();
185}
186
187
188// ************************************************************************* //
Useful combination of include files which define Sin, Sout and Serr and the use of IO streams general...
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition Ostream.H:59
Ostream & writeEntryIfDifferent(const word &key, const T &value1, const T &value2)
Write a keyword/value entry only when the two values differ.
Definition Ostream.H:346
void writeEntries(Ostream &os) const
Write cpu-info as dictionary entries.
Definition cpuInfo.C:154
void writeEntry(const word &keyword, Ostream &os) const
Write cpu-info as dictionary.
Definition cpuInfo.C:173
cpuInfo()
Construct and populate with information.
Definition cpuInfo.C:138
A class for handling words, derived from Foam::string.
Definition word.H:66
static bool split(const std::string &line, std::string &key, std::string &val)
Definition cpuInfo.C:32
OBJstream os(runTime.globalPath()/outputName)
constexpr auto key(const Type &t) noexcept
Helper function to return the enum value.