public static int GetLogicalCoreCount(this LogicalProcessorInfo processorInfo) { ulong procMask = 0; foreach (LogicalProcessorCoreInfo coreInfo in processorInfo.Cores) { procMask |= coreInfo.ProcessorMask; } int coreCount = UInt64Util.CountBits(procMask); Debug.Assert(coreCount == Environment.ProcessorCount); return(coreCount); }
public static int GetPhysicalCoreCount(this LogicalProcessorInfo processorInfo) { int coreCount = 0; foreach (LogicalProcessorCoreInfo coreInfo in processorInfo.Cores) { if (coreInfo.SharesFunctionalUnits) { ++coreCount; } else { int coreProcessorCount = UInt64Util.CountBits(coreInfo.ProcessorMask); coreCount += coreProcessorCount; } } return(coreCount); }
public static unsafe LogicalProcessorInfo GetLogicalProcessorInformation() { int returnLength = 0; bool bResult = NativeMethods.GetLogicalProcessorInformation(null, ref returnLength); if (!bResult && returnLength == 0) { NativeUtilities.ThrowOnWin32Error("GetLogicalProcessorInformation() returned false"); } using (SafeCoTaskMemAllocHandle buffer = SafeCoTaskMemAllocHandle.Alloc((int)returnLength)) { NativeStructs.SYSTEM_LOGICAL_PROCESSOR_INFORMATION *pBuffer = (NativeStructs.SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)buffer.Address; bResult = NativeMethods.GetLogicalProcessorInformation(pBuffer, ref returnLength); int elementSize = sizeof(NativeStructs.SYSTEM_LOGICAL_PROCESSOR_INFORMATION); int count = returnLength / elementSize; int coresCount = 0; int cachesCount = 0; int numaNodesCount = 0; int packagesCount = 0; for (int i = 0; i < count; ++i) { switch (pBuffer[i].Relationship) { case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationCache: ++cachesCount; break; case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationNumaNode: ++numaNodesCount; break; case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorCore: ++coresCount; break; case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorPackage: ++packagesCount; break; default: // don't count it break; } } LogicalProcessorCoreInfo[] cores = new LogicalProcessorCoreInfo[coresCount]; LogicalProcessorCacheInfo[] caches = new LogicalProcessorCacheInfo[cachesCount]; LogicalProcessorNumaNodeInfo[] numaNodes = new LogicalProcessorNumaNodeInfo[numaNodesCount]; LogicalProcessorPackageInfo[] packages = new LogicalProcessorPackageInfo[packagesCount]; int coresIndex = 0; int cachesIndex = 0; int numaNodesIndex = 0; int packagesIndex = 0; for (int i = 0; i < count; ++i) { ulong processorMask = pBuffer[i].ProcessorMask.ToUInt64(); switch (pBuffer[i].Relationship) { case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationCache: NativeStructs.CACHE_DESCRIPTOR cacheDescriptor = pBuffer[i].Cache; LogicalProcessorCacheInfo cacheInfo = new LogicalProcessorCacheInfo(processorMask, cacheDescriptor.Level, cacheDescriptor.Associativity, cacheDescriptor.LineSize, cacheDescriptor.Size); caches[cachesIndex] = cacheInfo; ++cachesIndex; break; case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationNumaNode: LogicalProcessorNumaNodeInfo numaNodeInfo = new LogicalProcessorNumaNodeInfo(processorMask, pBuffer[i].NumaNode_NodeNumber); numaNodes[numaNodesIndex] = numaNodeInfo; ++numaNodesIndex; break; case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorCore: bool sharesFunctionalUnits = (pBuffer[i].ProcessorCore_Flags == 1); LogicalProcessorCoreInfo coreInfo = new LogicalProcessorCoreInfo(processorMask, sharesFunctionalUnits); cores[coresIndex] = coreInfo; ++coresIndex; break; case NativeEnums.LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorPackage: LogicalProcessorPackageInfo packageInfo = new LogicalProcessorPackageInfo(processorMask); packages[packagesIndex] = packageInfo; ++packagesIndex; break; default: break; } } LogicalProcessorInfo info = new LogicalProcessorInfo(cores, caches, numaNodes, packages); return(info); } }