프로세서 코어수를 알아내는 방법
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
'windows' 카테고리의 다른 글
_CrtIsValidHeapPointer() 관련 오류 발생시 해결방법 (0) | 2011.11.01 |
---|---|
컴파일 옵션 종류 (0) | 2011.10.31 |