Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
            }
        }