+/// HT_enabled() returns true if hyper-threading is enabled on current machine
+
+static bool HT_enabled() {
+
+ int CPUInfo[4] = {-1};
+ int nIds, nLogicalCPU, nCores;
+
+ // Detect CPU producer
+ __cpuid(CPUInfo, 0);
+ nIds = CPUInfo[0];
+
+ // Not an Intel CPU or CPUID.4 not supported
+ if (!((CPUInfo[1] == 'uneG') && (CPUInfo[3] == 'Ieni') && (CPUInfo[2] == 'letn')) || 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();
+}
+
+