mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Add hyper-threading detection
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
92bada1a32
commit
c853b87c08
1 changed files with 52 additions and 5 deletions
57
src/misc.cpp
57
src/misc.cpp
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -182,16 +183,17 @@ int get_system_time() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// cpu_count() tries to detect the number of CPU cores.
|
/// builtin_cpu_count() tries to detect the number of CPU cores, if
|
||||||
|
/// hyper-threading is enabled this is the number of logical processors.
|
||||||
|
|
||||||
#if !defined(_MSC_VER)
|
#if !defined(_MSC_VER)
|
||||||
|
|
||||||
# if defined(_SC_NPROCESSORS_ONLN)
|
# if defined(_SC_NPROCESSORS_ONLN)
|
||||||
int cpu_count() {
|
static int builtin_cpu_count() {
|
||||||
return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
|
return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
|
||||||
}
|
}
|
||||||
# elif defined(__hpux)
|
# elif defined(__hpux)
|
||||||
int cpu_count() {
|
static int builtin_cpu_count() {
|
||||||
struct pst_dynamic psd;
|
struct pst_dynamic psd;
|
||||||
if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) == -1)
|
if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) == -1)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -199,14 +201,14 @@ int cpu_count() {
|
||||||
return Min(psd.psd_proc_cnt, 8);
|
return Min(psd.psd_proc_cnt, 8);
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
int cpu_count() {
|
static int builtin_cpu_count() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int cpu_count() {
|
static int builtin_cpu_count() {
|
||||||
SYSTEM_INFO s;
|
SYSTEM_INFO s;
|
||||||
GetSystemInfo(&s);
|
GetSystemInfo(&s);
|
||||||
return Min(s.dwNumberOfProcessors, 8);
|
return Min(s.dwNumberOfProcessors, 8);
|
||||||
|
@ -215,6 +217,51 @@ int cpu_count() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/// HT_enabled() returns true if hyper-threading is enabled on current machine
|
||||||
|
|
||||||
|
static bool HT_enabled() {
|
||||||
|
|
||||||
|
char CPUString[0x20];
|
||||||
|
int CPUInfo[4] = {-1};
|
||||||
|
int nIds, nLogicalCPU, nCores;
|
||||||
|
|
||||||
|
// Detect CPU producer
|
||||||
|
__cpuid(CPUInfo, 0);
|
||||||
|
nIds = CPUInfo[0];
|
||||||
|
|
||||||
|
memset(CPUString, 0, sizeof(CPUString));
|
||||||
|
*((int*)(CPUString+0)) = CPUInfo[1];
|
||||||
|
*((int*)(CPUString+4)) = CPUInfo[3];
|
||||||
|
*((int*)(CPUString+8)) = CPUInfo[2];
|
||||||
|
|
||||||
|
// Not an Intel CPU or CPUID.4 not supported
|
||||||
|
if (strcmp(CPUString, "GenuineIntel") || nIds < 4)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Detect if HT Technology is supported
|
||||||
|
__cpuid(CPUInfo, 1);
|
||||||
|
if (!((CPUInfo[3] >> 28) & 1))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nLogicalCPU = (CPUInfo[1] >> 16) & 0xFF;
|
||||||
|
|
||||||
|
// Detect number of cores
|
||||||
|
__cpuid(CPUInfo, 4);
|
||||||
|
nCores = 1 + ((CPUInfo[0] >> 26) & 0x3F);
|
||||||
|
|
||||||
|
return nLogicalCPU > nCores;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// cpu_count() tries to detect the number of physical CPU cores taking
|
||||||
|
/// in account hyper-threading.
|
||||||
|
|
||||||
|
int cpu_count() {
|
||||||
|
|
||||||
|
return HT_enabled() ? builtin_cpu_count() / 2 : builtin_cpu_count();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
From Beowulf, from Olithink
|
From Beowulf, from Olithink
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue