diff --git a/inc/hgl/platform/CpuInfo.h b/inc/hgl/platform/CpuInfo.h new file mode 100644 index 0000000..ea1629a --- /dev/null +++ b/inc/hgl/platform/CpuInfo.h @@ -0,0 +1,25 @@ +#ifndef HGL_PLATFORM_CPU_INFO_INCLUDE +#define HGL_PLATFORM_CPU_INFO_INCLUDE + +#include +namespace hgl +{ + enum class CpuArch + { + x86_64, + ARMv8, + };// + + struct CpuInfo + { + uint cpu_count; ///<处理器数量 + uint core_count; ///<处理器核心数量 + uint logical_core_count; ///<逻辑处理器核心数量 + };//struct CpuInfo + + /** + * 取得CPU信息 + */ + bool GetCpuInfo(CpuInfo *); +}//namespace hgl +#endif//HGL_PLATFORM_CPU_INFO_INCLUDE diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 899e15b..e54108e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,6 @@ -IF(UNIX) +SET(CPU_INFO_HEADER ${CMPLATFORM_ROOT_INCLUDE_PATH}/hgl/platform/CpuInfo.h) + +IF(UNIX) SET(PLATFORM_FILE_SOURCE UNIX/File.cpp UNIX/FileAccess.cpp UNIX/EnumFile.cpp) @@ -63,6 +65,8 @@ ENDIF() IF(WIN32) + set(CPU_INFO_SOURCE Win/CpuInfo.cpp) + SET(PLATFORM_FILE_SOURCE Win/File.cpp Win/FileAccess.cpp Win/EnumFile.cpp @@ -114,6 +118,8 @@ SOURCE_GROUP("Time" FILES ${PLATFORM_TIME_SOURCE}) SOURCE_GROUP("Desktop" FILES ${PLATFORM_DESKTOP_SOURCE}) SOURCE_GROUP("Window" FILES ${PLATFORM_WINDOW_SOURCE}) +SOURCE_GROUP("Hardware\\Cpuinfo" FILES ${CPU_INFO_HEADER} ${CPU_INFO_SOURCE}) + SET(PLATFORM_SOURCE ${PLATFORM_SOURCE} ${PLATFORM_FILE_SOURCE} ${PLATFORM_CODEPAGE_SOURCE} @@ -126,6 +132,9 @@ SET(PLATFORM_SOURCE ${PLATFORM_SOURCE} ${PLATFORM_EXTERNAL_MODULE_SOURCE} ${PLATFORM_INPUT_DEVICE_SOURCE} ${PLATFORM_WINDOW_SOURCE} + + ${CPU_INFO_HEADER} + ${CPU_INFO_SOURCE} ) add_cm_library(CMPlatform "CM" ${PLATFORM_SOURCE}) diff --git a/src/Win/CpuInfo.cpp b/src/Win/CpuInfo.cpp new file mode 100644 index 0000000..6dd5e23 --- /dev/null +++ b/src/Win/CpuInfo.cpp @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include + +namespace hgl +{ + namespace + { + 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; + } + }//namespace + + bool GetCpuInfo(CpuInfo *ci) + { + if(!ci)return(false); + + AutoFree buf; + DWORD length=0; + + GetLogicalProcessorInformationEx(RelationAll,nullptr,&length); + + if(GetLastError()!=ERROR_INSUFFICIENT_BUFFER) + return(false); + + buf=(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *)malloc(length); + + if(!GetLogicalProcessorInformationEx(RelationAll,buf,&length)) + return(false); + + char *sp=(char *)(buf.data()); + SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *p; + + memset(ci,0,sizeof(CpuInfo)); + + while(length>0) + { + p=(SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *)sp; + + if(p->Relationship==RelationProcessorPackage) + ++ci->cpu_count; + else + if(p->Relationship==RelationProcessorCore) + { + ++ci->core_count; + + ci->logical_core_count+=CountSetBits(p->Processor.GroupMask[0].Mask); + } + + sp+=p->Size; + length-=p->Size; + } + + return(true); + } +}//namespace hgl