windows下获取CPU核心数(仅参考不能直接使用)
This commit is contained in:
parent
99748deb93
commit
87313f9f78
158
cpp/common/win_getcpu_corenum.cpp
Normal file
158
cpp/common/win_getcpu_corenum.cpp
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
|
||||||
|
// LINK: https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformation?redirectedfrom=MSDN
|
||||||
|
typedef BOOL (WINAPI *LPFN_GLPI)(
|
||||||
|
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
|
||||||
|
PDWORD);
|
||||||
|
|
||||||
|
|
||||||
|
// Helper function to count set bits in the processor mask.
|
||||||
|
DWORD CountSetBits(ULONG_PTR bitMask)
|
||||||
|
{
|
||||||
|
DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1;
|
||||||
|
DWORD bitSetCount = 0;
|
||||||
|
ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
for (i = 0; i <= LSHIFT; ++i)
|
||||||
|
{
|
||||||
|
bitSetCount += ((bitMask & bitTest)?1:0);
|
||||||
|
bitTest/=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bitSetCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _cdecl _tmain ()
|
||||||
|
{
|
||||||
|
LPFN_GLPI glpi;
|
||||||
|
BOOL done = FALSE;
|
||||||
|
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
|
||||||
|
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
|
||||||
|
DWORD returnLength = 0;
|
||||||
|
DWORD logicalProcessorCount = 0;
|
||||||
|
DWORD numaNodeCount = 0;
|
||||||
|
DWORD processorCoreCount = 0;
|
||||||
|
DWORD processorL1CacheCount = 0;
|
||||||
|
DWORD processorL2CacheCount = 0;
|
||||||
|
DWORD processorL3CacheCount = 0;
|
||||||
|
DWORD processorPackageCount = 0;
|
||||||
|
DWORD byteOffset = 0;
|
||||||
|
PCACHE_DESCRIPTOR Cache;
|
||||||
|
|
||||||
|
glpi = (LPFN_GLPI) GetProcAddress(
|
||||||
|
GetModuleHandle(TEXT("kernel32")),
|
||||||
|
"GetLogicalProcessorInformation");
|
||||||
|
if (NULL == glpi)
|
||||||
|
{
|
||||||
|
_tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n"));
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!done)
|
||||||
|
{
|
||||||
|
DWORD rc = glpi(buffer, &returnLength);
|
||||||
|
|
||||||
|
if (FALSE == rc)
|
||||||
|
{
|
||||||
|
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
{
|
||||||
|
if (buffer)
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
|
||||||
|
returnLength);
|
||||||
|
|
||||||
|
if (NULL == buffer)
|
||||||
|
{
|
||||||
|
_tprintf(TEXT("\nError: Allocation failure\n"));
|
||||||
|
return (2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_tprintf(TEXT("\nError %d\n"), GetLastError());
|
||||||
|
return (3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
done = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = buffer;
|
||||||
|
|
||||||
|
while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength)
|
||||||
|
{
|
||||||
|
switch (ptr->Relationship)
|
||||||
|
{
|
||||||
|
case RelationNumaNode:
|
||||||
|
// Non-NUMA systems report a single record of this type.
|
||||||
|
numaNodeCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelationProcessorCore:
|
||||||
|
processorCoreCount++;
|
||||||
|
|
||||||
|
// A hyperthreaded core supplies more than one logical processor.
|
||||||
|
logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelationCache:
|
||||||
|
// Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache.
|
||||||
|
Cache = &ptr->Cache;
|
||||||
|
if (Cache->Level == 1)
|
||||||
|
{
|
||||||
|
processorL1CacheCount++;
|
||||||
|
}
|
||||||
|
else if (Cache->Level == 2)
|
||||||
|
{
|
||||||
|
processorL2CacheCount++;
|
||||||
|
}
|
||||||
|
else if (Cache->Level == 3)
|
||||||
|
{
|
||||||
|
processorL3CacheCount++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RelationProcessorPackage:
|
||||||
|
// Logical processors share a physical package.
|
||||||
|
processorPackageCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
_tprintf(TEXT("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(TEXT("\nGetLogicalProcessorInformation results:\n"));
|
||||||
|
_tprintf(TEXT("Number of NUMA nodes: %d\n"),
|
||||||
|
numaNodeCount);
|
||||||
|
_tprintf(TEXT("Number of physical processor packages: %d\n"),
|
||||||
|
processorPackageCount);
|
||||||
|
_tprintf(TEXT("Number of processor cores: %d\n"),
|
||||||
|
processorCoreCount);
|
||||||
|
_tprintf(TEXT("Number of logical processors: %d\n"),
|
||||||
|
logicalProcessorCount);
|
||||||
|
_tprintf(TEXT("Number of processor L1/L2/L3 caches: %d/%d/%d\n"),
|
||||||
|
processorL1CacheCount,
|
||||||
|
processorL2CacheCount,
|
||||||
|
processorL3CacheCount);
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SYSTEM_INFO sysInfo;
|
||||||
|
GetSystemInfo(&sysInfo);
|
||||||
|
int numCores = sysInfo.dwNumberOfProcessors;
|
||||||
|
int numPhysicalCores = GetActiveProcessorCount(ALL_PROCESSOR_GROUPS);
|
||||||
|
std::cout << "Number of CPU cores: " << numCores << std::endl;
|
Loading…
x
Reference in New Issue
Block a user