Gromacs
2024.4
|
#include "gmxpre.h"
#include "cpuinfo.h"
#include "config.h"
#include <cctype>
#include <cstdint>
#include <cstdlib>
#include <algorithm>
#include <fstream>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include "gromacs/utility/basedefinitions.h"
#include "architecture.h"
Implements gmx::CpuInfo.
We need to be able to compile this file in stand-alone mode to use basic CPU feature detection to set the SIMD acceleration and similar things in CMake, while we still want to use more features that enable topology detection when config.h is present.
We solve this by skipping the advanced stuff when the preprocessor macro GMX_CPUINFO_STANDALONE is defined. In this case you likely also need to define GMX_X86_GCC_INLINE_ASM if you are on x86; without inline assembly support it is not possible to perform the actual detection on Linux/Mac. Since these macros are specific to this file, they do not use the GMX prefix.
The remaining defines (GMX_NATIVE_WINDOWS,HAVE_UNISTD_H,HAVE_SCHED_H, HAVE_SYSCONF, HAVE_SCHED_AFFINITY) are only used to determine the topology on 86, and for this we rely on including config.h.
Classes | |
struct | gmx::anonymous_namespace{cpuinfo.cpp}::ApicInfo |
internal structure to return os logical cpu id together with APIC info for it More... | |
struct | gmx::anonymous_namespace{cpuinfo.cpp}::ApicIdLayout |
The layout of the bits in the APIC ID. More... | |
Functions | |
void | gmx::anonymous_namespace{cpuinfo.cpp}::trimString (std::string *s) |
Remove initial and trailing whitespace from string. More... | |
int | gmx::anonymous_namespace{cpuinfo.cpp}::executeX86CpuID (unsigned int gmx_unused level, unsigned int gmx_unused ecxval, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) |
execute x86 cpuid instructions with custom level and extended level More... | |
CpuInfo::Vendor | gmx::anonymous_namespace{cpuinfo.cpp}::detectX86Vendor () |
Detect x86 vendors by using the cpuid assembly instructions. More... | |
bool | gmx::anonymous_namespace{cpuinfo.cpp}::detectProcCpuInfoSecondAvx512FMA (const std::string &brand, int model) |
Detect second AVX-512 FMA from the processor name. More... | |
void | gmx::anonymous_namespace{cpuinfo.cpp}::setFeatureFromBit (std::set< CpuInfo::Feature > *featureSet, CpuInfo::Feature feature, unsigned int registerValue, unsigned char bit) |
Simple utility function to set/clear feature in a set. More... | |
void | gmx::anonymous_namespace{cpuinfo.cpp}::detectX86Features (std::string *brand, int *family, int *model, int *stepping, std::set< CpuInfo::Feature > *features) |
Process x86 cpuinfo features that are common to Intel and AMD CPUs. More... | |
std::vector< ApicInfo > | gmx::anonymous_namespace{cpuinfo.cpp}::detectX86ApicInfo (bool gmx_unused haveX2Apic) |
Return a vector with x86 APIC info for all processing units. More... | |
ApicIdLayout | gmx::anonymous_namespace{cpuinfo.cpp}::detectX2ApicIdLayout () |
Detect the APIC ID layout for x2APIC. | |
ApicIdLayout | gmx::anonymous_namespace{cpuinfo.cpp}::detectAmdApicIdLayout (unsigned int maxExtLevel) |
Detect the APIC ID layout for standard APIC or xAPIC on AMD. More... | |
std::vector < CpuInfo::LogicalProcessor > | gmx::anonymous_namespace{cpuinfo.cpp}::detectX86LogicalProcessors () |
Try to detect basic CPU topology information using x86 cpuid. More... | |
std::map< std::string, std::string > | gmx::anonymous_namespace{cpuinfo.cpp}::parseProcCpuInfo () |
Parse /proc/cpuinfo into a simple string map. More... | |
CpuInfo::Vendor | gmx::anonymous_namespace{cpuinfo.cpp}::detectProcCpuInfoVendor (const std::map< std::string, std::string > &cpuInfo) |
Try to detect vendor from /proc/cpuinfo. More... | |
void | gmx::anonymous_namespace{cpuinfo.cpp}::detectProcCpuInfoIbm (const std::map< std::string, std::string > &cpuInfo, std::string *brand, std::set< CpuInfo::Feature > *features) |
Detect IBM processor name and features from /proc/cpuinfo. More... | |
void | gmx::anonymous_namespace{cpuinfo.cpp}::detectProcCpuInfoArm (const std::map< std::string, std::string > &cpuInfo, std::string *brand, int *family, int *model, int *stepping, std::set< CpuInfo::Feature > *features) |
Detect ARM processor name and features from /proc/cpuinfo. More... | |
void | gmx::anonymous_namespace{cpuinfo.cpp}::detectProcCpuInfo (CpuInfo::Vendor *vendor, std::string *brand, int *family, int *model, int *stepping, std::set< CpuInfo::Feature > *features) |
Try to detect vendor, cpu and features from /proc/cpuinfo. More... | |
bool | gmx::cpuIsX86Nehalem (const CpuInfo &cpuInfo) |
Return true if the CPU is an Intel x86 Nehalem. More... | |
bool | gmx::cpuIsAmdZen1 (const CpuInfo &cpuInfo) |
Return true if the CPU is a first generation AMD Zen (produced by AMD or Hygon) More... | |