Поделиться через


Функция GetLogicalProcessorInformation (sysinfoapi.h)

Извлекает сведения о логических процессорах и связанном оборудовании.

Чтобы получить сведения о логических процессорах и связанном оборудовании, включая группы процессоров, используйте функцию GetLogicalProcessorInformationEx .

Синтаксис

BOOL GetLogicalProcessorInformation(
  [out]     PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
  [in, out] PDWORD                                ReturnedLength
);

Параметры

[out] Buffer

Указатель на буфер, получающий массив SYSTEM_LOGICAL_PROCESSOR_INFORMATION структур. Если функция завершается сбоем, содержимое этого буфера не определено.

[in, out] ReturnedLength

На входных данных указывает длину буфера, на который указывает buffer, в байтах. Если буфер достаточно велик, чтобы содержать все данные, эта функция выполняется успешно, и для параметра ReturnLength задано количество возвращаемых байтов. Если буфер недостаточно велик, чтобы вместить все данные, функция завершается ошибкой, GetLastError возвращает ERROR_INSUFFICIENT_BUFFER, а returnLength имеет длину буфера, необходимую для хранения всех данных. Если функция завершается ошибкой, отличной от ERROR_INSUFFICIENT_BUFFER, значение ReturnLength не определено.

Возвращаемое значение

Если функция выполнена успешно, возвращается значение TRUE, а в выходной буфер записывается по крайней мере одна структура SYSTEM_LOGICAL_PROCESSOR_INFORMATION .

Если функция завершается сбоем, возвращается значение FALSE. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

GetLogicalProcessorInformation можно использовать для получения сведений о связи между логическими процессорами в системе, в том числе:

  • Логические процессоры, которые являются частью узла NUMA .
  • Логические процессоры, которые совместно используют ресурсы. Примером такого общего доступа к ресурсам могут быть сценарии гиперпоточности.
Приложение может использовать эти сведения при сопоставлении потоков и процессов, чтобы наилучшим образом использовать свойства оборудования платформы или определить количество логических и физических процессоров в целях лицензирования.

Каждая из SYSTEM_LOGICAL_PROCESSOR_INFORMATION структур, возвращаемых в буфере, содержит следующее:

  • Маска сходства логических процессоров, которая указывает логические процессоры, к которым применяется информация в структуре.
  • Маска логического процессора типа LOGICAL_PROCESSOR_RELATIONSHIP, которая указывает на связь между логическими процессорами в маске. Приложения, вызывающие эту функцию, должны быть подготовлены к обработке дополнительных значений индикаторов в будущем.
Обратите внимание, что порядок, в котором структуры возвращаются в буфере, может изменяться между вызовами этой функции.

Размер структуры SYSTEM_LOGICAL_PROCESSOR_INFORMATION зависит от архитектуры процессора и версий Windows. По этой причине приложения должны сначала вызвать эту функцию, чтобы получить необходимый размер буфера, а затем динамически выделить память для буфера.

В системах с более чем 64 логическими процессорами функция GetLogicalProcessorInformation извлекает сведения о логическом процессоре в группе процессоров , которой в настоящее время назначен вызывающий поток. Используйте функцию GetLogicalProcessorInformationEx для получения сведений о процессорах во всех группах процессоров в системе.

Примечание

Начиная с выпуска TBD, поведение этой и других функций NUMA было изменено для улучшения поддержки систем с узлами, содержащими более 64 процессоров. Дополнительные сведения об этом изменении, включая сведения о включении старого поведения этого API, см. в разделе Поддержка NUMA.

Поведение, начиная с выпуска tbd iron

Структуры связей для RelationNumaNode содержат маску сходства для сходства узла в группе вызывающего потока.

Примеры

В следующем примере C++ используется функция GetLogicalProcessorInformation для отображения сведений о процессорах в текущей системе. Так как GetLogicalProcessorInformation присутствует не во всех системах, в этом примере используется функция GetProcAddress вместо вызова GetLogicalProcessorInformation напрямую.

В этом примере сообщается количество активных ядер процессора. В этом примере также сообщается количество узлов NUMA, физических пакетов и кэшей в системах, поддерживающих эти сведения. Дополнительные сведения см. в описании элемента Relationship структуры SYSTEM_LOGICAL_PROCESSOR_INFORMATION . Windows Server 2003, Windows XP Professional x64 Edition и Windows XP с пакетом обновления 3 (SP3): В этом примере отображается количество физических процессоров, а не количество активных процессорных ядер.


#include <windows.h>
#include <malloc.h>    
#include <stdio.h>
#include <tchar.h>

typedef BOOL (WINAPI *LPFN_GLPI)(
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, 
    PDWORD);


// Helper function to count set bits in the processor mask.
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 _cdecl _tmain ()
{
    LPFN_GLPI glpi;
    BOOL done = FALSE;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
    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;

    glpi = (LPFN_GLPI) GetProcAddress(
                            GetModuleHandle(TEXT("kernel32")),
                            "GetLogicalProcessorInformation");
    if (NULL == glpi) 
    {
        _tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n"));
        return (1);
    }

    while (!done)
    {
        DWORD rc = glpi(buffer, &returnLength);

        if (FALSE == rc) 
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
            {
                if (buffer) 
                    free(buffer);

                buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
                        returnLength);

                if (NULL == buffer) 
                {
                    _tprintf(TEXT("\nError: Allocation failure\n"));
                    return (2);
                }
            } 
            else 
            {
                _tprintf(TEXT("\nError %d\n"), GetLastError());
                return (3);
            }
        } 
        else
        {
            done = TRUE;
        }
    }

    ptr = buffer;

    while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) 
    {
        switch (ptr->Relationship) 
        {
        case RelationNumaNode:
            // Non-NUMA systems report a single record of this type.
            numaNodeCount++;
            break;

        case RelationProcessorCore:
            processorCoreCount++;

            // A hyperthreaded core supplies more than one logical processor.
            logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
            break;

        case RelationCache:
            // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache. 
            Cache = &ptr->Cache;
            if (Cache->Level == 1)
            {
                processorL1CacheCount++;
            }
            else if (Cache->Level == 2)
            {
                processorL2CacheCount++;
            }
            else if (Cache->Level == 3)
            {
                processorL3CacheCount++;
            }
            break;

        case RelationProcessorPackage:
            // Logical processors share a physical package.
            processorPackageCount++;
            break;

        default:
            _tprintf(TEXT("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n"));
            break;
        }
        byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
        ptr++;
    }

    _tprintf(TEXT("\nGetLogicalProcessorInformation results:\n"));
    _tprintf(TEXT("Number of NUMA nodes: %d\n"), 
             numaNodeCount);
    _tprintf(TEXT("Number of physical processor packages: %d\n"), 
             processorPackageCount);
    _tprintf(TEXT("Number of processor cores: %d\n"), 
             processorCoreCount);
    _tprintf(TEXT("Number of logical processors: %d\n"), 
             logicalProcessorCount);
    _tprintf(TEXT("Number of processor L1/L2/L3 caches: %d/%d/%d\n"), 
             processorL1CacheCount,
             processorL2CacheCount,
             processorL3CacheCount);
    
    free(buffer);

    return 0;
}


Требования

Требование Значение
Минимальная версия клиента Windows Vista, Windows XP Professional x64 Edition, Windows XP с пакетом обновления 3 (SP3) [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header sysinfoapi.h
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

GetLogicalProcessorInformationEx

LOGICAL_PROCESSOR_RELATIONSHIP

Функции процессов и потоков

SYSTEM_LOGICAL_PROCESSOR_INFORMATION