프로세서 코어수를 알아내는 방법
GetLogicalProcessorInformation() 함수를 이용
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <tchar.h>
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 getProcessorNumber(int *core, int *logical){
typedef BOOL (WINAPI *LPFN_GLPI)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);
LPFN_GLPI glpi;
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;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
*core = *logical = 0;
glpi = (LPFN_GLPI) GetProcAddress( GetModuleHandle("kernel32"),"GetLogicalProcessorInformation");
if (NULL == glpi) {
printf("\nGetLogicalProcessorInformation is not supported.\n");
return (0);
}
DWORD rc = glpi(buffer, &returnLength);
if (FALSE == rc) {
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
if (buffer)
free(buffer);
buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(returnLength);
}
rc = glpi(buffer, &returnLength);
}
if (FALSE == rc) {
printf("\nError: GetLogicalProcessorInformation() returned false\n");
return (0);
}
ptr = buffer;
while( byteOffset < returnLength ){
switch (ptr->Relationship)
{
case RelationNumaNode:
numaNodeCount++;
break;
case RelationProcessorCore:
processorCoreCount++;
logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
break;
case RelationCache:
Cache = &ptr->Cache;
if (Cache->Level == 1) {
processorL1CacheCount++;
}
else if (Cache->Level == 2) {
processorL2CacheCount++;
}
else if (Cache->Level == 3) {
processorL3CacheCount++;
}
break;
case RelationProcessorPackage:
processorPackageCount++;
break;
default:
tprintf("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n");
break;
}
byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
ptr++;
}
free(buffer);
*core = processorCoreCount;
*logical = logicalProcessorCount;
return 1;
}
int main ()
{
int core, logical;
getProcessorNumber(&core, &logical);
printf("Processor Core : %d\n", core);
printf("Logical Processor : %d\n", logical);
return 0;
}
소스파일
실행 결과
참고자료
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686694(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms683194%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx