@@ -144,21 +144,31 @@ static String getAllSystemInfo() | |||||
systemInfo | systemInfo | ||||
<< "Number of logical CPUs: " << SystemStats::getNumCpus() << newLine | << "Number of logical CPUs: " << SystemStats::getNumCpus() << newLine | ||||
<< "Number of physical CPUs: " << SystemStats::getNumPhysicalCpus() << newLine | << "Number of physical CPUs: " << SystemStats::getNumPhysicalCpus() << newLine | ||||
<< "Memory size: " << SystemStats::getMemorySizeInMegabytes() << " MB" << newLine | |||||
<< "CPU vendor: " << SystemStats::getCpuVendor() << newLine | |||||
<< "CPU model: " << SystemStats::getCpuModel() << newLine | |||||
<< "CPU speed: " << SystemStats::getCpuSpeedInMegahertz() << " MHz" << newLine | |||||
<< "CPU has MMX: " << (SystemStats::hasMMX() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE: " << (SystemStats::hasSSE() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE2: " << (SystemStats::hasSSE2() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE3: " << (SystemStats::hasSSE3() ? "yes" : "no") << newLine | |||||
<< "CPU has SSSE3: " << (SystemStats::hasSSSE3() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE4.1: " << (SystemStats::hasSSE41() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE4.2: " << (SystemStats::hasSSE42() ? "yes" : "no") << newLine | |||||
<< "CPU has 3DNOW: " << (SystemStats::has3DNow() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX: " << (SystemStats::hasAVX() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX2: " << (SystemStats::hasAVX2() ? "yes" : "no") << newLine | |||||
<< "CPU has Neon: " << (SystemStats::hasNeon() ? "yes" : "no") << newLine | |||||
<< "Memory size: " << SystemStats::getMemorySizeInMegabytes() << " MB" << newLine | |||||
<< "CPU vendor: " << SystemStats::getCpuVendor() << newLine | |||||
<< "CPU model: " << SystemStats::getCpuModel() << newLine | |||||
<< "CPU speed: " << SystemStats::getCpuSpeedInMegahertz() << " MHz" << newLine | |||||
<< "CPU has MMX: " << (SystemStats::hasMMX() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE: " << (SystemStats::hasSSE() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE2: " << (SystemStats::hasSSE2() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE3: " << (SystemStats::hasSSE3() ? "yes" : "no") << newLine | |||||
<< "CPU has SSSE3: " << (SystemStats::hasSSSE3() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE4.1: " << (SystemStats::hasSSE41() ? "yes" : "no") << newLine | |||||
<< "CPU has SSE4.2: " << (SystemStats::hasSSE42() ? "yes" : "no") << newLine | |||||
<< "CPU has 3DNOW: " << (SystemStats::has3DNow() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX: " << (SystemStats::hasAVX() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX2: " << (SystemStats::hasAVX2() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512F: " << (SystemStats::hasAVX512F() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512BW: " << (SystemStats::hasAVX512BW() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512CD: " << (SystemStats::hasAVX512CD() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512DQ: " << (SystemStats::hasAVX512DQ() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512ER: " << (SystemStats::hasAVX512ER() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512IFMA: " << (SystemStats::hasAVX512IFMA() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512PF: " << (SystemStats::hasAVX512PF() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512VBMI: " << (SystemStats::hasAVX512VBMI() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512VL: " << (SystemStats::hasAVX512VL() ? "yes" : "no") << newLine | |||||
<< "CPU has AVX512VPOPCNTDQ: " << (SystemStats::hasAVX512VPOPCNTDQ() ? "yes" : "no") << newLine | |||||
<< "CPU has Neon: " << (SystemStats::hasNeon() ? "yes" : "no") << newLine | |||||
<< newLine; | << newLine; | ||||
systemInfo | systemInfo | ||||
@@ -142,16 +142,26 @@ String SystemStats::getDisplayLanguage() { return getUserLanguage() + "-" + getU | |||||
void CPUInformation::initialise() noexcept | void CPUInformation::initialise() noexcept | ||||
{ | { | ||||
auto flags = getCpuInfo ("flags"); | auto flags = getCpuInfo ("flags"); | ||||
hasMMX = flags.contains ("mmx"); | |||||
hasSSE = flags.contains ("sse"); | |||||
hasSSE2 = flags.contains ("sse2"); | |||||
hasSSE3 = flags.contains ("sse3"); | |||||
has3DNow = flags.contains ("3dnow"); | |||||
hasSSSE3 = flags.contains ("ssse3"); | |||||
hasSSE41 = flags.contains ("sse4_1"); | |||||
hasSSE42 = flags.contains ("sse4_2"); | |||||
hasAVX = flags.contains ("avx"); | |||||
hasAVX2 = flags.contains ("avx2"); | |||||
hasMMX = flags.contains ("mmx"); | |||||
hasSSE = flags.contains ("sse"); | |||||
hasSSE2 = flags.contains ("sse2"); | |||||
hasSSE3 = flags.contains ("sse3"); | |||||
has3DNow = flags.contains ("3dnow"); | |||||
hasSSSE3 = flags.contains ("ssse3"); | |||||
hasSSE41 = flags.contains ("sse4_1"); | |||||
hasSSE42 = flags.contains ("sse4_2"); | |||||
hasAVX = flags.contains ("avx"); | |||||
hasAVX2 = flags.contains ("avx2"); | |||||
hasAVX512F = flags.contains ("avx512f"); | |||||
hasAVX512BW = flags.contains ("avx512bw"); | |||||
hasAVX512CD = flags.contains ("avx512cd"); | |||||
hasAVX512DQ = flags.contains ("avx512dq"); | |||||
hasAVX512ER = flags.contains ("avx512er"); | |||||
hasAVX512IFMA = flags.contains ("avx512ifma"); | |||||
hasAVX512PF = flags.contains ("avx512pf"); | |||||
hasAVX512VBMI = flags.contains ("avx512vbmi"); | |||||
hasAVX512VL = flags.contains ("avx512vl"); | |||||
hasAVX512VPOPCNTDQ = flags.contains ("avx512_vpopcntdq"); | |||||
numLogicalCPUs = getCpuInfo ("processor").getIntValue() + 1; | numLogicalCPUs = getCpuInfo ("processor").getIntValue() + 1; | ||||
@@ -86,7 +86,17 @@ void CPUInformation::initialise() noexcept | |||||
hasAVX = (c & (1u << 28)) != 0; | hasAVX = (c & (1u << 28)) != 0; | ||||
SystemStatsHelpers::doCPUID (a, b, c, d, 7); | SystemStatsHelpers::doCPUID (a, b, c, d, 7); | ||||
hasAVX2 = (b & (1u << 5)) != 0; | |||||
hasAVX2 = (b & (1u << 5)) != 0; | |||||
hasAVX512F = (b & (1u << 16)) != 0; | |||||
hasAVX512DQ = (b & (1u << 17)) != 0; | |||||
hasAVX512IFMA = (b & (1u << 21)) != 0; | |||||
hasAVX512PF = (b & (1u << 26)) != 0; | |||||
hasAVX512ER = (b & (1u << 27)) != 0; | |||||
hasAVX512CD = (b & (1u << 28)) != 0; | |||||
hasAVX512BW = (b & (1u << 30)) != 0; | |||||
hasAVX512VL = (b & (1u << 31)) != 0; | |||||
hasAVX512VBMI = (c & (1u << 1)) != 0; | |||||
hasAVX512VPOPCNTDQ = (c & (1u << 14)) != 0; | |||||
#endif | #endif | ||||
numLogicalCPUs = (int) [[NSProcessInfo processInfo] activeProcessorCount]; | numLogicalCPUs = (int) [[NSProcessInfo processInfo] activeProcessorCount]; | ||||
@@ -151,7 +151,17 @@ void CPUInformation::initialise() noexcept | |||||
callCPUID (info, 7); | callCPUID (info, 7); | ||||
hasAVX2 = (info[1] & (1 << 5)) != 0; | |||||
hasAVX2 = (info[1] & (1 << 5)) != 0; | |||||
hasAVX512F = (info[1] & (1u << 16)) != 0; | |||||
hasAVX512DQ = (info[1] & (1u << 17)) != 0; | |||||
hasAVX512IFMA = (info[1] & (1u << 21)) != 0; | |||||
hasAVX512PF = (info[1] & (1u << 26)) != 0; | |||||
hasAVX512ER = (info[1] & (1u << 27)) != 0; | |||||
hasAVX512CD = (info[1] & (1u << 28)) != 0; | |||||
hasAVX512BW = (info[1] & (1u << 30)) != 0; | |||||
hasAVX512VL = (info[1] & (1u << 31)) != 0; | |||||
hasAVX512VBMI = (info[2] & (1u << 1)) != 0; | |||||
hasAVX512VPOPCNTDQ = (info[2] & (1u << 14)) != 0; | |||||
SYSTEM_INFO systemInfo; | SYSTEM_INFO systemInfo; | ||||
GetNativeSystemInfo (&systemInfo); | GetNativeSystemInfo (&systemInfo); | ||||
@@ -90,9 +90,14 @@ struct CPUInformation | |||||
int numLogicalCPUs = 0, numPhysicalCPUs = 0; | int numLogicalCPUs = 0, numPhysicalCPUs = 0; | ||||
bool hasMMX = false, hasSSE = false, hasSSE2 = false, hasSSE3 = false, | |||||
has3DNow = false, hasSSSE3 = false, hasSSE41 = false, | |||||
hasSSE42 = false, hasAVX = false, hasAVX2 = false, hasNeon = false; | |||||
bool hasMMX = false, hasSSE = false, hasSSE2 = false, hasSSE3 = false, | |||||
has3DNow = false, hasSSSE3 = false, hasSSE41 = false, | |||||
hasSSE42 = false, hasAVX = false, hasAVX2 = false, | |||||
hasAVX512F = false, hasAVX512BW = false, hasAVX512CD = false, | |||||
hasAVX512DQ = false, hasAVX512ER = false, hasAVX512IFMA = false, | |||||
hasAVX512PF = false, hasAVX512VBMI = false, hasAVX512VL = false, | |||||
hasAVX512VPOPCNTDQ = false, | |||||
hasNeon = false; | |||||
}; | }; | ||||
static const CPUInformation& getCPUInformation() noexcept | static const CPUInformation& getCPUInformation() noexcept | ||||
@@ -113,6 +118,16 @@ bool SystemStats::hasSSE41() noexcept { return getCPUInformation().has | |||||
bool SystemStats::hasSSE42() noexcept { return getCPUInformation().hasSSE42; } | bool SystemStats::hasSSE42() noexcept { return getCPUInformation().hasSSE42; } | ||||
bool SystemStats::hasAVX() noexcept { return getCPUInformation().hasAVX; } | bool SystemStats::hasAVX() noexcept { return getCPUInformation().hasAVX; } | ||||
bool SystemStats::hasAVX2() noexcept { return getCPUInformation().hasAVX2; } | bool SystemStats::hasAVX2() noexcept { return getCPUInformation().hasAVX2; } | ||||
bool SystemStats::hasAVX512F() noexcept { return getCPUInformation().hasAVX512F; } | |||||
bool SystemStats::hasAVX512BW() noexcept { return getCPUInformation().hasAVX512BW; } | |||||
bool SystemStats::hasAVX512CD() noexcept { return getCPUInformation().hasAVX512CD; } | |||||
bool SystemStats::hasAVX512DQ() noexcept { return getCPUInformation().hasAVX512DQ; } | |||||
bool SystemStats::hasAVX512ER() noexcept { return getCPUInformation().hasAVX512ER; } | |||||
bool SystemStats::hasAVX512IFMA() noexcept { return getCPUInformation().hasAVX512IFMA; } | |||||
bool SystemStats::hasAVX512PF() noexcept { return getCPUInformation().hasAVX512PF; } | |||||
bool SystemStats::hasAVX512VBMI() noexcept { return getCPUInformation().hasAVX512VBMI; } | |||||
bool SystemStats::hasAVX512VL() noexcept { return getCPUInformation().hasAVX512VL; } | |||||
bool SystemStats::hasAVX512VPOPCNTDQ() noexcept { return getCPUInformation().hasAVX512VPOPCNTDQ; } | |||||
bool SystemStats::hasNeon() noexcept { return getCPUInformation().hasNeon; } | bool SystemStats::hasNeon() noexcept { return getCPUInformation().hasNeon; } | ||||
@@ -168,17 +168,27 @@ public: | |||||
*/ | */ | ||||
static String getCpuModel(); | static String getCpuModel(); | ||||
static bool hasMMX() noexcept; /**< Returns true if Intel MMX instructions are available. */ | |||||
static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */ | |||||
static bool hasSSE() noexcept; /**< Returns true if Intel SSE instructions are available. */ | |||||
static bool hasSSE2() noexcept; /**< Returns true if Intel SSE2 instructions are available. */ | |||||
static bool hasSSE3() noexcept; /**< Returns true if Intel SSE3 instructions are available. */ | |||||
static bool hasSSSE3() noexcept; /**< Returns true if Intel SSSE3 instructions are available. */ | |||||
static bool hasSSE41() noexcept; /**< Returns true if Intel SSE4.1 instructions are available. */ | |||||
static bool hasSSE42() noexcept; /**< Returns true if Intel SSE4.2 instructions are available. */ | |||||
static bool hasAVX() noexcept; /**< Returns true if Intel AVX instructions are available. */ | |||||
static bool hasAVX2() noexcept; /**< Returns true if Intel AVX2 instructions are available. */ | |||||
static bool hasNeon() noexcept; /**< Returns true if ARM NEON instructions are available. */ | |||||
static bool hasMMX() noexcept; /**< Returns true if Intel MMX instructions are available. */ | |||||
static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */ | |||||
static bool hasSSE() noexcept; /**< Returns true if Intel SSE instructions are available. */ | |||||
static bool hasSSE2() noexcept; /**< Returns true if Intel SSE2 instructions are available. */ | |||||
static bool hasSSE3() noexcept; /**< Returns true if Intel SSE3 instructions are available. */ | |||||
static bool hasSSSE3() noexcept; /**< Returns true if Intel SSSE3 instructions are available. */ | |||||
static bool hasSSE41() noexcept; /**< Returns true if Intel SSE4.1 instructions are available. */ | |||||
static bool hasSSE42() noexcept; /**< Returns true if Intel SSE4.2 instructions are available. */ | |||||
static bool hasAVX() noexcept; /**< Returns true if Intel AVX instructions are available. */ | |||||
static bool hasAVX2() noexcept; /**< Returns true if Intel AVX2 instructions are available. */ | |||||
static bool hasAVX512F() noexcept; /**< Returns true if Intel AVX-512 Foundation instructions are available. */ | |||||
static bool hasAVX512BW() noexcept; /**< Returns true if Intel AVX-512 Byte and Word instructions are available. */ | |||||
static bool hasAVX512CD() noexcept; /**< Returns true if Intel AVX-512 Conflict Detection instructions are available. */ | |||||
static bool hasAVX512DQ() noexcept; /**< Returns true if Intel AVX-512 Doubleword and Quadword instructions are available. */ | |||||
static bool hasAVX512ER() noexcept; /**< Returns true if Intel AVX-512 Exponential and Reciprocal instructions are available. */ | |||||
static bool hasAVX512IFMA() noexcept; /**< Returns true if Intel AVX-512 Integer Fused Multiply-Add instructions are available. */ | |||||
static bool hasAVX512PF() noexcept; /**< Returns true if Intel AVX-512 Prefetch instructions are available. */ | |||||
static bool hasAVX512VBMI() noexcept; /**< Returns true if Intel AVX-512 Vector Bit Manipulation instructions are available. */ | |||||
static bool hasAVX512VL() noexcept; /**< Returns true if Intel AVX-512 Vector Length instructions are available. */ | |||||
static bool hasAVX512VPOPCNTDQ() noexcept; /**< Returns true if Intel AVX-512 Vector Population Count Double and Quad-word instructions are available. */ | |||||
static bool hasNeon() noexcept; /**< Returns true if ARM NEON instructions are available. */ | |||||
//============================================================================== | //============================================================================== | ||||
/** Finds out how much RAM is in the machine. | /** Finds out how much RAM is in the machine. | ||||