Hyper-Threading - Intel (SMT). AMD SMT ( Bulldozer - , AMD , Zen SMT). OpenMP SMT.
Hyper-Threading, , - Intel, AMD. .
OpenMP, Intel, .
Intel ( Intel, ). , . GCC
export OMP_PROC_BIND=true ( ).
, , VirtualBox. VirtualBox /8 Core Windows Linux VM 4 , 2 /proc/cpuinfo , .
#include <stdio.h>
static inline void cpuid (int output[4], int functionnumber) {
#if defined (_MSC_VER) || defined (__INTEL_COMPILER)
__cpuidex(output, functionnumber, 0);
#elif defined(__GNUC__) || defined(__clang__)
int a, b, c, d;
__asm("cpuid" : "=a"(a),"=b"(b),"=c"(c),"=d"(d) : "a"(functionnumber),"c"(0) : );
output[0] = a;
output[1] = b;
output[2] = c;
output[3] = d;
#else
__asm {
mov eax, functionnumber
xor ecx, ecx
cpuid;
mov esi, output
mov [esi], eax
mov [esi+4], ebx
mov [esi+8], ecx
mov [esi+12], edx
}
#endif
}
int getNumCores(void) {
int cores = 0;
#pragma omp parallel reduction(+:cores)
{
int regs[4];
cpuid(regs,11);
if(!(regs[3]&1)) cores++;
}
return cores;
}
int main(void) {
printf("cores %d\n", getNumCores());
}