Xmipp  v3.23.11-Nereus
cpu.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  *
3  * Authors: David Strelak (davidstrelak@gmail.com)
4  *
5  * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20  * 02111-1307 USA
21  *
22  * All comments concerning this program package may be sent to the
23  * e-mail address 'xmipp@cnb.csic.es'
24  ***************************************************************************/
25 
26 #include "cpu.h"
27 #include <sstream>
28 
29 void CPU::native_cpuid(unsigned int *eax, unsigned int *ebx,
30  unsigned int *ecx, unsigned int *edx)
31 {
32  /* ecx is often an input as well as an output. */
33  asm volatile("cpuid"
34  : "=a" (*eax),
35  "=b" (*ebx),
36  "=c" (*ecx),
37  "=d" (*edx)
38  : "0" (*eax), "2" (*ecx));
39 }
40 
42  size_t pages = sysconf(_SC_PHYS_PAGES);
43  size_t page_size = sysconf(_SC_PAGE_SIZE);
44  size_t total = pages * page_size;
45  m_totalBytes = total;
46  m_lastFreeBytes = total; // assume we own all memory
47 }
48 
50  // https://stackoverflow.com/a/6491964/5484355
51  unsigned eax = 0;
52  unsigned ebx = 0;
53  unsigned ecx = 0;
54  unsigned edx = 0;
55 
56  std::stringstream ss;
57 
58  eax = 1; /* processor info and feature bits */
59  native_cpuid(&eax, &ebx, &ecx, &edx);
60 
61  ss << (eax & 0xF); ss << " "; // stepping
62  ss << ((eax >> 4) & 0xF); ss << " "; // model
63  ss << ((eax >> 8) & 0xF); ss << " "; // family
64  ss << ((eax >> 12) & 0x3); ss << " "; // processor type
65  ss << ((eax >> 16) & 0xF); ss << " "; // extended model
66  ss << ((eax >> 20) & 0xFF); ss << " "; // extended family
67 
68  m_uuid = ss.str();
69 }
void updateMemoryInfo()
Definition: cpu.cpp:41
void obtainUUID()
Definition: cpu.cpp:49
#define xF
size_t m_totalBytes
Definition: hw.h:80
size_t m_lastFreeBytes
Definition: hw.h:81
std::string m_uuid
Definition: hw.h:82